1. 副本集介绍
官方文档:https://docs.mongodb.com/manual/replication/
MongoDB中的副本集(Replica Set)是一组维护相同数据集的mongod服务。 副本集可提供冗余和高可用性,是所有生产部署的基础
副本集类似于有自动故障恢复功能的主从集群。通俗的讲就是用多台机器进行同一数据的异步同步,从而使多台机器拥有同一数据的多个副本,并且当主库当掉时在不需要用户干预的情况下自动切换其他备份服务器做主库。而且还可以利用副本服务器做只读服务器,实现读写分离,提高负载
1)冗余和数据可用性
通过在不同数据库服务器上提供多个数据副本,复制可提供一定级别的容错功能,以防止丢失数据。在某些情况下,复制可以增加读取性能,因为客户端可以将读取操作发送到不同的服务上, 在不同数据中心维护数据副本可以增加分布式应用程序的数据位置和可用性。 您还可以为专用目的维护其他副本,例如灾难恢复,报告或备份
2)MongoDB中的复制
副本集是一组维护相同数据集的mongod实例。 副本集包含多个数据承载节点和可选的一个仲裁节点。在承载数据的节点中,一个且仅一个成员被视为主节点,而其他节点被视为次要(从)节点。主节点接收所有写操作
辅助(副本)节点复制主节点的oplog并将操作应用于其数据集,以使辅助节点的数据集反映主节点的数据集。 如果primary不在,则符合条件的secondary将举行选举以选出新的主节点


3)主从复制和副本集区别
主从集群和副本集最大的区别就是副本集没有固定的"主节点";整个集群会选出一个"主节点",当其挂掉后,又在剩下的从节点中选中其他节点为"主节点",副本集总有一个活跃点(主、primary)和一个或多个备份节点(从、secondary)
4)副本集主要有三种角色:
primary(主节点):主要接收所有写操作,主节点secondary(从节点):从主节点通过复制操作以维护相同的数据集,即备份数据,不可写操作,但可以读操作(但需要配置),是默认的一种从节点类型arbiter(仲裁者):不保留任何数据的副本,只具有投票选举作用,当然也可以将仲裁服务器维护为副本集的一部分,即副本成员同时也可以是仲裁者,也是一种从节点类型

