为何Cassandra以复制因子RF=1横向扩容时数据会无法访问?
核心原因
- 一致性哈希拓扑更新导致路由不匹配:Cassandra基于一致性哈希算法分配token区间,每个key对应唯一的token区间,由对应负责的节点存储数据。从2节点扩容到4节点后,集群整体token区间会重新划分,原本属于旧2节点的部分token范围会被映射到新加入的2个节点上。cqlsh驱动会默认读取最新的集群拓扑,将读请求按照新的token映射规则发送到对应负责节点,但新节点在扩容完成后如果没有执行数据同步操作,并不持有对应范围的数据,自然返回查询为空。
- RF=1无冗余副本兜底:复制因子为1时,每个key仅存在1份副本,读请求没有其他备用副本可以查询。如果RF≥2,即使负责主区间的节点没有数据,驱动还可以尝试查询其他副本节点,这也是你将RF调整为3后可以正常读取数据的核心原因:RF调整后集群为每个key额外复制了2份副本,读请求可以命中原本存储数据的旧节点。
- 数据未丢失是因为旧节点未清理冗余数据:扩容完成后如果没有执行
nodetool cleanup命令,旧节点会一直保留原本属于自己、现在已经被划分到新节点负责范围的那部分数据,所以你通过备份检查可以确认数据存在,只是正常读请求不会再路由到旧节点查询这部分数据。
对应操作建议
- RF=1场景下扩容,新节点加入后必须执行
nodetool rebuild <目标键空间名>,触发新节点从其他节点拉取自己负责区间的全部数据,完成同步后再对外提供读写服务。 - 确认所有节点数据同步完成后,再执行
nodetool cleanup清理旧节点上的冗余数据,避免同步过程中误删数据。 - 生产环境建议将复制因子设置为3,兼顾可用性和容错能力,避免单节点故障导致数据不可访问。
相关运行版本:
[cqlsh 5.0.1 | Cassandra 3.11.6 | CQL spec 3.4.4 | Native protocol v4],上述行为属于该版本的正常设计逻辑,并非程序BUG。
内容的提问来源于stack exchange,提问作者Shinnosuke Okada
相关产品推荐
相关产品推荐

