Странная вещь в драйвере 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().

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

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