MongoDB читать настройки Вторичный
Я только начинаю использовать MongoDB при тестировании его с YCSB, и у меня есть пара вопросов о предпочтениях чтения и его реализации.
Я настроил 1 Основной и 2 Вторичные узлы и установил предпочтения чтения на Java-клиенте YCSB следующим образом mongo.setReadPreference(ReadPreference.secondary());
1. Почему, если я указываю YCSB подключиться к первичному узлу, он все еще может выполнять операции чтения без генерации сообщения об ошибке? Также я проверил журналы и вижу, что Primary является узлом, который обслуживал эти запросы.
2 Как клиенты узнают о вторичных узлах в производственной среде? Куда вы подключаете клиентов по умолчанию? Все ли клиенты переходят на Primary, получают список Secondary и затем повторно подключаются к Secondary для выполнения чтения?
3 Просматривая исходный код, я обнаружил, что логика выбора соответствующей реплики на основе предпочтений выполняется в replica_set_monitor.cpp
Хотя мне еще не ясно, где этот код выполняется, на основном, вторичном или клиентском?
Спасибо
2 ответа
Когда приложение подключается к любому активному члену реплики, оно выдает внутренний тип rs.status()
который на самом деле isMaster
( http://docs.mongodb.org/meta-driver/latest/legacy/connect-driver-to-replica-set/) и кэширует ответ на этот запрос в течение определенного времени, пока не будет сочтено целесообразным обновить эту информацию, в факт в драйвере C++ даже говорит вам класс, который будет содержать кеш: http://api.mongodb.org/cxx/current/classmongo_1_1_replica_set_monitor.html
Содержит состояние о наборе реплик и предоставляет средства для обновления локального представления.
Существует несколько способов, которыми приложение может подключиться к набору, чтобы понять, наиболее распространенный способ - предоставить начальный список в строку подключения в коде приложения для драйвера, чтобы он мог подключиться к любому члену и задать вопрос: " Что здесь есть?
Когда ваше приложение подключается только к первичному, оно не узнает ни о каких вторичных. ReadPreference.secondary()
это просто предпочтение, а не мандат. Когда приложение не знает, что вторичный сервер существует, он будет читать с первичного.
Чтобы ваше приложение знало о вторичных серверах, вам нужно использовать класс DBClientReplicaSet
вместо DBClientConnection
который занимает std::vector
хостов в качестве аргумента конструктора. Этот массив должен включать всех членов набора.
Если вы предпочитаете, чтобы приложение не знало членов набора реплик, вы можете настроить кластер с разделением (который может состоять только из одного сегмента) и подключиться к маршрутизатору. Затем процесс Mongos будет обрабатывать абстракцию с набором реплик.