参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/architectureDataDistributeAbout_c.html#concept_ds_g43_g3f_fk
在Cassandra中,数据分配和复制是同时进行的。这是因为Cassandra被设计为一个点对点的系统,数据有多个复制,被分发到一组节点上。数据按照表的形式构建以主键进行标识。主键决定了数据存储在那一个节点上面。Cassandra是一个面向行的数据库,行的副本就称其为复制。当数据第一次被写入的时候,就被称为是一个复制。
当你创建集群的时候,你需要指定一下属性:
Virtual nodes(虚拟结点): 指定数据属于那个物理机器
Partitioner(分区器): 决定了集群中数据如何分区
Replication strategy(复制策略): 决定如何进行每个数据行的复制
Snitch(告密者): 定义了复制策略放置数据复制所采用的拓扑信息
一、一致性哈希
详细说明在Cassandra集群中,一致性哈希机制是如何分发数据的。
采用一致性哈希对数据进行分析是基于主键的。以以下数据为例:
jim | age: 36 | car: camaro | gender: M |
carol | age: 37 | car: bmw | gender: F |
johnny | age: 12 | gender: M | |
suzy | age: 10 | gender: F |
|
Cassandra 通过计算为每个主键分配了一个hash值。
Primary key | Murmur3 hash value |
---|---|
jim | -2245462676723223822 |
carol | 7723358927203680754 |
johnny | -6723372854036780875 |
suzy |
1168604627387940318 |
在集群中的每个节点基于哈希值负责一段连续范围内的数据。
Node | Murmur3 start range | Murmur3 end range |
---|---|---|
A | -9223372036854775808 | -4611686018427387903 |
B | -4611686018427387904 | -1 |
C | 0 | 4611686018427387903 |
D | 4611686018427387904 | 9223372036854775807 |
Cassandra根据主键的哈希值将数据放置在主键所在范围内的节点。
Node | Start range | End range | Primary key | Hash value |
---|---|---|---|---|
A | -9223372036854775808 | -4611686018427387903 | johnny | -6723372854036780875 |
B | -4611686018427387904 | -1 | jim | -2245462676723223822 |
C | 0 | 4611686018427387903 | suzy | 1168604627387940318 |
D | 4611686018427387904 | 9223372036854775807 | carol | 7723358927203680754 |