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

使用副本集时mongodb erlang驱动程序的奇怪之处,mongodb,erlang,erlang-driver,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, maste

我的代码如下:

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)
  ...
Replset={,[{localhost,27017},{localhost,27018},{localhost,27019}]},
连接池=资源池:新建(mongo:rs\u connect\u factory(Replset),10),
...
连接=资源池:获取(连接池)
案例mongo:do(安全、主控、控制、数据库、,
乐趣()->
mongo:insert(mytable,{''uid',26,d,11})
(完)
...
27017
是主节点,因此ofc I可以成功插入数据

但是,当我在代码中只放置一个辅助节点而不是所有mongo rs实例时:
Replset={,[{localhost,27019}]}
,我还可以插入数据

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


为什么会发生这种情况?

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


由于它通过这种方式发现哪个节点是主节点,因此它能够相应地路由所有写请求。同样的技术使它能够在原始主设备出现故障并选择新的主设备时自动故障切换到新选择的主设备。

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


由于它通过这种方式发现哪个节点是主节点,因此它能够相应地路由所有写请求。同样的技术使它能够在原始主服务器出现故障并选择新的主服务器时自动故障切换到新选择的主服务器。

那么,当我将数据写入数据库时,会在erlang服务器与{localhost,27019}或{localhost,27017}之间创建连接吗?我的意思是,数据将首先进入“27019”,然后mongo实例将数据传递到“27017”(因为我将27019作为唯一的种子);或者erlang server将获取mongo relica集合的配置信息,然后找到主节点并与27017建立连接,然后将数据直接写入27017?驱动程序将创建到副本集合中每个非隐藏成员的连接。写入操作将始终转到其中任何一个主节点。所以后者,但它不只是建立到主服务器的连接,它维护到副本所有成员的连接,以便在主服务器消失时可以进行适当的故障切换。那么,当我将数据写入数据库时,是否会在erlang服务器与{localhost,27019}或{localhost,27017}之间创建连接?我的意思是,数据将首先进入“27019”,然后mongo实例将数据传递到“27017”(因为我将27019作为唯一的种子);或者erlang server将获取mongo relica集合的配置信息,然后找到主节点并与27017建立连接,然后将数据直接写入27017?驱动程序将创建到副本集合中每个非隐藏成员的连接。写入操作将始终转到其中任何一个主节点。所以后者,但它不只是建立到主服务器的连接,它还维护到复制副本所有成员的连接,以便在主服务器消失时可以进行适当的故障切换。