选举的代价:尽管选举对于维持复制集独立性操作是必不可少,但还是应该避免选举发生,因为选择是需要时间的,当选举正在进行时,复制集没有primary,那会阻塞写操作,所有成员为只读状态。说到只读状态时,顺例说一句,当大多数成员不可访问或者不可用时,此时跟选举发生时的一些表现类似,现各成员也为只读状态。
选举影响因素:
1.心跳检测:复制集成员之间每两秒会做一次heartbeat,如果一次heartbeat在10秒内没得到回应,那么会标识该成员为不可达
2.优先级:一个影响最终选举结果的重要因子,但个人认为,优先最高的成员不一定会被选举为primary,只是在成员其他条件相同的情况下起到决定作用,对数据库而言,单纯靠优先级来决定new primary有点太野蛮,得考虑数据的一致性及维护一致性的复杂度和成本。多说一句,优先级为0的成员(当然包含延迟复制成员、hidden成员)肯定不会成为new primary。官方文档如是说,只要现primary的优先级最高,或者没有优先级更高的并能在10秒内追赶上最新oplog的从库,选举是是不会被触发的。可以换句话理解,当前成员相互间优先级的比较结果变化是会触发选举的,都能触发选举了,也就有可能对选举结果产生一定影响。
3.optime:本质是一个时间戳(The optime is the timestamp of the last operation that a member applied from the oplog.),从作用上看,跟MySQL主从复制exec_master_pos类似,是一个偏移量,官方文档如是说,A replica set member cannot become primary unless it has the highest (i.e. most recent) optime of any visible member in the set.根据我的理解,,复制集成员(当然都有被选举的资格)optime必须是最新高的,这也回答上面提到的为什么优先级最高的成员不一定会选举为new primary的原因,但还有一个疑问就是apply oplog与copy oplog还是有区别的,为什么不考虑copy oplog 最高的timestamp,待继续深究
4、网络连接:如果成员能被大多数建立连接,那说明网络的连通性是可靠的。则有成为new primary的可能,也就是说,其他条件再好,网络连接不可靠也是途劳。
5、网络分区:如果主挂掉了,不同网络分区的成员分布比较平均,都不占大多数,选举不会被触发,所有成员状态变为只读,官方推荐各网络分区的复制集成员分布数量应该有一个容易衡量的差异。

参考自Mongodb 3.0官方手册
10-10 02:58