关于仲裁者的说明:
1、仲裁者不维护数据集。 仲裁者的目的是通过响应其他副本集成员的心跳和选举请求来维护副本集中的仲裁
2、如果你的副本+主节点的个数是偶数,建议加一个仲裁者,形成奇数,容易满足大多数的投票。
3、如果你的副本+主节点的个数是奇数,可以不加仲裁者
2. 服务器规划
| IP地址 | 端口 | 角色 |
|---|---|---|
| 10.0.0.107 | 27017 | primary |
| 10.0.0.108 | 27017 | secondary |
| 10.0.0.109 | 27017 | secondary |
| 路径 | 说明 |
|---|---|
| /data/mongod/conf | 配置文件目录 |
| /data/mongod/data | 数据目录 |
| /data/mongod/logs | 日志目录 |
| /data/mongod/pid | 进程文件目录 |
| /data/mongod/key | key目录 |
3. 副本集搭建步骤
3.1 所有节点安装mongoDB并配置
操作步骤参照MongoDB单机安装
3.2 编辑配置文件
yaml
# 所有节点编辑配置文件
[root@MongoDB-07 ~]# vim /data/mongod/conf/mongod.conf
systemLog:
destination: file
path: "/data/mongod/logs/mongod.log"
logAppend: true
storage:
dbPath: "/data/mongod/data"
directoryPerDB: true
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1 #50%(RAM-1 GB)
directoryForIndexes: true
collectionConfig:
blockCompressor: zstd
indexConfig:
prefixCompression: true
processManagement:
fork: true
pidFilePath: /data/mongod/pid/mongod.pid
net:
bindIp: 0.0.0.0
port: 27017
maxIncomingConnections: 10240
operationProfiling:
slowOpThresholdMs: 100
mode: off
security:
authorization: enabled
keyFile: /data/mongod/key/keyfile
replication:
oplogSizeMB: 8192
replSetName: shard03
3.3 编辑内部身份验证文件
除了验证客户端的身份之外,MongoDB能要求副本集和分片集群的成员对其各自的副本集或者分片集群的成员资格进行身份验证。
bash
# 在第一个节点创建身份验证key文件
[root@MongoDB-07 ~]# openssl rand -base64 756 > /data/mongod/key/keyfile
[root@MongoDB-07 ~]# chmod 600 /mongodb/key/keyfile
# 将可以文件传输到其他节点
[root@MongoDB-07 ~]# scp /mongodb/key/keyfile 10.0.0.108:/data/mongod/key/
[root@MongoDB-07 ~]# scp /mongodb/key/keyfile 10.0.0.109:/data/mongod/key/
# 所有节点修改目录权限
[root@MongoDB-07 ~]# chown -R mongodb.mongodb /data/mongod
[root@MongoDB-08 ~]# chown -R mongodb.mongodb /data/mongod
[root@MongoDB-09 ~]# chown -R mongodb.mongodb /data/mongod
3.4 启动MongDB服务
bash
# 所有节点启动mongod服务
[root@MongoDB-07 ~]# systemctl start mongod
[root@MongoDB-08 ~]# systemctl start mongod
[root@MongoDB-09 ~]# systemctl start mongod
3.5 副本集构建
bash
(1)连接到第一个节点
[root@MongoDB-07 ~]# mongosh --port=27017
(2)编辑副本集信息
config = {
_id: 'shard03',
members: [
{_id: 1, host: '10.0.0.37:27017'},
{_id: 2, host: '10.0.0.38:27017'},
{_id: 3, host: '10.0.0.39:27017'}
]
}
(3)初始化复制集
rs.initiate(config)
3.6 创建root用户
bash
# 在主节点创建root用户
use admin
db.createUser({
user: "root",
pwd: "123",
roles: [ { role: "root", db: "admin" } ]
})
验证root用户登录
bash
mongosh 127.0.0.1:27017/admin -u root -p 123
mongosh --host=127.0.0.1 --username=root --password=123 --port=27017 --authenticationDatabase=admin
#登录后再验证
mongosh 127.0.0.1:27017/admin
shard03 [direct: primary] admin> db.auth("root","123")
5. 查看副本集的状态
json
rs.status()

副本集配置的查看命令,本质是查询的是 local库中 system.replset 表中的数据
json
shard03 [direct: primary] admin> use local
switched to db local
shard03 [direct: primary] local> db.system.replset.find()

7. 常用操作
更多详细信息查看官方文档中关于副本集的指令https://docs.mongoing.com/replication/replication-reference
json
#(1)配置文件方式初始化集群
config = {
_id: 'shard03',
members: [
{_id: 1, host: '10.0.0.37:27017'},
{_id: 2, host: '10.0.0.38:27017'},
{_id: 3, host: '10.0.0.39:27017'}
]
}
rs.initiate(config)
#(2)添加新节点
rs.add("10.0.0.102:27017")
#(3)删除节点
rs.remove("10.0.0.103:27017")
#(4)查看副本集配置
rs.conf()
#(5)查看副本集状态
rs.status()
#(6)查看集群所有节点,与主节点信息
rs.isMaster()
#(7)查看从库延时
rs.printSecondaryReplicationInfo() #低版本使用rs.printSlaveReplicationInfo()
#(8)查看oplog信息
rs.printReplicationInfo()
#(9)指定节点升为主节点
cfg = rs.conf()
cfg.members[1].priority = 1
cfg.members[2].priority = 0.5
cfg.members[3].priority = 0.5
rs.reconfig(cfg)
#(10)主节点执行,触发failover
rs.stepDown()
#(11)查看oplog大小
use local
db.oplog.rs.stats().maxSize
#(12)调整oplog大小,单位mb
db.adminCommand({replSetResizeOplog: 1, size: 2048})
#(13)当缩小oplog后,磁盘空间不会被回收,需要执行compact操作,操作期间复制停止,需要在窗口期业务停写后执行
use local
db.runCommand({ "compact" : "oplog.rs" })