抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

摘要:本文主要学习了什么是副本集,包括副本集的角色和选举,节点的管理和故障模拟。

环境

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配置文件,修改目录位置和端口,增加副本集的配置:

mongod.conf
1
2
3
replication:
# 副本集的名称
replSetName: mgrs

进入安装MongoDB的bin目录,通过mongod.exe文件启动:

cmd
1
mongod.exe -f D:\momashanhe\mongodb\mgrs_27018\mongod.conf

4.1.2 创建从节点

创建mgrs_27019目录,在目录下创建db目录和log目录。

mgrs_27019目录下创建mongod.conf配置文件,修改目录位置和端口,增加副本集的配置:

mongod.conf
1
2
3
replication:
# 副本集的名称
replSetName: mgrs

进入安装MongoDB的bin目录,通过mongod.exe文件启动:

cmd
1
mongod.exe -f D:\momashanhe\mongodb\mgrs_27019\mongod.conf

4.1.3 创建仲裁节点

创建mgrs_27020目录,在目录下创建db目录和log目录。

mgrs_27020目录下创建mongod.conf配置文件,修改目录位置和端口,增加副本集的配置:

mongod.conf
1
2
3
replication:
# 副本集的名称
replSetName: mgrs

进入安装MongoDB的bin目录,通过mongod.exe文件启动:

cmd
1
mongod.exe -f D:\momashanhe\mongodb\mgrs_27020\mongod.conf

4.2 连接节点

需要使用命令行工具连接,官方推荐的工具下载地址:下载地址

进入命令行工具安装目录下的bin目录,使用命令指定主机和端口号连接:

cmd
1
mongosh.exe mongodb://127.0.0.1:27018

4.3 启动副本集

连接节点以后,因为还未启动副本集,很多命令无法使用。

使用命令启动副本集:

cmd
1
rs.initiate(<configuration>)

含义:

名称 类型 说明
configuration 文档 可选。指定副本集的配置文档。

启动副本集:

cmd
1
rs.initiate()

执行命令后命令行提示符变为:

cmd
1
mgrs [direct: other] test>

然后按下回车后命令行提示符会变为:

cmd
1
mgrs [direct: secondary] test>

稍等片刻后再次按下回车后命令行提示符变为:

cmd
1
mgrs [direct: primary] test>

表示该节点已经启动,并由从节点变为主节点。

4.4 查看副本集

4.4.1 查看副本集配置

使用命令查看副本集配置:

cmd
1
rs.conf()

结果:

conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
_id: 'mgrs',
version: 1,
term: 1,
members: [
{
_id: 0,
host: '127.0.0.1:27018',
arbiterOnly: false,
buildIndexes: true,
hidden: false,
priority: 1,
votes: 1
}
],
settings: {}
}

含义:

名称 类型 说明
_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 查看副本集状态

使用命令查看副本集状态:

cmd
1
rs.status()

4.5 添加节点

4.5.1 添加从节点

使用命令添加从节点:

cmd
1
rs.add(<host>, <arbiterOnly>)

含义:

名称 类型 说明
host 字符串或文档 指定主机名和端口。
arbiterOnly 布尔值 可选。是否仲裁节点,默认为false,true表示仲裁节点,false表示数据节点。

添加从节点:

cmd
1
rs.add("127.0.0.1:27019")

添加后查看副本集状态,能够看到添加的从节点。

4.5.2 添加仲裁节点

添加仲裁节点会改变默认的写关注,需要明确设置写关注:

cmd
1
2
3
4
db.adminCommand({
"setDefaultRWConcern": 1,
"defaultWriteConcern": { "w": 1 }
})

使用命令添加仲裁节点:

cmd
1
rs.addArb(<host>)

含义:

名称 类型 说明
host 字符串 指定主机名和端口。

添加仲裁节点:

cmd
1
rs.addArb("127.0.0.1:27020")

添加后查看副本集状态,能够看到添加的仲裁节点。

4.6 读写文档

连接主节点,可以写入,可以读取。

连接从节点,无法写入,可以读取。

连接仲裁节点,无法写入,无法读取。

4.7 故障模拟

4.7.1 主节点宕机

从节点成为主节点,主节点恢复后变为从节点继续同步数据。

4.7.2 从节点宕机

主节点不受影响,从节点恢复后能继续同步数据。

4.7.3 仲裁节点宕机

主节点不受影响,从节点不受影响,仍然能进行主从同步。

评论