ICode9

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

MongoDB 学习笔记 - 复制集

2022-02-22 11:33:44  阅读:216  来源: 互联网

标签:二级 同步 选举 MongoDB 笔记 复制 Oplog 数据 节点


架构

复制集(replica set)提供了数据冗余和高可用。它是一组mongod进程。

一个复制集里面有很多数据节点(data bearing node)和一个可选择的仲裁节点(arbiter node)。数据节点的角色也分为主节点(primary node)和二级节点(secondary node)。所有写操作都是在主节点上的,并记录oplog(operation log)。二级节点通过主节点的oplog重放来保持数据的最终一致性,这个“主从复制”是异步的。当主节点挂了,二级节点会进行新的选举,从中找一个二级节点来充当主节点的角色。仲裁节点只负责参与选举,而不存储数据。

MongoDB推荐的最小架构是:一个主节点,两个二级节点。最大可以有50个成员节点,但是只有7个是voting member。

主从1

主从2

仲裁节点有一票的选票,优先级为0(priority为0)。一般是在你只有一个主节点和二级节点,也许由于一些原因如配额预算不够导致不能再部署一个二级节点,可以用一个仲裁节点来参与选举,完成故障转移。

优先级为0的节点,不能成为主节点,也不能发起选举,但是有一票选票(members[n].votes > 0)。一般来说优先级为0的节点部署得会离主要部署点较远,如下图,所以有较高的延迟latency,不能很好地充当主节点的角色,但是对于local read性能较好。

p0

对于一些特殊场景,复制集还能设立隐藏节点或者延迟节点。隐藏节点将不会有任何reads和writes的traffic, db.hello()也不会展示隐藏节点,一般用来上报一些信息或者作为备份。延迟节点,存储的数据备份比正常的数据晚一段时间,延迟节点需要设置为隐藏,且优先级为0。

日志 Oplog

Oplog是一个特殊的capped collection。二级节点通过主节点记录的Oplog来实现数据复制, 他们保存在local.oplog.rs。Oplog记录的是对数据的操作,且这些操作是幂等的,也就是执行一次和很多次是结果一样的。

Oplog 大小 (Unix & Windows)

Storage Engine Default Oplog Size Lower Bound Upper Bound
In-Memory 5% of physical memory 50MB 50GB
WiredTiger 5% of free disk space 990MB 50GB

Oplog 保留期

mongod将删掉Oplog如果它的大小超过上限或者存在的时间超过参数oplogMinRetentionHours

数据同步

主要有两种同步方式:

  • 当加入一个新的二级节点时进行数据初始化,是全量数据同步
  • 运行期间对于数据的变更进行增量同步

数据初始化

初始化的节点会根据一系列规则选择一个source来进行数据同步。3.4过后的初始化将会建立一致的索引。初始化同步完成,该节点的状态由STARTUP2转为SECONDARY

增量同步

二级节点的同步是异步的,且开启了多个线程并行复制。4.4过后MongoDB传送Oplog是流式一直发送的,用来减少同步延迟。

默认情况是会根据一些规则从复制集中选一个出来当source来同步,但如果chaining设置为disabled就会选主节点来同步。

故障转移

默认发送心跳的周期是2s, 心跳检测的默认值(electionTimeoutMillis)是10s。超过这个值,二级节点还没有收到主节点的心跳,那么就会开启自动故障转移(automatic failover),选举一个新的主节点。在这个选举过程中,是不支持写操作的可以支持打到二级节点上的读操作的。选举过程耗时的中位数大概是12s。

切换

选举

触发选举的条件

  • 向replica set内加入新的节点
  • 初始化replica set
  • 人为维护,使用rs.stepDown()方法等
  • 某个二级节点丢失和主节点的心跳连接

选举的规则

就是根据节点的vote和priority等信息,票数最高且超过一半成员支持的节点成为主节点。如果票数相同,则谁同步数据快,谁胜利。

读写分离

基于这个架构,我们可以把一些读操作放到二级节点上,来做到读写分离。
读写分离

标签:二级,同步,选举,MongoDB,笔记,复制,Oplog,数据,节点
来源: https://www.cnblogs.com/rachel-aoao/p/mongodb_replica_set.html

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

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

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

ICode9版权所有