ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MongoDB 副本集(Replica Set)

2021-11-22 10:31:18  阅读:195  来源: 互联网

标签:副本 MongoDB Primary 同步 Set 线程 oplog 节点 Replica


副本集(Replica Set)

副本集概念

此集群拥有一个主节点(Master)和多个从节点(Slave),与主从复制模式类似,但是副本集与主从复制的区别在于:当集群中主节点发生故障时,副本集可以自动投票,选举出新的主节点,并引导其余的从节点连接新的主节点。

**MongoDB 的副本集是自带故障恢复功能的主从复制 **

副本集作用
  • 异地备份(数据冗余)
  • 故障转移(服务冗余)
  • 负载均衡(读写分类)
  • 高可用基石(HA)
副本集角色
  • 主节点(Primary)
    Primary 是副本集的主节点,可读写,唯一可以进行写操作的节点,由集群自行选举出来

  • 副本节点(Secondary)

    Seconary 会参与 Primary 选举,并从 Primary 同步最新写入的数据,以保证与 Primary 存储相同的数据(Seconary 默认不提供读写服务)

  • 仲裁者(Arbiter)
    Arbiter 节点只参与投票,不能被选为 Primary,并且不从 Primary 同步数据

副本集数据同步原理
  • intial sync(全量同步)

    1. 全量同步开始,设置 minvalid 集合的 _initialSyncFlag 字段为 true
    2. 获取主节点上的当前最新 oplog 时间戳
    3. 同步集合数据并建立索引(比较耗时)
    4. 获取主节点上的当前最新的 oplog 时间戳
    5. 读取两个 oplog 时间戳段内的 oplog 并重放
    6. 全量同步结束,设置 minvalid 集合的 _initialSyncFlag 字段为 false
  • Replication(增量同步)

    全量同步结束后,从节点不断的从主节点拉取 oplog 并重放应用到自身,这个过程并不是由一个线程来完成的,mongodb 为了提升同步效率,将拉取 oplog 以及重放 oplog 分到了不同的线程来执行。

    • producer 线程:该线程不断的从主节点上拉取 oplog,并加入到一个 BlockQueue 的队列里保存着,BlockQueue 最大存储 240MB 的 oplog 数据,当超过这个阈值时,就必须等到 oplog 被 replBatcher 消费掉才能继续拉取
    • replBatcher 线程:该线程负责逐个从 producer 线程的队列里取出 oplog,并放到自己维护的队列里,这个队列最多允许 5000 个元素,并且元素总大小不超过 512 MB,当队列满了时,就需要等待 oplogApplication 线程消费掉
    • oplogApplication 线程:该线程会取出 replBatch 线程当前队列的所有元素,并将元素根据集合名称分散到不同的replWriter 线程(默认16个)
    • replWriter 线程:该线程将所有的 oplog 进行回放;
    • 等待所有 oplog 都回放完毕,最终 oplogApplication 线程将所有的 oplog 顺序写入到一个集合中,完成增量同步
副本集心跳检测
  • 副本集创建成功后,每一个节点之间都保持着通信,即每 2s 会向整个副本集的其他节点发一次心跳检测 ping 命令
  • 副本集中每一个节点的数据库内部,维护着整个副本集节点的状态信息,一旦某一个节点超过 10s 不能收到 ping 命令的响应,就认为这个节点不能访问
  • 副本集中的主节点除了维护整体副本集节点状态信息外,还要判断是否和大多数节点可以正常通信,如果不能则要主动降级(只读状态)
副本集 Primary 选举场景

需要进行 Primary 选举的场景如下:

  1. 副本集初始化
  2. 副本集被 reconfig
  3. Primary 节点宕机
  4. Primary 节点主动 stepDown(主动降级为Secondary)
副本集 Primary 选举规则
  • 每一个副本集节点根据自己维护的节点状态信息,如果判断出整个副本集没有主节点,而且本身具备升主节点条件,则会引发一次投票选举

  • 投票发起者向副本集成员发起 Elect 请求,成员在收到请求后经过会一系列检查,如果通过检查则为发起者投一票

    检查条件如下:

    • 在所有有效的副本集节点中它持有最新的 optime 时间戳
    • Priority 优先级最高(默认1)
    • 先发先得选票
  • 如果投票发起者获得超过半数(初始化时整个副本集节点的数量的一半)的投票,则选举通过成为 Primary 节点,否则重新发起投票

  • 所有成员都可以投否决票,否决票具有一票否决权,所以一般可以认为只要有成员反对,则发起选举节点将不能成为 Primary

    投否决票一般需要判断以下三个条件:

    • 副本集中是否有其他节点已经是 Primary
    • 本节点的数据是否比请求成为主节点的数据更新(optime 时间戳)
    • 其他节点的数据是否比请求成为主节点的数据更新(optime 时间戳)

    注:如果以上任意一个条件满足,则会停止选举过程;原计划升为主节点将仍旧保持 Secondary 状态

官方推荐副本集的成员数量为奇数,且至少副本集包含 3 个节点

标签:副本,MongoDB,Primary,同步,Set,线程,oplog,节点,Replica
来源: https://www.cnblogs.com/zkatr/p/15587429.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有