MongoDB 高可用复制集架构

MongoDB 复制集

MongoDB复制集的主要意义在于实现服务高可用,类似于Redis中的哨兵模式

它主要提供两个方面的功能

  1. 数据写入主节点(Primary)时将数据复制到另一个副本节(Secondary)点上

  2. 主节点发生故障时自动选举出一个新的替代节点

在实现高可用的同时,复制集实现了其他几个作用

数据分发:将数据从一个区域复制到另一个区域,减少另一个区域的读延迟

读写分离:不同类型的压力分别在不同的节点上执行

异地容灾:在数据中心故障时快速切换到异地

典型复制集结构

一个典型的复制集由三个或三个以上具有投票权的节点组成,其中一个主节点(Primary):接

收写入操作,读操作和选举时投票,两个或多个从节点(Secondary):复制主节点上的新数据和

选举时投票

数据是如何复制的?

当一个修改操作,无论是插入,更新或删除,到达主节点时,它对数据的操作将被记录下来(经

过一些必要的转换)。这些记录称为oplog

从节点通过从主节点上不断获取新进入主节点的oplog,并在自己的数据上回放,以此保持跟主

节点的数据一致。

通过选举完成故障恢复

具有投票权的节点之间两两互相发送心跳;

当5次心跳未收到时判断为节点失联

如果失联的是主机点,从节点会发起选举,选出新的主节点

如果失联的是从节点则不会产生新的选举

选举基于RAFT一致性算法实现,选举成功的必要条件是大多数投票节点存活

复制集中最多可以有50个节点,但具有投票权的节点最多7个

影响选举的因素

整个集群必须有大多数节点存活

被选举为主节点的节点必须

1.能够与多数节点建立连接

2.具有较新的oplog

3.具有较高的优先级(如果有配置)

复制集节点有以下的选配项

是否具有投票权(v 参数): 有则参与投票

优先级(priority参数):优先级越高的节点越优先成为主节点。优先级为0的节点无法成为主节

点,默认值为1。

隐藏(hidden参数):复制数据,但对应用不可见。隐藏节点可以具有投票权,但优先级必须为

0

延迟(slaveDelay参数):复制 n 秒之前的数据,保持与主节点的时间差

从节点不建立索引( buildIndexes)

复制集注意事项

硬件:

因为正常的复制集节点都有可能成为主节点,它们的地位是一样的,因此硬件配置上必须一致

为了保证节点不会同时宕机,各节点的硬件必须具有独立性。

软件:

复制集各节点软件版本必须一致,以避免出现不可预知的问题

增加节点不会增加系统写性能

复制集搭建

bash 复制代码
1. 创建数据目录文件
Linux系统
mkdir -p /data/db{1,2,3}
3. 准备每个数据库的配置文件
复制集的每个mongod进程应该位于不同的服务器。我们现在在一台服务器上运行三个实例,所
以要为它们各自配置
1.不同的端口: 28017, 28018,28019.
2.不同的数据目录
data/db1,data/db2,data/db3
3. 不同的日志文件路径。实例中使用
/data/db1/mongod.log
/data/db2/mongod.log
/data/db3/mongod.log
data/db1/mongod.conf
1 systemLog:
2 destination: file
3 path: /data/db1/mongod.log
4 logAppend: true
5 storage:
6 dbPath: /data/db1
7 net:
8 bindIp: 0.0.0.0
9 port: 28017
10 replication:
11 replSetName: rs0
12 processManagement:
13 fork: true
14
/data/db2/mongod.conf
1 systemLog:
2 destination: file
3 path: /data/db2/mongod.log
4 logAppend: true
5 storage:
6 dbPath: /data/db2
7 net:
8 bindIp: 0.0.0.0
9 port: 28018
10 replication:
11 replSetName: rs0
12 processManagement:
13 fork: true
14
/data/db3/mongod.conf
1 systemLog:
2 destination: file
3 path: /data/db3/mongod.log
4 logAppend: true
5 storage:
6 dbPath: /data/db3
7 net:
8 bindIp: 0.0.0.0
9 port: 28019
10 replication:
11 replSetName: rs0
12 processManagement:
13 fork: true
14
分别启动
mongod -f /data/db1/mongod.conf
mongod -f /data/db2/mongod.conf
mongod -f /data/db3/mongod.conf
window没法 fork, 所以只能用前台进程开启, 需要 开3个命令窗口分别启动
配置复制集
mongo --port 28017
1 > rs.initiate({
2
3 _id:"rs0",
4 members:[{
5 _id:0,
6 host:"localhost:28017"
7 },{
8 _id:1,
9 host:"localhost:28018"
10 },{
11 _id:2,
12 host:"localhost:28019"
13 }]
14 })
15
16 默认情况下非主节点不允许读数据
17 可以通过执行 rs.secondaryOk() 开启读权限

mongo --port 28017 连接到主节点

mongo --port 28018 连接到从节点上面

执行

相关推荐
阳光是sunny12 小时前
Vue 项目怎么做用户行为全链路监控?轻量插件方案详解
前端·面试·架构
EMA18 小时前
Docker虚拟化失败解决方案
架构
李斯维19 小时前
从历史的角度看 Android 软件架构
android·架构·android jetpack
JouYY21 小时前
聊一下多 Agent 编排架构的应用实践
架构·llm·agent
Sunia21 小时前
《AgentX 专栏》10-生产部署:3台2C4G云服务器把企业级Agent真正跑起来的完整方案
java·架构
吃糖的小孩1 天前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界
数据库
葫芦和十三1 天前
图解 MongoDB 17|大集合与工作集:数据超过内存怎么办
后端·mongodb·面试
葫芦和十三1 天前
图解 MongoDB 18|复制集拓扑:Primary、Secondary 和 Arbiter 的分工
后端·mongodb·面试
葫芦和十三2 天前
图解 MongoDB 15|journal 与持久化:写入怎么不丢,崩溃怎么恢复
后端·mongodb·面试
葫芦和十三2 天前
图解 MongoDB 16|压缩:snappy、zstd 和 zlib 的取舍
后端·mongodb·面试