原文
Cassandra中数据分布和数据副本是分不开的。这个因为Cassandra被设计为一个在一组节点之间数据备份和分布的点对点的系统。数据由表组织,并通过行健———主键标识。主键决定数据存储在哪个节点。行的备份被称为副本。当数据第一次写入,这份数据也被称作为一个副本。
当你创建一个集群时,你必须指定如下信息:这部分将更详细讲解一致性哈希机制在Cassandra集群是如何分配数据的。一致性哈希分区数据基于主键。例如,如果你有如下数据:
Cassandra会为每个主键分配一个哈希值(分区器使用的是Murmur3Partitioner):
集群中的每个节点负责哈希环上的一个范围(如果有虚拟节点,每个节点配置有256个,则有哈希环上的256个哈希值范围):
Cassandra根据主键和节点负责的哈希值范围来存储数据。例如在4个没有虚拟节点的集群里,上面例子的数据在Cassandra集群的分布如下:
存在虚拟节点的集群是如何分布数据的
在Cassandra1.2之前,你必须计算和分配一个单独的令牌给集群中的每个节点。根据其哈希值每个令牌决定了节点和部分数据在哈希环的位置。尽管Cassandra1.2之前的一致性哈希设计在增加或删除节点时允许移动数据,但它仍然需要做大量的工作。
从Cassandra1.2开始,Cassandra每个节点可以拥有很多个令牌(哈希范围)。这种新的模式叫做虚拟节点。虚拟节点允许每个节点拥有很多集群中哈希范围。虚拟节点也是用一致性哈希分布数据,但是是用它却不需要生成和分配令牌。
图片的上部分是没有虚拟节点的集群。每个节点需要分配一个单独的令牌以表示它在哈希环上的位置。每个节点存储数据由行健映射的令牌值对应的哈希值范围来决定。每个节点也包含集群中其它节点的数据的副本。例如,E在节点5,6,1有3个副本。请注意,一个节点拥有哈希环的一个连续区域。
图片的下部分是有虚拟节点的集群。在集群中,环区域是随机的而不是连续的。一行数据的存储在行键哈希值对应的环区域所在的节点上。
(20130717补充)对于对多数据中心的哈希值范围分布,cassandra是根据集群所有节点配置的虚拟节点数(num_tokens)平均分配的。例如有4个节点的集群,每个节点配置的虚拟节点数都是256,那一致性哈希环会平均分成4*256=1024份。
使用虚拟节点
虚拟节点简化了Cassandra中的许多任务:
1、你不需计算和分配每个节点的令牌。
2、当增加和删除节点时不再需要重新平衡集群。当一个节点加入集群,它负责集群中其它节点的平均数据;如果一个节点发生故障时,负载会均匀地分布在集群中的其他节点。
3、重建一个死节点很快,因为它存储在集群中其它节点上。并且数据会以增量的方式发送,而不是等待直到验证阶段结束。
4、提高了集群中异质机器的使用。你也指定适当虚拟节点的个数。
如果想知道更多虚拟节点的信息,请参考Virtual nodes in Cassandra 1.2。
关于数据副本
Cassandra在多个节点上存储副本以确保可用性和容错。副本策略决定了副本的放置方法。集群中的副本数量被称为复制因子。复制因子为1的意思是指每行只有一个副本,复制因子为2的意思则每行有两个副本,两个副本不在同一个节点。所有副本同等重要,没有主次之分。作为一般规则,副本因子不应超过在集群中的节点的数目。但是,您可以增加副本因子,再加入所需的节点。当副本因子超过节点数,写入不会成功,但读取只要提供所期望的一致性级别即可满足。
有两种副本策略可以使用:
1、SimpleStrategy:仅用于1个数据中心的情况。
2、NetworkTopologyStrategy:对大多数部署强烈推荐使用此种策略,因为为未来的扩展需要它更容易扩展到多个数据中心。
SimpleStrategy:
仅用于单数据中心。额外的副本不考虑拓扑结构(机架和数据中心位置),按顺时针方向找出下N个需要备份的节点。
NetworkTopologyStrategy:
用于多数据中心部署。这种策略可以指定每个数据中心的副本数。在同数据中心中,它按顺时针方向直到另一个机架放置副本。它尝试着将副本放置在不同的机架上,因为同一机架会经常因为电源,制冷和网络问题导致不可用。
每个数据中心配置多少个副本取决于两个因素:(1)满足本地读取,而不会产生读其它数据中心的延迟时间;(2)故障情况。
多数据中心集群最常见的两种配置方式是:
1、每个数据中心2个副本:此配置容忍每个副本组单节点的失败,并且仍满足一致性级别为ONE的读。
2、每个数据中心3个副本:此配置可以容忍在强一致性级别LOCAL_QUORUM基础上的每个副本组1个节点的失败,或者容忍一致性级别ONE的每个数据中心多个节点的失败。
非对称副本分组也是可能的。例如,你可以在每个数据中心配置3个副本用于实时应用程序请求,一个副本用于分析。
Cassandra数据分布系列文章: