Странная вещь в драйвере mongodb-erlang при использовании набора реплик
Мой код такой:
Replset = {<<"rs1">>, [{localhost, 27017}, {localhost, 27018}, {localhost, 27019}]},
Conn_Pool = resource_pool:new (mongo:rs_connect_factory(Replset), 10),
...
Conn = resource_pool:get(Conn_Pool)
case mongo:do(safe, master, Conn, ?DATABASE,
fun() ->
mongo:insert(mytable, {'_id', 26, d, 11})
end end)
...
27017
является основным узлом, поэтому я могу успешно вставить данные.
Но когда я помещаю в код только один вторичный узел вместо всех экземпляров mongo rs: Replset = {<<"rs1">>, [{localhost, 27019}]}
Я также могу вставить данные.
Я думал, что это должно было вызвать исключение или ошибку, но он успешно записал данные.
почему это случилось?
1 ответ
Когда вы подключаетесь к набору реплик, вы указываете имя replSet и некоторые имена узлов в качестве начальных значений. Драйвер поочередно подключается к начальным узлам и обнаруживает членство / конфигурацию / состояние набора реальных реплик с помощью команды db.isMaster().
Так как он обнаруживает, какой узел является первичным, он может соответствующим образом направить все ваши запросы на запись. Тот же метод позволяет автоматически переключаться на вновь избранный первичный, когда исходный первичный отказывает и выбирается новый.