2013-05-20 3 views
1

Мой код выглядит так:Странная вещь о MongoDB-Эрл водителя при использовании набора реплик

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 является основным узлом, поэтому OFC я могу вставить данные успешно.

Но, когда я помещаю только один вторичный узел в код вместо всех экземпляров mongo rs: Replset = {<<"rs1">>, [{localhost, 27019}]}, я также могу вставить данные.

Я думал, что это должно было вызвать исключение или ошибку, но оно записало данные успешно.

Почему это произошло?

ответ

1

Когда вы подключаетесь к набору реплик, вы указываете имя replSet и некоторые имена узлов в виде семян. Драйвер подключается к семенным узлам по очереди и обнаруживает действительный набор/набор/статус набора реплик с помощью команды «db.isMaster()».

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

+0

Так будет ли соединение создаваться между сервером erlang до {localhost, 27019} или {localhost, 27017}, когда я записываю данные в db? Я имею в виду, что данные сначала отправятся «27019», а затем экземпляр mongo передаст данные в «27017» (потому что я ставлю 27019 как единственное семя); или сервер erlang получит информацию о конфигурации наборов реплик mongo, затем найдите основной узел и постройте соединение с 27017, а затем напишите данные непосредственно на 27017? –

+0

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