使用副本集时mongodb-erlang驱动程序的奇怪之处

时间:2013-05-20 06:20:42

标签: mongodb erlang erlang-driver

我的代码是这样的:

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 个答案:

答案 0 :(得分:1)

连接到副本集时,请指定replSet的名称,并将某些节点名称指定为种子。驱动程序依次连接到种子节点,并通过'db.isMaster()'命令发现真实的副本集成员资格/配置/状态。

由于它发现哪个节点是主要节点,因此它能够相应地路由所有写入请求。同样的技术使它能够在原始主节点失败并选出新主节点时自动故障转移到新选择的主节点。