Cassandra数据分布和副本

原文

      Cassandra中数据分布和数据副本是分不开的。这个因为Cassandra被设计为一个在一组节点之间数据备份和分布的点对点的系统。数据由表组织,并通过行健———主键标识。主键决定数据存储在哪个节点。行的备份被称为副本。当数据第一次写入,这份数据也被称作为一个副本。

         当你创建一个集群时,你必须指定如下信息:
        1、虚拟节点:分配数据所有权到物理机器
        2、分区器:决定了集群中数据的分布
        3、副本策略:定义每行数据的副本放置策略
        4、Snitch:定义网络拓扑信息,以便副本策略放置副本

一致性哈希

        这部分将更详细讲解一致性哈希机制在Cassandra集群是如何分配数据的。一致性哈希分区数据基于主键。例如,如果你有如下数据:

Cassandra数据分布和副本_第1张图片

Cassandra会为每个主键分配一个哈希值(分区器使用的是Murmur3Partitioner):

Cassandra数据分布和副本_第2张图片

集群中的每个节点负责哈希环上的一个范围(如果有虚拟节点,每个节点配置有256个,则有哈希环上的256个哈希值范围):

Cassandra数据分布和副本_第3张图片

Cassandra根据主键和节点负责的哈希值范围来存储数据。例如在4个没有虚拟节点的集群里,上面例子的数据在Cassandra集群的分布如下:

Cassandra数据分布和副本_第4张图片


存在虚拟节点的集群是如何分布数据的

       在Cassandra1.2之前,你必须计算和分配一个单独的令牌给集群中的每个节点。根据其哈希值每个令牌决定了节点和部分数据在哈希环的位置。尽管Cassandra1.2之前的一致性哈希设计在增加或删除节点时允许移动数据,但它仍然需要做大量的工作。

       从Cassandra1.2开始,Cassandra每个节点可以拥有很多个令牌(哈希范围)。这种新的模式叫做虚拟节点。虚拟节点允许每个节点拥有很多集群中哈希范围。虚拟节点也是用一致性哈希分布数据,但是是用它却不需要生成和分配令牌。

Cassandra数据分布和副本_第5张图片

       图片的上部分是没有虚拟节点的集群。每个节点需要分配一个单独的令牌以表示它在哈希环上的位置。每个节点存储数据由行健映射的令牌值对应的哈希值范围来决定。每个节点也包含集群中其它节点的数据的副本。例如,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数据分布系列文章:

  1. Cassandra数据分布之1数据中心和机架
  2. Cassandra数据分布和副本
  3. Cassandra数据分布之3概念之间的联系
  4. Cassandra数据分布之4机架感应
  5. Cassandra数据分布之5分区器
  6. Cassandra数据分布测试

你可能感兴趣的:(NoSQL,Cassandra,Cassandra)