药片是随机分布的吗?我的意思是:如果一个节点出现故障,故障节点上的平板电脑负载是在剩余可用节点之间平均分配还是转移到另一个对等节点?前者将是非常可取的。换句话说,YugabyteDB 是否会在 Cassandra 中自动执行类似虚拟节点/令牌的操作?
1 回答
在 YugabyteDB 中,Tablet 以负载均衡的方式分散在各个节点上。
特别是,当一个节点出现故障时,负载会均匀地分布在剩余的合格节点上。[请参阅下面的示例,了解为什么需要考虑“合格”节点。] 故障节点的负担不仅仅归于一个对等节点。所以,是的,您可以像虚拟节点一样获得 Apache Cassandra 的好处,但是是自动的。这一点在不同的 YugabyteDB API(YSQL 和 YCQL)中都是正确的。
举个例子:
假设您有一个 9 节点集群单个 DC 集群,每个节点有 96 个平板电脑。假设复制因子 (RF) 为 3,每个节点将成为其中 1/3 的领导者——大约 32 个平板电脑,以及其中 2/3 的跟随者——大约 64 个平板电脑。
当一个节点宕机时,剩下的 8 个节点会以相当均匀的方式承担更多的责任。最初,32 个领导者将分布在 8 个节点中——因此每个节点将成为约 4 个额外平板电脑的领导者。当追随者几次心跳都没有收到领导者的消息时,这种故障转移会相当激进地发生。
如果节点长时间处于停机状态,那么这些复制不足的 96 个 tablet(RF=2)将再次以统一的方式使用剩余的 8 个节点恢复到 RF=3。
在多区域设置中,并非所有节点都符合条件。例如,在复制因子 (RF) 为 3 的 15 节点、3 区域设置(每个区域中有 5 个节点)中,如果区域中的一个节点出现故障,则该区域中只有剩余的 4 个节点会结束以均匀的方式承担故障节点的负载。这是因为数据放置仍然需要尊重跨区域复制数据的约束。我们不希望数据的多个副本最终位于同一区域。