1、修改副本集节点的状态
1.1 将primary节点降级为secondary节点
powerlong:PRIMARY> rs.stepDown()
这个命令会让primary降级为Secondary节点,并维持60s,如果这段时间内没有新的primary被选举出来,这个节点可以要求重新进行选举。也可手动指定时间带参数比如50秒
powerlong:PRIMARY> rs.stepDown(50)
命令执行完后,primary节点将会变成secondary节点。
1.2 冻结secondary节点
如果需要对Primary做一下维护,但是不希望在维护的这段时间内将其它Secondary节点选举为Primary节点,可以在每次Secondary节点上执行freeze命令,强制使它们始终处于Secondary节点状态。
#强制冻结,带上冻结时间
powerlong:PRIMARY> rs.freeze(300)
#解冻,设置冻结时间为0,就标识解冻
powerlong:PRIMARY> rs.freeze()
1.3 强制secondary进入维护模式
当Secondary节点进入到维护模式后,它的状态即转化为“RECOVERING”,在这个状态的节点,客户端不会发送读请求给它,同时它也不能作为复制源。
进入维护模式有两种触发方式:
a). 自动触发
譬如Secondary上执行压缩
b). 手动触发
#强制secondary节点进入维护模式
powerlong:PRIMARY> db.adminCommand({"replSetMaintenance":true})
2、修改副本集的配置
2.1 添加新的节点
#默认添加新的节点
powerlong:PRIMARY> rs.add("127.0.0.16:27017")
#罗列比较详细的属性的方式添加节点
powerlong:PRIMARY> rs.add({_id: 16, host: "127.0.0.16:27017", priority: 0, hidden: true})
#也可以通过配置文件的方式
powerlong:PRIMARY> cfg={
"_id" : 16,
"host" : "127.0.0.16:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : true,
"priority" : 0,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
powerlong:PRIMARY> rs.add(cfg)
2.2 移除废弃的节点
#1 直接remove
powerlong:PRIMARY> rs.remove("127.0.0.16:27017")
#2 使用config删除
powerlong:PRIMARY> cfg = rs.conf()
powerlong:PRIMARY> cfg.members.splice(15,1)
powerlong:PRIMARY> rs.reconfig(cfg)
备注:The rs.reconfig() shell method can trigger the current primary to step down in some situations.
2.3 将Secondary节点设置为延迟备份节点
#设置延迟3600秒,一个小时
powerlong:PRIMARY> cfg = rs.conf()
powerlong:PRIMARY> cfg.members[15].priority = 0
powerlong:PRIMARY> cfg.members[15].hidden = true
powerlong:PRIMARY> cfg.members[15].slaveDelay = 3600
powerlong:PRIMARY> rs.reconfig(cfg)
2.4 将Secondary节点设置为隐藏节点
#将Secondary节点设置为隐藏节点
#打开hidden属性
powerlong:PRIMARY> cfg = rs.conf()
powerlong:PRIMARY> cfg.members[14].priority = 0
powerlong:PRIMARY> cfg.members[14].hidden = true
powerlong:PRIMARY> rs.reconfig(cfg)
2.5 替换当前的副本集成员
#替换当前的副本集成员,修改host属性值
powerlong:PRIMARY> cfg = rs.conf()
powerlong:PRIMARY> cfg.members[0].host = "127.0.0.19"
powerlong:PRIMARY> rs.reconfig(cfg)
2.6 设置副本集节点的优先级
#设置当前成员优先级
powerlong:PRIMARY> cfg = rs.conf()
powerlong:PRIMARY> cfg.members[0].priority = 0.5
powerlong:PRIMARY> cfg.members[1].priority = 2
powerlong:PRIMARY> cfg.members[2].priority = 2
powerlong:PRIMARY> rs.reconfig(cfg)
优先级的有效取值是0~1000,一般为整数(不建议设置成小数模式),默认为1
从MongoDB 3.2+开始
Non-voting members must have priority of 0.
Members with priority greater than 0 cannot have 0 votes.
注:如果将当前Secondary节点的优先级设置的大于Primary节点的优先级,会导致当前Primary节点的退位,所以设置的时候,要小心,尽量找第二个dba帮忙review下。
2.7 阻止Secondary节点升级为Primary节点
这个和1.2有些类似的功效
#只需要设置priority属性为0即可
powerlong:PRIMARY> fg = rs.conf()
powerlong:PRIMARY> cfg.members[2].priority = 0
powerlong:PRIMARY> rs.reconfig(cfg)
2.8 如何设置没有投票权的Secondary节点
mongodb的副本集有限制,最多拥有50个member,而且最多只需要7个member投票,限制的原因是考虑到网络开销以及心跳机制的性能开销,尽量保持副本集的数据同步性能。由于成员过多,所以MongoDB维护着不同节点间心跳请求的平均花费时间,选择同步源时,会选择一个离自己比较近而且数据比自己新的节点。这方面mysql和oracle都有限制,比如mysql默认限制不超过9个slave,oracle也限制不超过12个secondary
#没有投票权,只需要设置priority 和votes属性都为0即可。
powerlong:PRIMARY> cfg = rs.conf()
powerlong:PRIMARY> cfg.members[3].votes = 0
powerlong:PRIMARY> cfg.members[3].priority = 0
powerlong:PRIMARY> cfg.members[4].votes = 0
powerlong:PRIMARY> cfg.members[4].priority = 0
powerlong:PRIMARY> rs.reconfig(cfg)
2.9 禁用chainingAllowed
默认情况下,允许级联复制,这个和mysql的级联复制是一个实现途径,虽然能减轻了primary的压力,但是也有其缺陷所在:复制链越长,将写操作复制到所有Secondary节点所花费的时间就越长,所以一般情况下,我们可以禁止用这个级联复制
#先查看下是从哪个节点进行复制的
powerlong:PRIMARY> rs.status().members[1].syncingTo
127.0.0.3:27017
#看到是从2号secondary进行复制的,所以我们禁用掉
powerlong:PRIMARY> cfg=rs.conf()
powerlong:PRIMARY> cfg.settings.chainingAllowed=false
powerlong:PRIMARY> rs.reconfig(cfg)
这样一设置后,针对的是副本集的所有secondary节点,都会该从primary进行数据复制同步。
2.10 为Secondary节点显式指定复制源
2.9说了可以禁止级联复制,那么我们想象有没有办法指定一个复制源?这是可以的。
#指定从3号节点进行复制的
powerlong:PRIMARY> rs.syncFrom("127.0.0.4:27019")
2.11 禁止Secondary节点创建索引
有时,并不需要Secondary节点拥有和Primary节点相同的索引,譬如这个节点只是用来处理数据备份或者离线的批量任务。这个时候,就可以阻止Secondary节点创建索引。
# 禁止在secondary建立索引
powerlong:PRIMARY> cfg=rs.conf()
powerlong:PRIMARY> cfg.members[13].priority=0
powerlong:PRIMARY> cfg.members[13].buildIndexes=false
true
powerlong:PRIMARY> rs.reconfig(cfg)
#备注,3.4的版本不允许直接修改,需要在添加新节点的时候设置好。
学习参考文章:
1、https://docs.mongodb.com/manual/administration/replica-set-maintenance/