如何在Cassandra集群节点间实现数据分片而非全量复制?
关于Cassandra集群数据分片存储的问题解答
首先直接给结论:你的需求没办法通过当前的Keyspace配置实现,但问题不是你漏了什么配置,而是对Cassandra的复制机制理解有点偏差。
咱们来拆解下原因:
- 你创建Keyspace时设置的
dc1: 2是复制因子(Replication Factor, RF),它的作用是指定每个数据分片(token range)在对应数据中心里要保留多少个副本。当RF=2时,dc1里的每一段分片数据都会在两个节点上各存一份——这完全是Cassandra的正常行为,所以你写入4行数据,两个节点都有全量副本是必然的。 - 再看你贴的
nodetool status输出,两个节点的Owns (effective)分别是50.3%和49.7%,这说明集群的token范围已经正确分片了,每个节点本来就负责一半的token区间。但因为RF=2,每个节点既要存自己负责的分片,还要存另一个节点分片的副本,结果就是每个节点都有全量数据。
那怎么实现你要的“两个节点各存一半数据”呢?
你需要把Keyspace的复制因子改成1,执行这条修改语句:
ALTER KEYSPACE dcTest WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'dc1' : 1 };
修改完成后,记得运行nodetool repair让集群同步数据。之后新写入的数据只会在一个节点上保存,每个节点会存储大约一半的数据量(因为Cassandra是按token范围分片,不是精确按行数拆分,所以4行的话可能是2和2,也可能是1和3,取决于partition key的token分布)。
最后提个重要的注意点:
RF=1意味着没有数据冗余,一旦其中一个节点挂了,它负责的那部分数据就彻底无法访问了。如果是生产环境,这种配置风险很高,你需要在“节省存储”和“高可用性”之间做权衡。
内容的提问来源于stack exchange,提问作者user7866584
相关产品推荐
相关产品推荐

