摘要:本文主要学习了什么是副本集,包括副本集的角色和选举,节点的管理和故障模拟。
环境
Windows 10 企业版 LTSC 21H2
MongoDB 6.0.21
1 介绍
副本集(Replica Set)是一组维护相同数据集的mongod进程。副本集可提供冗余和高可用性,是所有生产部署的基础。
也可以说,副本集类似于有自动故障恢复功能的主从集群。多台机器拥有同一数据的多个副本,当主服务器掉线时能够自动切换其他备份服务器,而且还可以实现读写分离,提高负载。
2 角色
副本集包含多个数据节点和一个可选的仲裁节点。
仲裁节点没有数据集的副本,不属于数据节点。在数据节点中,只有一个主节点,其他被认为是从节点。
每个副本集节点必须属于且只属于一个副本集,副本集节点不能属于多个副本集。
2.1 主节点
主节点是副本集中唯一接受写入操作的成员,一个副本集只能有一个主节点。
主节点接受写入操作并记录oplog
操作日志,以便从节点复制。
2.2 从节点
从节点维护主节点的数据集副本,一个副本集可以有一个或多个从节点。
从节点会对主节点的操作日志oplog
进行复制,并应用于其数据集,同步主节点的数据集状态。
2.3 仲裁节点
仲裁节点参与主节点的选举,不参与维护数据集副本。
如果从节点和主节点总数为偶数,在选举时可能无法打破平局,建议加入一个仲裁节点,以便打破平局选出主节点。
如果从节点和主节点总数为奇数,可以不需要仲裁节点。
建议最多添加一个仲裁节点,默认情况下副本集不支持添加多个仲裁节点。
3 高可用性
3.1 选举
副本集使用选举来确定哪个数据节点会成为主节点。
可触发选举的事件:
- 启动副本集。
- 维护副本集。
- 副本集添加新的数据节点。
- 主节点失效,与主节点连接超时,默认超时时间为10秒。
触发选举后,发起投票和获得票数的影响因素:
- 根据优先级决定发起投票的时间,越高的从节点越能较早的发起投票。
- 根据任期和版本决定获得的票数,越高的从节点越能获得较高的票数。
如果在选举超时之前有从节点获得超过半数的投票,它将成为新的主节点,开始处理写入操作并记录日志。
如果有之前的主节点掉线重连了,并且执行了不成功的写操作,在加入副本集变成从节点后还要进行回滚操作。
3.2 心跳
数据节点每两秒向彼此发送一次心跳用于进行网络探测,如果心跳在10秒内未返回,会将接收心跳的数据节点标记为不可访问。
3.3 回滚
如果主节点在降级之前接受了从节点尚未成功复制的写操作,那么当主节点作为从节点重新加入副本集时,就需要回滚写操作,以保持与其他节点的一致性。
4 使用
4.1 创建节点
4.1.1 创建主节点
创建mgrs_27018
目录,在目录下创建db
目录和log
目录。
在mgrs_27018
目录下创建mongod.conf
配置文件,修改目录位置和端口,增加副本集的配置:
1 | replication: |
进入安装MongoDB的bin
目录,通过mongod.exe
文件启动:
1 | mongod.exe -f D:\momashanhe\mongodb\mgrs_27018\mongod.conf |
4.1.2 创建从节点
创建mgrs_27019
目录,在目录下创建db
目录和log
目录。
在mgrs_27019
目录下创建mongod.conf
配置文件,修改目录位置和端口,增加副本集的配置:
1 | replication: |
进入安装MongoDB的bin
目录,通过mongod.exe
文件启动:
1 | mongod.exe -f D:\momashanhe\mongodb\mgrs_27019\mongod.conf |
4.1.3 创建仲裁节点
创建mgrs_27020
目录,在目录下创建db
目录和log
目录。
在mgrs_27020
目录下创建mongod.conf
配置文件,修改目录位置和端口,增加副本集的配置:
1 | replication: |
进入安装MongoDB的bin
目录,通过mongod.exe
文件启动:
1 | mongod.exe -f D:\momashanhe\mongodb\mgrs_27020\mongod.conf |
4.2 连接节点
需要使用命令行工具连接,官方推荐的工具下载地址:下载地址
进入命令行工具安装目录下的bin
目录,使用命令指定主机和端口号连接:
1 | mongosh.exe mongodb://127.0.0.1:27018 |
4.3 启动副本集
连接节点以后,因为还未启动副本集,很多命令无法使用。
使用命令启动副本集:
1 | rs.initiate(<configuration>) |
含义:
名称 | 类型 | 说明 |
---|---|---|
configuration | 文档 | 可选。指定副本集的配置文档。 |
启动副本集:
1 | rs.initiate() |
执行命令后命令行提示符变为:
1 | mgrs [direct: other] test> |
然后按下回车后命令行提示符会变为:
1 | mgrs [direct: secondary] test> |
稍等片刻后再次按下回车后命令行提示符变为:
1 | mgrs [direct: primary] test> |
表示该节点已经启动,并由从节点变为主节点。
4.4 查看副本集
4.4.1 查看副本集配置
使用命令查看副本集配置:
1 | rs.conf() |
结果:
1 | { |
含义:
名称 | 类型 | 说明 |
---|---|---|
_id | 字符串 | 副本集的配置数据存储的主键值,默认就是副本集的名字。 |
version | 整型 | 递增的版本,用于判断节点新旧程度,任期相同的情下,版本越大节点越新。 |
term | 整型 | 递增的任期,用于判断节点新旧程度,任期越大节点越新。 |
members | 数组 | 节点配置文档数组,副本集的每个节点对应一个文档。 |
members[n]._id | 整型 | 副本集中节点的整数标识符,在所有节点中具有唯一性。 |
members[n].host | 数组 | 副本集中节点的主机和端口号。 |
members[n].arbiterOnly | 布尔值 | 可选。是否仲裁节点,默认为false,true表示仲裁节点,false表示数据节点。 |
members[n].priority | 整型 |
可选。节点的优先级,使用0到1000之间的数字表示成为主节点的可能性,数字越大可能性越高。 仲裁节点的优先级为0,表示无法成为主节点。 |
members[n].votes | 整型 | 可选。节点在选举中可以投出的票数。 |
settings | 文档 | 可选。包含整个副本集的配置文档。 |
副本集配置的查看命令,本质上查询的是system.replset
表中的数据。
4.4.2 查看副本集状态
使用命令查看副本集状态:
1 | rs.status() |
4.5 添加节点
4.5.1 添加从节点
使用命令添加从节点:
1 | rs.add(<host>, <arbiterOnly>) |
含义:
名称 | 类型 | 说明 |
---|---|---|
host | 字符串或文档 | 指定主机名和端口。 |
arbiterOnly | 布尔值 | 可选。是否仲裁节点,默认为false,true表示仲裁节点,false表示数据节点。 |
添加从节点:
1 | rs.add("127.0.0.1:27019") |
添加后查看副本集状态,能够看到添加的从节点。
4.5.2 添加仲裁节点
添加仲裁节点会改变默认的写关注,需要明确设置写关注:
1 | db.adminCommand({ |
使用命令添加仲裁节点:
1 | rs.addArb(<host>) |
含义:
名称 | 类型 | 说明 |
---|---|---|
host | 字符串 | 指定主机名和端口。 |
添加仲裁节点:
1 | rs.addArb("127.0.0.1:27020") |
添加后查看副本集状态,能够看到添加的仲裁节点。
4.6 读写文档
连接主节点,可以写入,可以读取。
连接从节点,无法写入,可以读取。
连接仲裁节点,无法写入,无法读取。
4.7 故障模拟
4.7.1 主节点宕机
从节点成为主节点,主节点恢复后变为从节点继续同步数据。
4.7.2 从节点宕机
主节点不受影响,从节点恢复后能继续同步数据。
4.7.3 仲裁节点宕机
主节点不受影响,从节点不受影响,仍然能进行主从同步。
条