开发者学堂课程【MongoDB精讲课程(下):主节点的选举原则】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/727/detail/12977
主节点的选举原则
内容介绍:
一、概述
二、选举规则
三、优先级
四、修改优先级
一、概述
MongoDB在副本集中,会自动进行主节点的选举,主节点选举的触发条件:
1、主节点故障:
这个服务器宕机了,这时候根据MongoDB的选举原则,会在剩下的这个服务器当中,再会去选择一个作为主节点,保证服务可用。
2、主节点网络不可达(默认心跳信息为10秒)
第二种情况其实和第一种情况基本一致,主节点的网络不可达,其实网络不可达也是一种故障,因为副本集之间会有心跳,互相之间会有心跳,默认的心跳是10秒钟,发送一个心跳请求,如果超过10秒主节点,网络就不通畅。它还是会触发重新的选举,去选举一个新的主节点,保证服务还是高可用的。
3、人工干预(rs.stepDown(600))
即主节点这台服务器我要下线了,去设置一下,这是默认的命令?Set downhou 这一块它也可以把主节点给它下掉,一样会触发新的选举是在内部,当前的副本集当中再推选一个新的主节点出来
二、选举规则
一旦触发选举,就要根据一定规则来选主节点。
选举规则是根据票数来决定:
●票数最高,且获得了“大多数”成员的投票支持的节点获胜。“大多数”:假设复制集内投票成员数量为N,则大多数为 N/2 + 1。例如:3个投票成员,则大多数的值是2。当复制集内存活成员数量不足大多数时,整个复制集将无法选举出Primary,复制集将无法提供写服务,处于只读状态。
●若票数相同,且都获得了“大多数”成员的投票支持的,数据新的节点获胜。数据的新旧是通过操作日志oplog来对比的。
三、优先级
在获得票数的时候,优先级(priority)参数影响重大。
可以通过设置优先级(priority)来设置额外票数。优先级即权重,取值为0-1000,相当于可额外增加0-1000的票数,优先级的值越大,就越可能获得多数成员的投票(votes)数。指定较高的值可使成员更有资格成为主要成员,更低的值可使成员更不符合条件。
默认情况下,优先级的值是1
myrs:SECONDARY> rs.conf()
{
"_id" : "myrs",
"version" : 221242,
"term" : 4,
"members" : [
{
"_id" : 0,
"host" : "192.168.20.131:27017",
"priority" : 1,
},
{
"_id" : 1,
"host" : "localhost.localdomain:27018",
"priority" : 1,
},
{
"_id" : 2,
"host" : "192.168.20.131:27019",
"priority" : 1,
},
{
"_id" : 3,
"host" : "192.168.20.131:27020",
"priority" : 1,
},
{
"_id" : 4,
"host" : "192.168.20.131:27030",
"priority" : 0,
}
],
...
}
myrs:SECONDARY>
可以看出,主节点和副本节点的优先级各为1,即,默认可以认为都已经有了一票。但选举节点,优先级是0,(要注意是,选举节点的优先级必须是0,不能是别的值。即不具备选举权,但具有投票权)
四、修改优先级
通过下面的步骤可以提升从节点的优先级:
# 先将配置导入cfg变量
myrs:SECONDARY> cfg=rs.conf()
# 然后修改值(ID号默认从0开始):
myrs:SECONDARY> cfg.members[1].priority=2
# 重新加载配置
myrs:SECONDARY> rs.reconfig(cfg)