为什么 MySQL Galera Cluster 要求至少三个节点

节点数量的重要性是在发生网络故障的情况下体现出来的。在发生网络故障时,节点可能被分隔为多个互不连通的子集合,Galera Cluster 采用多数票 Quorum 的机制来选择一个票数多的子集合为其活集群,把其他的子集合作为故障节点排除在外,从而避免了数据不一致的问题。如果只有两个节点或者偶数个节点,如果发生了网络故障,那么可能分割出来的子集合节点数相同,无法通过多数票机制选出活集群。如果有三个或奇数个节点,如果发生了一次网络故障,那么割裂出来的子集合节点数肯定是一边多,一边少,从而能顺利地选出多的子集合为活集群。

上面基于节点数的多数票机制是一种简化的描述。Galera Cluster采用的多数票机制是可以给每个节点配置投票权数的。默认情况下是一个节点一票,可以设置为0到255的数字,而且这个数字是可以动态配置的。当集群发生了故障导致新的活集群内节点数量变为偶数时,可以通过动态调整投票权数,使得总票数为奇数。如果将节点的权重设置为0,则该节点作为slave存在。这是在Galera Cluster中实现类似传统的Master Slave 模式的方法。

此外, Galera Cluster 还支持一种只投票但不实际存放数据的节点类型 Arbitrator,它也有助于形成奇数票来帮助处理网络故障下的活集群选择。

上文中使用了“子集合”、“活集群”的说法,只是形象的描述。在 Galera Cluster的文档中,由网络故障 (network failure) 形成的节点子集合被成为集群的组件 (Component),而被多数票选出来的组件被称为主组件 (Primary Component, PC).

关于“多数票”机制,需要注意的是, Galera Cluster的多数是组件(子集合)的票数合计要占多数,因为集合内的所有节点都是主节点。这一点与单主结构的集群是有很大差别的。单主结构的多数票是指某个被选中的主节点要有多数票,算法是Paxos等。相比之下,Galera Cluster的多数票机制(令牌环)要简单些。