Cassandra原有数据中心重新加入集群时是否会被禁止处理读请求?
关于Cassandra原有数据中心恢复加入集群的读请求处理机制
首先直接给结论:Cassandra对重新加入集群的原有数据中心(或原有节点)的处理逻辑,和全新节点的bootstrapping完全不同,针对你描述的场景,DC1恢复后重新加入集群时,不会在数据完全同步前禁止处理读请求。
具体展开说明:
- 你的场景里,DC1是故障下线后恢复,节点本身保留着故障前的旧数据,它重新加入集群属于节点恢复流程,而非全新节点的bootstrapping。这种情况下,节点不需要全量复制所有数据,只需要同步DC2在DC1离线期间新增的写入数据(也就是增量同步/修复)。
- 在增量同步的过程中,该节点默认是可以正常处理读请求的——不过需要注意,此时读请求可能返回离线前的旧数据(因为部分新增数据还没同步完成)。如果你的业务对数据一致性要求极高,不能接受旧数据,可以通过以下方式控制:
- 调整
dc_local_read_repair_chance或read_repair_chance参数,提升读修复的概率,让节点在处理读请求时自动同步最新数据(但这会带来一定的性能开销); - 暂时将DC1从客户端的读路由策略中排除,等节点完成全量修复后,再重新纳入读请求的处理范围。
- 调整
- 而全新节点的bootstrapping之所以会在数据复制完成前拒绝读请求,是因为节点本身没有任何数据,无法返回有效结果;但恢复的原有节点有基础数据,只是补全缺失的增量,所以Cassandra允许它处理读请求。
另外补充一点:如果DC1的节点是被完全清空数据后重新加入(相当于全新节点),那才会触发bootstrapping流程,此时才会在数据同步完成前禁止处理读请求,但这和你描述的“恢复原有DC”的场景不符。
内容的提问来源于stack exchange,提问作者Glide
相关产品推荐
相关产品推荐

