MongoDB副本集replica set部署
Replication Set概述
- MongoDB中的副本集是一组维护相同数据集合的 mongod进程,副本集提供了冗余和高可用性。
- 通过维护冗余的数据副本,能够实现数据的备份,读写分离和自动故障转移。
1.环境准备
三个以上的mongodb节点(或多实例)
1.1 多实例环境准备
以mongodb3.6.21为例
1.2 多个端口:
28017、28018、28019、28020
1.3 多套目录:
mkdir -p /data/mongodb/{28017,28018,28019,28020}/{data,conf,log}
1.4 多套配置文件:
/mongodb/{28017,28018,28019,28020}/conf/mongod.conf
1.5 配置文件内容:
cat > /data/mongodb/28017/conf/mongod.conf <<EOF
systemLog:
destination: file
path: /data/mongodb/28017/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /data/mongodb/28017/data
directoryPerDB: true
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
bindIp: 0.0.0.0
port: 28017
replication:
oplogSizeMB: 2048
replSetName: easydb
EOF
1.6 修改相应配置文件值
\cp /data/mongodb/28017/conf/mongod.conf /data/mongodb/28018/conf/
\cp /data/mongodb/28017/conf/mongod.conf /data/mongodb/28019/conf/
\cp /data/mongodb/28017/conf/mongod.conf /data/mongodb/28020/conf/
sed -i 's#28017#28018#g' /data/mongodb/28018/conf/mongod.conf
sed -i 's#28017#28019#g' /data/mongodb/28019/conf/mongod.conf
sed -i 's#28017#28020#g' /data/mongodb/28020/conf/mongod.conf
1.7 修改目录属主
chown -R mongo. /data/mongodb
1.8 启动多个实例
mongod -f /data/mongodb/28017/conf/mongod.conf
mongod -f /data/mongodb/28018/conf/mongod.conf
mongod -f /data/mongodb/28019/conf/mongod.conf
mongod -f /data/mongodb/28020/conf/mongod.conf
1.9 查看端口状态
[root@sandbox ~]# netstat -lnp|grep 280
tcp 0 0 0.0.0.0:28017 0.0.0.0:* LISTEN 1609/mongod
tcp 0 0 0.0.0.0:28018 0.0.0.0:* LISTEN 1642/mongod
tcp 0 0 0.0.0.0:28019 0.0.0.0:* LISTEN 1671/mongod
tcp 0 0 0.0.0.0:28020 0.0.0.0:* LISTEN 1700/mongod
unix 2 [ ACC ] STREAM LISTENING 22882 1642/mongod /tmp/mongodb-28018.sock
unix 2 [ ACC ] STREAM LISTENING 22887 1671/mongod /tmp/mongodb-28019.sock
unix 2 [ ACC ] STREAM LISTENING 24735 1609/mongod /tmp/mongodb-28017.sock
unix 2 [ ACC ] STREAM LISTENING 22894 1700/mongod /tmp/mongodb-28020.sock
2.MongoDB副本集构建
2.1 副本集成员
MongoDB副本集主要有三种成员:
Primary:主节点
Secondaries:从节点
Arbiter:仲裁节点,可选。
2.2 PSS副本集架构
PSS架构:
“一主多从”架构,如果主节点不可用,则符合条件的次要节点将进行选举以自行选举新的主要节点。
# 登陆一台mongo实例
mongo --port 28017 admin
# 将副本集中信息定义成一个变量
# 'easydb'和配置文件中'replSetName'定义要一致
config = {_id: 'easydb', members: [
{_id: 0, host: '192.168.80.61:28017'},
{_id: 1, host: '192.168.80.61:28018'},
{_id: 2, host: '192.168.80.61:28019'}]
}
# 进行初始化操作
rs.initiate(config)
示例:
> config = {_id: 'easydb', members: [
... {_id: 0, host: '192.168.80.61:28017'},
... {_id: 1, host: '192.168.80.61:28018'},
... {_id: 2, host: '192.168.80.61:28019'}]
... }
{
"_id" : "easydb",
"members" : [
{
"_id" : 0,
"host" : "192.168.80.61:28017"
},
{
"_id" : 1,
"host" : "192.168.80.61:28018"
},
{
"_id" : 2,
"host" : "192.168.80.61:28019"
}
]
}
>
> rs.initiate(config)
{
"ok" : 1,
"operationTime" : Timestamp(1610101818, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1610101818, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
easydb:SECONDARY>
easydb:SECONDARY>
easydb:SECONDARY>
easydb:PRIMARY>
easydb:PRIMARY>
easydb:PRIMARY>
查询复制集状态
rs.status();
2.3 PSA副本集架构
PSA架构:
在某些情况下(例如只有一个主服务器和一个辅助服务器,一个仲裁器),一个mongodb实例作为仲裁器添加到副本集,仲裁节点参加选举,但是不保存数据。
mongo -port 28017 admin
config = {_id: 'easydb', members: [
{_id: 0, host: '192.168.80.61:28017'},
{_id: 1, host: '192.168.80.61:28018'},
{_id: 2, host: '192.168.80.61:28019',"arbiterOnly":true}]
}
rs.initiate(config)
3.复本集管理操作
3.1 副本集相关命令
rs.help() #查看副本集相关帮助
rs.initiate() #使用默认配置初始化副本集
rs.initiate(cfg) #使用配置文件cfg初始化副本集
rs.reconfig(cfg) #修改副本集配置信息
rs.status() #查看副本集状态
rs.conf() #查看副本集配置
rs.add(hostportstr) #添加新的节点
rs.addArb(hostportstr) #添加仲裁节点
rs.remove(hostportstr) #删除节点
rs.secondaryOk() #允许副本节点只读,默认副本节点不允许读写
rs.isMaster() #查看哪个节点为主节点
rs.printReplicationInfo() #查看oplog大小以及oplog可用时间,可以判断系统繁忙程度
rs.printSlaveReplicationInfo() #查看复制集成员以及延迟
rs.stepDown([stepdownSecs, catchUpSecs]) #手动主从切换
rs.freeze(secs) #冻结当前节点在指定的时间内(秒)不能选举为主
rs.syncFrom(hostportstr) #管理员临时覆盖当前成员的默认同步目标。以[hostname]:[port]的形式指定要复制的成员的名称。
3.2 添加删除节点
rs.remove("ip:port"); #删除一个节点
rs.add("ip:port"); #新增从节点
rs.addArb("ip:port"); #新增仲裁节点
示例
添加 arbiter节点
1. 连接到主节点
[root@sandbox ~]# mongo --port 28017 admin
2. 添加仲裁节点
easydb:PRIMARY> rs.addArb("192.168.80.61:28020")
3. 查看节点状态
easydb:PRIMARY> rs.isMaster()
{
"hosts" : [
"192.168.80.61:28017",
"192.168.80.61:28018",
"192.168.80.61:28019"
],
"arbiters" : [
"192.168.80.61:28020"
],
删除一个节点
easydb:PRIMARY> rs.remove("192.168.80.61:28019")
easydb:PRIMARY> rs.isMaster()
新增一个节点
easydb:PRIMARY> rs.add("192.168.80.61:28019")
easydb:PRIMARY> rs.isMaster()
4.特殊从节点
介绍:
- arbiter节点:主要负责选主过程中的投票,但是不存储任何数据,也不提供任何服务
- hidden节点:隐藏节点,不参与选主,也不对外提供服务。
- delay节点:延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,所以通常会配合hidden(隐藏)
4.1 配置延时节点
一般情况下会将delay+hidden一起配置使用
cfg=rs.conf()
cfg.members[3].priority=0
cfg.members[3].hidden=true
cfg.members[3].slaveDelay=3600
rs.reconfig(cfg)
取消以上配置
cfg=rs.conf()
cfg.members[3].priority=1
cfg.members[3].hidden=false
cfg.members[3].slaveDelay=0
rs.reconfig(cfg)
配置成功后,通过以下命令查询配置后的属性
rs.conf();
{
"_id" : 4,
"host" : "192.168.80.61:28019",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : true,
"priority" : 0,
"tags" : {
},
"slaveDelay" : NumberLong(3600),
"votes" : 1
}
注意:members[3],中括号里面的3是副本集索引的节点,从0开始往下计数,如果做过删除节点操作,就和conf里面对应的"_id"号不一致
因为有悔,所以披星戴月;因为有梦,所以奋不顾身! 个人博客首发:easydb.net
微信公众号:easydb
关注我,不走丢!
因为有悔,所以披星戴月;因为有梦,所以奋不顾身!
个人博客首发:easydb.net
微信公众号:easydb
关注我,不走丢!