1

我的代码是这样的:

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 instance:Replset = {<<"rs1">>, [{localhost, 27019}]}时,我也可以插入数据。

我认为它应该抛出异常或错误,但它已经成功写入数据。

为什么会这样?

4

1 回答 1

1

当您连接到副本集时,您将 replSet 的名称和一些节点名称指定为种子。驱动程序依次连接到种子节点,并通过“db.isMaster()”命令发现真正的副本集成员/配置/状态。

由于它以这种方式发现哪个节点是主节点,因此它能够相应地路由您的所有写入请求。相同的技术使其能够在原始主节点发生故障并选择新主节点时自动故障转移到新选择的主节点。

于 2013-05-20T12:35:21.633 回答