Когда запрашивать наборы реплик для Mongo DB

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

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

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

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

rs.slaveOk();

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

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

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

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

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


person Petrogad    schedule 21.10.2011    source источник
comment
Просто любопытно: вы используете Doctrine MongoDB и/или Symfony2?   -  person Adam Monsen    schedule 20.06.2012


Ответы (1)


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

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

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

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

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

person dampier    schedule 21.10.2011
comment
Обратите внимание, что у вас не должно быть арбитра в списке исходных данных, см. jira.mongodb.org/browse/ PHP-392. - person Adam Monsen; 22.06.2012