参考: http://docs.mongodb.org/manual/core/replica-set-elections/
节点属性
arbiterOnly 是否为仲裁身份
priority 投票选举时优先级,越高优先成功primary
votes 投票数。默认为1; 0代表不参与投票; 不建议设为大于1的值,会导致死锁等问题
注意:
0虽然不参与投票,但可以成功primary,原文如下:不太能理解
Non-voting members do not vote in elections, but can veto an election and become primary
副本集最多12个节点(standard、passive、arbiter),所以只需要配置7个节点的值为1即可
primary 降级为secondary
收到降级命令
runCommand("replSetStepDown":N),N秒内在选举中不会被选为primary
有secondary的priority比自己高
不能与半数以上的member通信,自己降级,runCommand("replSetStepDown":N, force:true)
选举primary
注意:
选举过程中,集群对外停止写服务
触发条件
副本集初始化
primary宕机或降级
每2秒进行心跳检测,secondary 失去primary联系,priority大于0时,会发起primary选举
选举规则
Priority 先根据每个节点的优先级priority(默认为1),优先级高的会优先选为primary
Optime 同priority下optime最高的成为primary
Connection 同optime,则比较与member(有投票权的,而不是set中所有)
连接数,多的成为primary
如果也相同,则arbiter发挥作用
如何进行投票?
配置1个仲裁(arbiter)节点,防止2个普通(standard)节点,否则无法进行故障切换。因为必须超过半数投票才能成为primary
Only members in the following states can vote:PRIMARY, SECONDARY, RECOVERING, ARBITER, and ROLLBACK.
实现细节?