MongoDB管理:如何优雅的重启复制集?

啊!你还不了解MongoDB复制集?先看这里科普一下

复制集的成员启动后,会选举出一个Primary,Primary需要得到大多数成员的投票。所有的写入操作都必须向Primary发起,通过oplog将写操作同步到Secondary。

在复制集运行的过程中,难免会遇到需要重启节点的场景,比如复制集版本升级、节点维护等,在重启节点的过程中,建议不要直接shutdown Primary,这样可能导致已经写入primary但未同步到secondary的数据丢失,过程类似如下:

  1. shutdown Primary (shutdown会等待Secondary oplog追到10s以内)
  2. Primary退出后,剩余的节点选举出一个新的Primary(复制集只包含1或2节点例外)
  3. Primary重新启动,因为当前复制集已经有了新的Primary,这个Primary将以Secondary的角色运行。
  4. 从新的Primary同步的过程中,发现自己有无效的oplog,会先进行rollback。(rollback的数据只要不超过300M是可以找回的)

如果想不丢数据重启复制集,更优雅的打开方式应该是这样的

  1. 逐个重启复制集里所有的Secondary节点
  2. 对Primary发送stepDown命令,等待primary降级为Secondary
  3. 重启降级后的Primary

注意:如果Secondary的同步一直追不上Primary,步骤2可能会失败,这时应该重试步骤2直到stepDown成功;步骤2也可以通过调用replSetReconfig命令,来调整节点优先级来实现,让Secondary拥有更高的优先级,然后等待Primary降级为Secondary。

从上述分析可以看出,复制集里Primary、Secondary节点角色切换是很正常的事情,所以连接复制集一定不要直连Primary,否则在节点角色切换时不能正确容错,服务高可用无法保证。

另外,要想保证数据的高可靠,除了在运维上加强,在开发层面也可以做些工作,比如重要的数据写入通过WriteConcern: {w: "majority"}
来保证写入到大多数节点才向客户端确认。

参考资料

时间: 2024-10-31 07:30:27

MongoDB管理:如何优雅的重启复制集?的相关文章

MongoDB复制集自适应oplog管理

MongoDB复制集运行过程中,经常可能出现Secondary同步跟不上的情况,主要原因是主备写入速度上有差异,而复制集配置的oplog又太小,这时需要人工介入,向Secondary节点发送resync命令. 上述问题可通过配置更大的oplog来规避,目前官方文档建议的修改方案步骤比较长,而且需要停写服务来做,大致过程是先把oplog备份,然后再oplog集合删掉,重新创建,再把备份的内容导入到新创建的oplog. 我们团队)针对使用wiredtiger存储引擎的场景,开发了通过collMod命

仲裁节点-mongodb复制集数据恢复问题

问题描述 mongodb复制集数据恢复问题 我的primary库和仲裁节点在A服务器上,second库在B服务器上,现在的问题是A服务器挂了3天,然后恢复后重启主库和仲裁节点,但是在备库产生的3天数据却没同步回主库,请问各位大神是否有招,或者是有没有手动同步的方法

MongoDB基于复制集创建索引

MongoDB在启用复制集(Replica Set)功能后,原先一个简单的索引添加,在之上会变得相对复杂,尤其是在数据量巨大的时候,需要考虑尽可能将性能影响降低到最小.基于此我们需要采取逐个节点创建索引的方式来达成.如下本文描述. 一.复制集索引创建的过程 MongoDB从节点上复制集上索引的创建,通常是在主节点索引创建完成之后. 在分片集群环境中,mongos将发送createindex()命令到每一个shard的主成员节点, 当主副本成员完成索引创建后,辅助副本开始创建索引. 二.如何最小化

MongoDB复制集同步原理解析

MongoDB副本集数据同步](https://docs.mongodb.com/manual/core/replica-set-sync/)主要包含2个步骤 intial sync,可以理解为全量同步 replication,追同步源的oplog,可以理解为增量同步 本文是对MongoDB高可用复制集原理的补充,会详细介绍MongoDB数据同步的实现原理. initial sync Secondary节点当出现如下状况时,需要先进行全量同步 oplog为空 local.replset.minv

mongodb数据库复制集随机同步数据

记一次MongoDB主从切换,重新同步数据. PRIMARY> rs.conf() { "_id" : "poptask", "version" : 4, "members" : [ { "_id" : 0, "host" : "10.0.0.105:20011" }, { "_id" : 1, "host" : &quo

MongoDB Driver:使用正确的姿势连接复制集

MongoDB复制集(Replica Set)通过存储多份数据副本来保证数据的高可靠,通过自动的主备切换机制来保证服务的高可用.但需要注意的时,连接副本集的姿势如果不对,服务高可用将不复存在. 使用复制集时你需要知道的 MongoDB复制集里Primary节点是不固定的,当遇到复制集轮转升级.Primary宕机.网络分区等场景时,复制集可能会选举出一个新的Primary,而原来的Primary则会降级为Secondary,即发生主备切换. 总而言之,MongoDB复制集里Primary节点是不固

MongoDB 复制集(Replica Set)

复制集(replica Set)或者副本集是MongoDB的核心高可用特性之一,它基于主节点的oplog日志持续传送到辅助节点,并重放得以实现主从节点一致.再结合心跳机制,当感知到主节点不可访问或宕机的情形下,辅助节点通过选举机制来从剩余的辅助节点中推选一个新的主节点从而实现自动切换.这个特性与MySQL MHA实现原理一样.本文主要描述MongoDB复制集并给出创建复制集示例以及完成自动切换. 一.复制集相关概念 复制集 复制是在多台服务器之间同步数据的过程,由一组Mongod实例(进程)组成

MongoDB原理:复制集状态同步机制

MongoDB复制集(3.0版本)之间通过心跳信息来同步成员的状态信息,每个节点会周期性的向复制集内其它的成员发送心跳信息来获取状态,如rs.status()看到的复制集状态信息. 一次心跳请求分3个阶段 (主动发起心跳请求的节点称为源,接受到心跳请求的成为目标) 源向目标发送心跳请求 目标处理心跳请求,并向源发送应答 源接受到心跳应答,更新目标节点状态 接下来将介绍这3个阶段里的主要状态同步逻辑 阶段1 默认配置下,复制集的节点每隔2s会向其他成员发送一次心跳请求,即发送replSetHear

MongoDB复制集原理

复制集简介 Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写入Primary,Secondary从Primary同步写入的数据,以保持复制集内所有成员存储相同的数据集,提供数据的高可用. 下图(图片源于Mongodb官方文档)是一个典型的Mongdb复制集,包含一个Primary节点和2个Secondary节点. Primary选举 复制集通过replSetInitiate命令(或