MongoDB复制集RS
一、什么是MongoDB复制集RS(ReplicationSet)
1.基本原理
1)画图说明
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210425213316916.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MjYzNjg1NA==,size_16,color_FFFFFF,t_70)
2)文字说明
基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB) Paxos(mysql MGR 用的是变种))
如果发生主库宕机,复制集内部会进行投票选举,选择一个新的主库替代原有主库对外提供服务。同时复制集会自动通知
客户端程序,主库已经发生切换了。应用就会连接到新的主库。
自带高可用,自动监控,自动切换,自动选主
二、主从复制Replication Set配置过程详解
1.规划
三个以上的mongodb节点(或多实例)
2.环境准备
1)多个端口:
28017、28018、28019、28020
2)多套目录:
su - mongod
mkdir -p /mongodb/28017/conf /mongodb/28017/data /mongodb/28017/log
mkdir -p /mongodb/28018/conf /mongodb/28018/data /mongodb/28018/log
mkdir -p /mongodb/28019/conf /mongodb/28019/data /mongodb/28019/log
mkdir -p /mongodb/28020/conf /mongodb/28020/data /mongodb/28020/log
3)多套配置文件
/mongodb/28017/conf/mongod.conf
/mongodb/28018/conf/mongod.conf
/mongodb/28019/conf/mongod.conf
/mongodb/28020/conf/mongod.conf
3.配置文件内容
cat > /mongodb/28017/conf/mongod.conf <<EOF
systemLog:
destination: file
path: /mongodb/28017/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /mongodb/28017/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
bindIp: 10.0.0.52,127.0.0.1
port: 28017
replication:
oplogSizeMB: 2048
replSetName: my_repl
EOF
--说明:
1.3.x版本以上,默认是WT引擎,相当于MySQL InnoDB 支持事务,文档锁
2.3.x版本中,默认的是MMAPv1引擎,相当于MySQL MyISAM引擎
\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 's#28017#28018#g' /mongodb/28018/conf/mongod.conf -i
sed 's#28017#28019#g' /mongodb/28019/conf/mongod.conf -i
sed 's#28017#28020#g' /mongodb/28020/conf/mongod.conf -i
4.启动多个实例备用
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
netstat -lnp|grep 280
5.配置普通复制集:
1主2从,从库普通从库
mongo --port 28017 admin
config = {_id: 'my_repl', members: [
{_id: 0, host: '10.0.0.52:28017'},
{_id: 1, host: '10.0.0.52:28018'},
{_id: 2, host: '10.0.0.52:28019'}]
}
--初始化集群
rs.initiate(config)
--查询复制集状态
rs.status();
6. 1主11从1个arbiter
mongo -port 28017 admin
config = {_id: 'my_repl', members: [
{_id: 0, host: '10.0.0.52:28017'},
{_id: 1, host: '10.0.0.52:28018'},
{_id: 2, host: '10.0.0.52:28019',"arbiterOnly":true}]
}
--初始化集群
rs.initiate(config)
7.复制集管理操作
1)查看复制集状态
rs.status();
rs.isMaster();
rs.conf();
2)添加删除节点
rs.remove("ip:port");
rs.add("ip:port");
rs.addArb("ip:port");
例子:
添加 arbiter节点
1、连接到主节点
[mongod@db03 ~]$2mongo -port 28018 admin
2、添加仲裁节点
my_repl:PRIMARY> rs.addArb("10.0.0.52:28020")
3、查看节点状态
my_repl:PRIMARY>rs.isMaster()
{
"hosts" : [
"10.0.0.52:28017",
"10.0.0.52:28018",
"10.0.0.52:28019"
],
"arbiters" : [
"10.0.0.52:28020"
],
--删除一个节点
rs.remove("ip:port");
例子:
my_repl:PRIMARY> rs.remove("10.0.0.53:28019");
{ "ok" : 1 }
my_repl:PRIMARY> rs.isMaster()
rs.add("ip:port");
例子:
my_repl:PRIMARY> rs.remove("10.0.0.52:28019")
{
"ok" : 1,
--验证是否删除节点
my_repl:PRIMARY> rs.isMaster()
{
"hosts" : [
"10.0.0.52:28017",
"10.0.0.52:28018"
],
"arbiters" : [
"10.0.0.52:28020"
],
8.特殊从节点
![img](https://img-blog.csdnimg.cn/img_convert/4aee2236dc84185d3abd5319b6dd7cb6.png)
![img](https://img-blog.csdnimg.cn/img_convert/47bd2422daa10e984397ff61c3afe7a3.png)
1)介绍
arbiter节点:主要负责选主过程中的投票,但是不存储任何数据,也不提供任何服务
hidden节点:隐藏节点,不参与选主,也不对外提供服务。
delay节点:延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,所以通常会配合hidden(隐藏)
一般情况下会将delay+hidden一起配置使用
2)配置延时节点(一般延时节点也配置成hidden)
--定义配置为cfg变量
cfg=rs.conf()
--定义权重为0,不参与选主
cfg.members[2].priority=0
--隐藏节点,不参与业务
cfg.members[2].hidden=true
--延时的秒数
cfg.members[2].slaveDelay=120
--不投票,持有票数为0
cfg.members[2].votes=0
--重新加载配置
rs.reconfig(cfg)
取消以上配置
cfg=rs.conf()
cfg.members[2].priority=1
cfg.members[2].hidden=false
cfg.members[2].slaveDelay=0
rs.reconfig(cfg)
配置成功后,通过以下命令查询配置后的属性
rs.conf();
3) 副本集其他操作命令
查看副本集的配置信息
admin> rs.conf()
查看副本集各成员的状态
admin> rs.status()
--副本集角色切换(不要人为随便操作)
admin> rs.stepDown()
注:
admin> rs.freeze(300) //锁定从,使其不会转变成主库
freeze()和stepDown单位都是秒。
+++++++++++++++++++++++++++++++++++++++++++++
设置副本节点可读:在副本节点执行
admin> rs.slaveOk()
eg:
admin> use app
switched to db app
app> db.createCollection('a')
{ "ok" : 0, "errmsg" : "not master", "code" : 10107 }
查看副本节点(监控主从延时)
admin> rs.printSlaveReplicationInfo()
source: 192.168.1.22:27017
syncedTo: Thu May 26 2016 10:28:56 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
OPlog日志(备份恢复章节)