在 MariaDB Galera 集群中,您可以为每个节点分配一个权重,范围从 0 到 255。但是,文档没有指定是否允许使用十进制数(例如 1.5)。在其他方面,它确实指定了什么时候必须是整数,这让我相信它可能允许这个值使用小数。
配置是否允许将非整数数字分配给此权重?当我分配非整数权重时,不会生成任何错误或警告。但是,我还没有测试权重是否真的考虑了任何非整数值。
例如,如果我有 4 个节点,分配的权重分别为 2.1、2.2、2.4 和 2.8,然后两个节点从其他两个节点中分离出来,加权仲裁计算是否会正确找到两个权重总和略高的节点的仲裁?还是只会将每个节点计算为权重为 2,从而导致脑裂?
我问了一个math.se 上的问题找到一种通用方法来计算永远不会产生裂脑的唯一权重。但是,具体的 galera 文档说最高权重限制为 255,这意味着回答仅合理地允许符合我的标准的 8 个节点(权重)。但如果允许小数值,则该公式可以推广到更多节点。
示例:如果有 9 台服务器,则每个节点的权重分别为 256、257、259、263、271、287、319、383、511(即 (255+2^(n-1)))。任何一组数字加起来都不可能达到整个组或组的任何子集的 50%,这意味着不存在脑裂的可能性。由于文档只允许最大 255 的值,因此只需将所有这些值乘以 0.1 即可。但如果文档只允许整数,则计算仅限于 8 台服务器和公式 (127+(2^(n-1))。
答案1
如果节点满足以下条件,则声明为法定人数:多于总重量的 50%。等于 50% 与小于 50% 相同。
对于 4 个节点,只需 1,1,1,2。
对于偶数个节点,从数学上来说不可能对它们进行加权,使得一半节点下降,而另一半节点加起来多于重量减半。简单证明:向下翻转另一半。
原始版本中没有权重。
添加权重的一个原因是,这样你就不会在所有偶数节点的一半情况下出现裂脑。
另一个原因可能是避免优先考虑具有 garbd 的子集:1,2,2,2,其中 garbd 的权重为 1。
对于 9,1,1,1,1,1,1,1,1,1,1 有什么问题?如果死亡人数为 4 人或更少,则其他 5 人或更多人将获得法定人数。
由于每个节点都与其他节点通信,超过 5 个节点会因网络流量过大而受到限制。
一般的做法是针对“单一故障”做好规划,而不必担心极小的多重故障可能性。
由于数据中心能向下,你应该根据每个数据中心的服务器数量来考虑权重。也就是说,任何一个数据中心的综合权重应该是少于总数的一半。
当然,您应该位于 3 个(或更多)数据中心。
(不,我不知道分数值是否有效;我的观点是你永远不需要它们。)