在MongoDB tutorial of deploying geographically distributed replica set中,据说
确保大多数投票成员都在主要设施“A站点”内。这包括优先级为0的成员和仲裁者。
我对 arbiters 感到困惑,因为在其他地方in documentation我找到了
任何副本集中只应配置最多一个仲裁者 。
那么副本集中最多可以有多少个仲裁者?如果更多的仲裁者允许,那么在副本集中有多个仲裁者有什么意义呢?
答案 0 :(得分:2)
“仲裁者”在第一句中以复数形式写成的事实有风格原因,而不是技术原因。
你真的应该最多有1个仲裁者。 Iirc,你在技术上可以有更多,但说实话,我从来没有尝试过。但是,我们假设你可以为了下面的解释。
这里你似乎有点不确定,但正确地认为拥有多个仲裁器没有任何意义。
存在仲裁者以提供选举中的法定人数。
获取具有两个数据承载节点的副本集。只要两个实例都已启动,该设置将按预期运行 - 它们形成了2个原始成员的2个选票的法定数量。但是,如果一台机器出现故障,我们只有1票2的最初存在,这不是合格的多数,并且仍在运行的数据承载节点将随后恢复到次要状态,使写入无法进行。
为了防止这种情况,将仲裁器添加到混音中。仲裁器只是跟踪哪些可用的数据承载节点具有最新的可用数据集,并在选举时投票给该成员。因此,对于具有两个数据承载节点的副本集,为了在形成副本集的节点1的情况下获得合格的大多数投票,我们只需要1个仲裁器,因为2/3投票提供了合格的多数。 / p>
如果我们有一个带有3个数据承载节点的副本集,我们就不需要仲裁者,因为我们有3个投票成员,如果1个成员失败,其他成员仍然需要举行选举所需的合格多数。 / p>
有点抽象,我们可以通过将副本集中存在的投票数量放入以下“公式”中来找出我们需要仲裁者
needArbiter = originalVotes - floor(originalVotes/2) <= originalVotes / 2
如果我们加入一个额外的仲裁者,投票数将是4:3数据承载节点和1个仲裁者。一个节点发生故障,没问题。第二个节点关闭,副本集将恢复为辅助状态。现在让我们假设两个节点中的一个是仲裁器 - 我们将处于二级状态,而数据承载节点只能提供一个仲裁。我们必须支付并维持一个额外的仲裁者而不从中获得任何东西。因此,为了再次提供合格的多数,我们需要添加另一个仲裁者(现在制作2个),除了两个仲裁者可能会失败之外没有任何好处。你基本上需要额外的仲裁器来防止你首先不需要存在仲裁器的情况成为问题。
现在让我们假设我们有4个数据承载节点。由于当它们中的2个下降时它们不能形成合格的多数,这几乎与具有3个数据承载节点的副本集相同,只是更昂贵。因此,为了允许副本集的2个节点同时关闭,我们只需添加仲裁器。做更多的仲裁有意义吗?不,甚至比具有两个或3个数据承载节点的副本集更少,因为2个数据承载节点和仲裁器同时失败的概率是非常低。而且你需要一定数量的仲裁者。
Imho,有4个数据承载节点,仲裁器达到了它的有用性极限。如果需要高复制因子,与数据承载节点相比,使用仲裁器时节省的资金百分比会变得越来越小。请记住,下一步将是6个数据承载节点和一个仲裁器,因此您节省的成本不到总成本的1/6。
更一般地说,您拥有的数据承载节点越多(Mongo术语中的“复制因子”越高),拥有其他仲裁器就越不合理。从技术角度来看(大多数节点同时失败的概率变得越来越低)和业务观点(具有高复制因子,与整体成本相比,使用仲裁器节省的资金变为荒谬的小)。
助记符:
最低的不均匀数是1.
答案 1 :(得分:1)
我有一个场景,我认为有超过1个Arbiter是有意义的。
<强>问题强>
我在replicaset中有3个数据承载节点。现在我想在地理位置上分发我的复制副本,这样我就可以降低数据中心中断的风险。
3 Node Replicaset,无法解决问题
主要数据中心=&gt; 2数据承载节点
备份数据中心=&gt; 1数据承载节点
如果主数据中心已关闭且复制集中的三个节点中的两个节点不可用,则备份数据中心中的数据承载节点将无法成为主节点,因为大多数节点不可用。因此3节点配置无法解决数据中心中断的问题。
5节点复制
主要数据中心=&gt; 2数据承载节点
备份数据中心=&gt; 1数据承载节点
第三数据中心=&gt; 2 Arbiters
在此配置中,我能够维持三个数据中心中的任何一个的中断,并且仍然能够运行。
显然,更理想的配置是拥有4个数据承载节点并具有1个仲裁器。它还可以为备份数据中心提供冗余。然而,由于数据承载节点比使用3个数据承载节点和2个仲裁器的仲裁器更加昂贵,因此我更乐意放弃备份数据中心的冗余以支持节省成本。
答案 2 :(得分:0)
对于我们的特殊情况,有2个仲裁器是有意义的。让我解释一下:我们有3个数据中心,但是这3个数据中心中的1个不适合承载数据承载成员。这就是为什么我们在该数据中心为每个副本集托管2个仲裁器的原因。 replSet的3个数据承载成员托管在其他两个数据中心中(出于弹性的原因,我们希望使用3个而不是2个数据承载成员)。如果3个数据中心中的1个由于网络分区而出现故障或无法访问,则replSet仍然可以选择主数据库,因此它仍然是可读写的。仅使用1个或0个仲裁器是不可能的。因此,两个仲裁员可能有意义。
让我们看看它的外观。这是2个replSet,每个replSet在3个数据中心中具有3个数据承载成员和2个仲裁器,而DC3是受限制的数据中心:
| |DC1 |DC2 |DC3 |
|----|-----|-----|-----|
|rs1 |m1,m2|m3 |a1,a2|
|rs2 |m1 |m2,m3|a1,a2|
如果一个数据中心发生故障,哪个replSet成员将成为主要成员?