双DC各3节点Cassandra集群单DC宕机时能否提供一致数据服务?
问题解答
答案取决于你创建Keyspace时使用的复制策略,分两种核心场景说明:
1. 使用默认的SimpleStrategy复制策略
如果你仅设置全局复制因子RF=3(例如执行语句:CREATE KEYSPACE myks WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};),Cassandra会将3个数据副本随机分布在整个6节点集群中,副本大概率跨两个DC分散(比如2个在DC1、1个在DC2)。
当其中一个DC宕机时,存活DC内的副本数量会不足3:
- 无法保证数据完整性:部分数据的唯一副本可能仅存在于宕机的DC中,存活节点没有完整数据集;
- 无法保证强一致性:如果读一致性级别用
QUORUM,需要至少2个副本响应,但存活节点可能凑不够这个数量,只能降级用ONE,但ONE可能读取到未同步的旧数据。
这种场景下,存活DC无法提供具备完整数据一致性的服务。
2. 使用NetworkTopologyStrategy复制策略
如果按数据中心分别配置复制因子(例如执行语句:CREATE KEYSPACE myks WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1': 3, 'DC2': 3};),每个DC都会持有全部数据的3个完整副本。
当其中一个DC宕机时,另一个DC的3个节点拥有完整的数据集,此时只要应用层配合设置合适的一致性级别:
- 写操作使用
LOCAL_QUORUM:在存活DC内的3个副本中,至少2个写入成功才返回,保证数据写入的一致性; - 读操作使用
LOCAL_QUORUM:从存活DC内的3个副本中读取至少2个,取最新版本,保证读取数据的一致性。
这种场景下,存活DC可以为应用提供具备完整数据一致性的服务。
内容的提问来源于stack exchange,提问作者Gajendran Ravindran
相关产品推荐
相关产品推荐

