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 будет обрабатывать абстракцию с набором реплик.

Другие вопросы по тегам