一、mongodb复制集简介
1. 复制集的基本概念
- 定义: 复制集是由多个 MongoDB 实例(节点)组成的一个集群,这些节点协同工作以维护数据的复制和高可用性。
- 节点类型:
- 主节点(Primary): 负责处理所有的写操作和大多数读操作。主节点是复制集中的唯一写入节点。
- 副本节点(Secondary): 这些节点复制主节点的数据,并处理读操作(如果配置了相应的读取偏好)。副本节点是从节点,它们从主节点拉取数据以保持同步。
- 仲裁节点(Arbiter): 不保存数据,但参与选举过程。用于在主节点发生故障时帮助进行选举,确保复制集保持一个有效的主节点。
2. 数据同步
- 同步过程: 副本节点通过复制主节点的操作日志(Oplog)来同步数据。主节点将所有操作记录到 Oplog 中,副本节点从 Oplog 中读取并应用这些操作以保持数据一致性。
- 延迟: 副本节点可能会有轻微的同步延迟,取决于网络状况和负载。
3. 故障转移
- 自动选举: 如果主节点发生故障,复制集会自动进行选举,选举出一个新的主节点。这个过程是自动进行的,以确保系统的高可用性。
- 读写操作: 一旦新的主节点被选举出来,客户端会重新连接到新的主节点。应用程序应该能够处理这种变化,通常可以通过设置适当的读取偏好来帮助平衡读操作。
二、配置复制集(多实例方式)
1. 创建数据目录
mkdir -p /mongodb/28017/{conf,data,log}
mkdir -p /mongodb/28018/{conf,data,log}
mkdir -p /mongodb/28019/{conf,data,log}
mkdir -p /mongodb/28020/{conf,data,log}
2. 配置文件写入
cat > /mongodb/28017/conf/mongod.conf << EOF
systemLog:
destination: file
path: /mongodb/28017/log/mongod.log
logAppend: true
storage:
dbPath: /mongodb/28017/data
journal:
enabled: true
directoryPerDB: true
#engineConfig: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
port: 28017
bindIp: 0.0.0.0
# 复制集配置
replication:
oplogSizeMB: 2048
replSetName: my_repl
EOF
cp /mongodb/28017/conf/mongod.conf /mongodb/28018/conf/
cp /mongodb/28017/conf/mongod.conf /mongodb/28019/conf/
cp /mongodb/28017/conf/mongod.conf /mongodb/28020/conf/
sed -i 's#28017#28018#g' /mongodb/28018/conf/mongod.conf
sed -i 's#28017#28019#g' /mongodb/28019/conf/mongod.conf
sed -i 's#28017#28020#g' /mongodb/28020/conf/mongod.conf
3. 启动实例
mongod -f /mongodb/28017/conf/mongod.conf
mongod -f /mongodb/28018/conf/mongod.conf
mongod -f /mongodb/28019/conf/mongod.conf
mongod -f /mongodb/28020/conf/mongod.conf
4. 配置副本集
(1)连接到28017示例
mongo --port 28017
(2)切换到admin库
use admin
(3)初始化复制集
rs.initiate({
_id: "my_repl",
members: [
{ _id: 0, host: "192.168.44.191:28017" },
{ _id: 1, host: "192.168.44.191:28018" },
{ _id: 2, host: "192.168.44.191:28019" }
]
})
(4)查看复制集状态
rs.status
若返回如上图这样信息(截图不全),则复制集配置成功
(5)配置从节点可读
# Secondary节点执行
rs.slaveOk()
(6)测试复制集功能
①在主库的test库下,在testtable表中写入一条数据
use test
db.testtable.insertOne({"name": "小王"})
②在从库开启可读权限
注意:从库默认不支持增删改查操作,需要给从库赋予读操作
# 从库执行
rs.slaveOk()
③查看是否复制成功
# 切换到test库
use test
# 查看test库下所有的表
show tables
# 查看testtable表中的数据
db.testtable.find()
若为上图,则同步功能正常
三、复制集常用操作
1. 常用命令
--查看副本集配置信息:rs.conf()
--查看副本集各成员的状态:rs.status()
--副本集角色切换(不要认为切换,有风险):rs.stepDown() # 单位为秒
--锁定副本集从节点,使其不会成为主节点:rs.freeze(300) # 单位为秒
--设置主从复制集群的从节点可读:rs.slaveOk()
2. 新增和删除节点
--新增从节点:rs.add("ip:port");
--新增仲裁节点:rs.addArb("ip:port");
--删除节点:rs.remove("ip:port");
3. 特殊从节点配置
(1)配置延时节点
①参数介绍:
priority:优先级(参数:0-1000),优先级值越大,优先成为主节点;优先级值为0,无法成为主节点
slaveDelay:延迟(单位:秒),复制n秒之前的数据,与主节点保持时间差
hidden:隐藏(值:ture,false),可以复制数据,但对应用不可见,具有投票权,但优先级必须为0
votes:投票数(一般情况,值为:0或1),此处为0,表示不参与投票
②将复制集中下标索引为3的节点配置为延时节点,延时120秒
cfg=rs.conf()
cfg.members[3].priority=0
cfg.members[3].slaveDelay=120
cfg.members[3].hidden=false
cfg.members[3].votes=0
rs.reconfig(cfg)
③将复制集中下标索引为3的节点恢复为默认从节点
cfg=rs.conf()
cfg.members[3].priority=1
cfg.members[3].slaveDelay=0
cfg.members[3].hidden=false
cfg.members[3].votes=1
rs.reconfig(cfg)
(2)配置仲裁节点
①参数介绍:
arbiterOnly:仲裁权限(值:ture,false),此处为true,表示将下标索引为3的节点设置为仲裁节点
buildIndexes:构建索引(值:ture,false),此处为false,通常用于仲裁节点,值参与投票,不进行复制
priority:优先级(参数:0-1000),此处为0,这确保该节点不会被选为主节点。仲裁节点一般设为优先级0。
slaveDelay:延迟(单位:秒),因为仲裁节点不存储数据,此配置对它没有实际影响。
hidden:隐藏(值:ture,false),隐藏节点不会出现在复制集的视图中,但仲裁节点通常是可见的。
votes:投票数(一般情况,值为:0或1),此处为1,尽管它是仲裁节点,但它仍然参与选举并提供投票。
②将复制集中下标索引为3的节点配置为仲裁节点
cfg=rs.conf()
cfg.members[3].arbiterOnly=true
cfg.members[3].buildIndexes=false
cfg.members[3].priority=0
cfg.members[3].slaveDelay=0
cfg.members[3].hidden=false
cfg.members[3].votes=1
rs.reconfig(cfg)
③将复制集中下标索引为3的节点恢复为默认复制节点
注意:arbiter节点不能直接恢复为默认复制节点,只能remove之后再add
rs.remove("192.168.44.190:28020")
rs.add("192.168.44.190:28020")