You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 13:24:10