Когда запрашивать наборы реплик для БД Mongo - PullRequest
3 голосов
/ 21 октября 2011

Одна вещь, которую я пытаюсь понять, это то, что при настройке нашей текущей конфигурации Mongo у нас есть два сервера с арбитром.

Теперь сначала я создал запись на ведущем устройстве;пошел к вторичному, затем попытался найти его, и я получал ошибки, которые были похожи на:

error: { "$err" : "not master and slaveok=false", "code" : 13435 }

После прочтения на веб-сайте Монго о Slave OK я обнаружил, что на вторичных серверах мне нужноустановить

rs.slaveOk();

Однако я не совсем понимаю, почему я делал бы это в PHP при запросах к серверам;или если я неправильно все понял.

По сути, у меня есть пул серверов, и я планировал подключиться к ним следующим образом:

$m = new Mongo("mongodb://localhost:27017", array("replicaSet" => "myReplSetName"));?>

Это будетподключиться к основному устройству ... однако тогда это не распределяет нагрузку чтения ... как я могу распределить нагрузку чтения так, чтобы она распределялась по обоим серверам и, таким образом, выполняла запросы быстрее?

Спасибо зазаранее

1 Ответ

10 голосов
/ 21 октября 2011

Это приемлемый способ подключения к набору реплик. Предполагая, что указанный сервер работает, соединение с драйвером обнаружит оставшиеся серверы в кластере и сможет направлять запросы к ним, когда это разрешено, и следовать обозначению «ОСНОВНОЕ» через события отработки отказа. Тем не менее, рекомендуется добавить другие серверы в этот «начальный список», чтобы соединение могло все же быть успешным, если один из «начальных» серверов не работает.

Что касается распределения чтений ... такое поведение на практике остается на усмотрение водителя. Но общепринятая семантика такова: если запрашивается чтение slaveOk, этот запрос чтения отправляется на ВТОРИЧНЫЙ сервер, если таковой имеется; только если ни один не доступен, он пойдет в ПЕРВИЧНЫЙ. Писать запросы, конечно же, всегда пойдет на ПЕРВИЧНЫЙ.

Одним из предложений для того, чтобы PRIMARY распределял часть нагрузки чтения, является рандомизация, когда вы помечаете запрос как slaveOk - см. Обсуждение здесь

Чтобы пометить запрос как slaveOk в PHP, вы можете установить этот бит на нескольких уровнях - соединение, база данных, коллекция или кластер - Сведения об API здесь Это дает несколько возможных способов реализации вышеупомянутого метод рандомизации - например, попытайтесь убедиться, что половина соединений в вашем пуле соединений имеет установленный бит slaveOk.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...