zookeeper的过半原则可以解释为,当集群中存在n个节点的时候,在(>n/2)个节点正常运行的情况下,都是可以对外提供服务的。
首先看一下以下几种情况?
- 当集群两个节点的时候,如果一个节点宕机,那么当前只剩一个节点,1 == 2/2 ,所以不能为2个节点的集群。
- 当集群节点为3个的时候,如果宕机1个不影响集群,宕机两个因为剩余节点为1个,所以集群不提供服务。当集群节点为4个的时候,如果宕机1个不影响集群,宕机两个因为剩余节点为2个,所以集群不提供服务。所以偶数多的那台机器对集群没有影响,反而浪费资源。
具体可如下表
集群节点数 | 最大可宕机数 |
---|---|
1 | 0 |
2 | 0 |
3 | 1 |
4 | 1 |
… | … |
n | n/2 + n%2 == 0 ? -1 |
所以 f(n) = 2*n + 1 (n >= 1)为最优解