任何需要连接到MongoDB副本集的应用程序都会有一个以下sort的URI用于连接到副本集:r.table('test').filter(function(doc) {
return r.expr(['foo', 'bar']).contains(doc('name'))
})
。它有效地枚举了副本集成员的不同主机名。
然而,MongoDB副本集是动态的,成员列表可能会在应用程序的生命周期内发生变化。这在大多数情况下都很好 - 我相信如果它可以连接到URI中列出的单个主机,它将发现当前RS的任何其他成员。
如果副本集的成员资格具有完全转换率,并且没有MongoDB进程正在监听mongodb://host-1,host-2,host-3/?replicaSet=myReplicaSet
,host-1
或host-2
,但现在他们已经在host-3
,host-4
和host-5
处,URI停止有用。
我的问题是:确保您的应用程序引用永远无效的副本集的正确方法是什么?
您可以使用带有cnames的交错方法。为应用程序提供引用host-6
,然后,当服务器添加/删除到副本集时,将更新cnames。
初始状态:
mongodb://host-a,host-b,host-c/?replicaSet=myReplicaSet
将服务器添加到RS:
CNAMES: host-a -> host-1, host-b -> host-2, host-c -> host-3
RS: host-1, host-2, host-3
在从RS中删除host-1之前,请更改host-a cname:
CNAMES: host-a -> host-1, host-b -> host-2, host-c -> host-3
RS: host-1, host-2, host-3, host-4
最后,从RS中删除host-1:
CNAMES: host-a -> host4, host-b -> host-2, host-c -> host-3
RS: host-1, host-2, host-3, host-4
这是解决此问题的适当方法,还是有更简单的方法?