我有3台服务器,分别是A,B和C。
A是主要的。
我想在生产中实时扩展它。我发出以下信息:
file_exclude_patterns
然后我做
mongo A
rs.stepDown()
看到B现在处于PRIMARY状态,这是否意味着对A的所有未同步写入现在都已传递给B,并且A可以安全地关闭并按比例放大?
如果不是这样,那又如何呢?是否有100%的决定因素可以安全地关闭以前的PRIMARY?
谢谢, 凯文
答案 0 :(得分:1)
在副本集中,A,B和C应该是相同且可互换的。
因此,如果您下调主要数据库,而另一个已接管主要数据库,则该集合作为一个整体应该是一致的,并且可以接受写入(带有警告的 )。
话虽如此,建议垂直缩放的方法是先对所有次级进行缩放,最后对所有次级进行缩放。
注意事项:如果选择了新的PRIMARY,则所有三个节点都应包含相同的数据,如果对该集合的所有写入都使用多数写入问题。如果写入被主数据库确认,则很有可能会回退已确认的写入,并且您可以在写入尚未传播到任何辅助数据库的一小段时间中将其降级。有关详细说明,请参见Rollbacks During Replica Set Failover。
答案 1 :(得分:1)
主要对象是任何客户端通信(在这种情况下为写操作)的第一联系点。要考虑的一个因素是写入问题-这是开发人员可以添加到写入操作中的确认机制,更高级别的确认可以确保更强的持久性保证。参见Write Concern for Replica Sets。
如果写关注点为1
(这是默认设置),则在将数据写入主节点A之后确认客户端。此时,如果主节点降级,并且复制未发生对于次要节点(并且次要节点没有写操作),当A再次作为辅助节点启动时,它将回滚尚未复制到次要对象的特定写入。
当写关注点为“多数”时,在将数据写入主A并将其复制到次B或C之一后,客户端即得到确认(请注意,三位成员中的大多数副本集是2)。在这种情况下,如果主数据库A降级,则保证写入数据位于成员B或C之一(除了A之外)上。
A下台,进行选举,B或C中的一个被选为新的主要候选人。具有最新数据的成员将获得首选项,并且将具有复制的写入。请注意,次要成员的优先级还会影响哪个成员获得优先选择成为主要成员(默认优先级为1,优先级较高的成员具有较高的优先级)。确定要运行哪个辅助节点的方法的优先级从优先级开始,并且哪个辅助节点具有最新的数据副本。在这种情况下(写为“多数”),在所有成员上的默认优先级均为1是有益的。