如果上面都没有问题就选择最后操作时间戳最新(保证数据是最新的)的服务器节点作为主节点。
这里提到了一个一致协议(其实就是bully算法),这个和数据库的一致性协议还是有些区别,一致协议主要强调的是通过一些机
制保证大家达成共识;而一致性协议强调的是操作的顺序一致性,比如同时读写一个数据会不会出现脏数据。一致协议在分布
式里有一个经典的算法叫“Paxos算法”,后续再介绍。
上面有个问题,就是所有从节点的最后操作时间都是一样怎么办?就是谁先成为主节点的时间最快就选谁。
选举触发条件
选举不是什么时刻都会被触发的,有以下情况可以触发。
初始化一个副本集时。
副本集和主节点断开连接,可能是网络问题。
主节点挂掉。
选举还有个前提条件,参与选举的节点数量必须大于副本集总节点数量的一半,如果已经小于一半了所有节点保持只读状态。
日志将会出现:
can't see a majority of the set, relinquishing primary
1. 主节点挂掉能否人为干预?答案是肯定的。
可以通过replSetStepDown命令下架主节点。这个命令可以登录主节点使用
db.adminCommand({replSetStepDown : 1})
如果杀不掉可以使用强制开关
db.adminCommand({replSetStepDown : 1, force : true})
或者使用 rs.stepDown(120)也可以达到同样的效果,中间的数字指不能在停止服务这段时间成为主节点,单位为秒。
2. 设置一个从节点有比主节点有更高的优先级。
先查看当前集群中优先级,通过rs.conf()命令,默认优先级为1是不显示的,这里标示出来
[java] view plaincopyrs.conf();
[java] view plaincopy{
"_id" : "rs0",
"version" : 9,
"members" : [
{
"_id" : 0,
"host" : "192.168.1.136:27017" },
{
"_id" : 1,
"host" : "192.168.1.137:27017" },
{
"_id" : 2,
"host" : "192.168.1.138:27017" }
]
}
如果不想让一个从节点成为主节点可以怎么操作?
使用rs.freeze(120)冻结指定的秒数不能选举成为主节点。
按照上一篇设置节点为Non-Voting类型。
当主节点不能和大部分从节点通讯。把主机节点网线拔掉,嘿嘿:)
优先级还可以这么用,如果我们不想设置什么hidden节点,就用secondary类型作为备份节点也不想让他成为主节点怎么办?
看下图,共三个节点分布在两个数据中心,数据中心2的节点设置优先级为0不能成为主节点,但是可以参与选举、数据复
制。架构还是很灵活吧!