有没有人使用 replset arbiter 实现了 Mongo 复制。在从 Primary 到 Secondary 的故障转移时,Arbiter 应该在 primary 上关闭 VIP,并在 Arbiter 指定 secondary 作为 Master 时在 secondary 上启用 VIP。
这可能吗?
我明白这是为了投票目的。但是当它可以决定谁应该可以写入以及谁不应该可以写入时,我想嵌入一个逻辑,该逻辑也应该将应用程序请求路由到获胜者。此外,我不想将主机决定保留在应用端。对我来说有点不干净。
注意:它会在 secondary 上打开 write,并不意味着它将请求从应用程序路由到 secondary(NewMaster)。
所以这里的驱动是应用驱动应该这样写。
@mongo_client = MongoReplicaSetClient.new(
['n1.mydb.net:27017', 'n2.mydb.net:27017', 'n3.mydb.net:27017']
).db("test").collection("sample")
选择其成员。我对吗?
根据James Wahlin和Markus W Mahlberg对问题的评论生成的社区 Wiki 答案
James:仲裁者是选举中有投票权的成员,但不会指定成员为主要成员或控制流程。我建议阅读: MongoDB 手册中的副本集选举。
进行选举时,所有客户端连接都会被 MongoDB 丢弃。在那个时间点,客户端将连接到它的一个种子并执行 isMaster 调用。此调用向客户端报告哪些成员是主要成员,哪些成员是次要成员。这样,客户端将根据读取偏好无缝地写入正确的成员。
Markus:它将请求从应用程序路由到次级应用程序。驱动程序是副本集感知的。由于所有连接都被旧的主节点主动删除或过时,驱动程序将尝试在它知道的副本集成员列表中找到当前的主节点。您可以通过在本地设置副本集来验证此行为,在本地计算机上的 3 个不同端口上运行并随机终止其中一个。在需要完成选举后不久,您的客户端应用程序将写入新选出的主节点。