mongodb副本集的常规操作

 

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/

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值