Cassandra 是否会阻止现有数据中心在重新加入集群时为读取请求提供服务?

Does Cassandra prevent an existing datacenter from serving read requests when it rejoins a cluster?

我知道 Cassandra 足够聪明,在引导新节点并加入集群时不会处理任何读取请求,直到所有数据都已复制到该节点。

问题是,对于重新加入集群的现有数据中心,Cassandra 的行为是否相同?具体针对以下场景:

如果我有 2 个 DC,DC1 用于所有 reads/writes,DC2 仅用于备份。如果 DC1 出现故障并且 DC2 接管所有写入。当DDC1现在回来的时候,Cassandra是否会阻止DC1的读请求,直到所有数据都被完全复制。

Question is, does Cassandra behave the same for an existing datacenter rejoining a cluster?

如果您遵循标准的数据中心构建过程,其中空节点被站立起来,然后通过 nodetool rebuild 过程流式传输数据,那么答案是 "not necessarily." 重建节点不会'与引导它的工作方式不同,因此,它可能仍会尝试为请求提供服务。

当然,硬币的另一面是,您的应用程序团队不应部署或激活任何默认服务或 "sticky" 到新的或 "rejoining" 数据中心,直到你给他们 ok。这就是为什么所有客户端应用程序都应指定默认数据中心并为其键空间使用 NetworkTopologyStrategy 的原因之一。

If I have 2 DCs and DC1 is used for all reads/writes and DC2 is just for backup. If DC1 goes down and DC2 takes over for all the writes. When DC1 comes back now, does Cassandra prevent DC1 from read requests until all data has been fully replicated?

在这种情况下,答案是 "no" 它不会阻止 DC1 为请求提供服务。如果一个应用粘在 DC1 上,并且它存在,那么无论它的数据是否不同步,它都会为请求提供服务。如果是我,我会使用 Reaper 确保在 DC1 上修复 运行,并告诉我的应用程序团队将他们的 apps/services 配置为仅使用 DC2,除非另有说明。