说明:本篇基于Cassandra1.2.0版本。
在Cassandra中,关于数据分布的部分存在数据中心、机架、虚拟节点、副本、副本策略、分区器等概念,它们密不可分,有时又容易混淆不易理解。今天我稍微做个总结,希望能起到抛砖引玉的作用,欢迎讨论。
网络拓扑结构
为了便于Cassandra未来的扩展,一般会配成数据中心和机架感应模式。简单一点的架构图可以如下图。
上图灰色部分的意思是此网络拓扑结构是通过cassandra-topology.properties来配置(当然也可以使用IP来区分的方式)的。如果要此配置生效,还需要在cassandra.yaml修改endpoint_snitch为PropertyFileSnitch。
虚拟节点
使用虚拟节点的好处,可以参考这里。在cassandra1.2.0的配置中没有配置虚拟节点,需要在cassandra.yaml中将num_tokens: 256前面的注释去掉。
在cassandra的多数据中心的集群中,每个数据中心的数据是完全一样的。单个数据中心的所有节点的虚拟节点会随机分布在哈希环上。如果1个数据中心有2个节点,每个节点的虚拟节点是256,那么哈希环会被平均分成512份。每一份也称为一个哈希范围。每个节点虚拟节点的哈希范围不是连续。
cassandra中的每一份数据都称为一个副本,副本没有主次之分,同等重要。而数据的副本和副本策略是针对keyspace来说的,即一份数据有多少个副本,使通过其所属的keyspace来配置。如下面这段:
CREATE KEYSPACE cltest
with placement_strategy = 'org.apache.cassandra.locator.NetworkTopologyStrategy'
and strategy_options = {'DC1' : 2 , 'DC2' : 2}
这里cltest使用副本策略为
NetworkTopologyStrategy,副本因子为4,两个数据中心各2个副本,每个数据中心副本数也可以不一样。
那我们存储的数据是如何对应到相应的虚拟节点的呢?这就该分区器出场了。
分区器
我们存储的数据都会有一个key,存储的时候分区器对key哈希后得到一个哈希值(此哈希值必是哈希环上一个值),然后根据此哈希值找到对应的哈序范围,也就找到虚拟节点了。推荐使用Murmur3Partitioner。分区器在cassandra.yaml文件中partitioner处配置。
总结:本文说明了Cassandra数据分布的几个大的概念,其中联系文中没有太明示,其实就是文中展示的从大到小的一个关系。
Cassandra数据分布系列文章: