Cassandra中,数据分布和复制是同时进行的。数据通过表来组织,通过主键标识——它决定了数据被存储到哪个节点。副本就是数据行的拷贝。当数据在第一次写入的时候,也就作为第一份副本。

影响复制的因素:

Virtual nodes(虚拟节点):分配数据所有权到物理机

Partitioner(分割器):分割集群中的数据

Replicationstrategy(复制策略):决定每行数据的副本

Snitch:定义存储副本的复制策略的拓扑结构

一致性hash

一致性哈希允许分布在集群中的数据在节点增加或减少时最小化重组。一致性哈希是通过主键分割数据的。例如我们有下面的数据:

Cassandra教程(5)---- 数据分布和复制_文档

Cassandra为每个分区键分配一个哈希值。

Cassandra教程(5)---- 数据分布和复制_教程_02

集群中的每个节点通过哈希值负责维护一定范围的数据。

Cassandra教程(5)---- 数据分布和复制_文档_03

Caasandra通过分区键和其负责的数据范围存储数据到每个节点。例如,在四个节点的集群中,例子中的数据是这样分布的:

Cassandra教程(5)---- 数据分布和复制_文档_04

但是一致性哈希的路由算法尚有不足之处。在查询过程中,查询消息要经过O(N)(O(N)表示与N成正比关系,N代表系统内的节点总数)才能到达被查询的节点。不难想象,当系统规模非常大时,节点数量可能超过百万,这样的查询效率显然难以满足使用的需要。换个角度来看,即使用户能够忍受漫长的时延,查询过程中产生的大量消息也会给网络带来不必要的负荷。

 虚节点

1.        虚节点简化了Cassandra的任务处理:

2.        不需要计算和分配令牌到每个节点;

3.        不需要在新增或减少节点后重新平衡集群。当节点加入到集群后,该节点假设自己负责集群中其他节点数据的一部分。当节点挂掉后,负载将转换到集群中的其他节点

4.        重建一个挂掉的节点非常快,因为它自动融入到集群中的其他节点;

5.        改善了集群中异构机器的使用效果,可以按照机器的配置分配不同的虚拟节点(就是说可以让高配置的集群承担多的工作)。

那么数据是如何通过虚拟节点在集群中分布的呢?

在以前的1.2版本,我们必须计算并分配唯一的令牌给集群中的节点。每个令牌决定了节点在环中的位置以及通过哈希值计算到的数据。从1.2版本开始,Cassandra允许每个节点拥有多个令牌。这种新的范式叫做虚拟节点(vnodes)。虚拟节点(vnodes)允许每个节点拥有许多分布到集群中的小的分区范围。虚拟节点(vnodes)通过一致性哈希分布数据而不通过请求产生令牌和相关的任务。

数据复制

Cassandra存储副本到多个节点确保可靠性和故障恢复能力。复制策略决定了在哪个节点存储副本。

集群中的副本数量也就是复制因子。如果复制因子是1,那么就表示集群中只有一个行的一个拷贝。复制因子是2表示每个行有两份拷贝,当然它们是存储在不同的节点上的。

目前有两个复制策略SimpleStrategyNetworkTopologyStrategy

SimpleStrategy:只能用于一个数据中心的情况。

SimpleStrategy把第一份数据放到哪个节点取决于分割器,其他的副本放到环中顺时针的下一个节点(不考虑拓扑关系,也就是机架或数据中心)。

NetworkTopologyStrategy:如果想要以后方便扩展,那么强烈推荐这个策略。

如果你想要有多个数据中心,那么就选NetworkTopologyStrategy这个策略。它指定了在每个数据中心存储的副本数。 NetworkTopologyStrategy在直到到达其他机架的第一个节点时都通过顺时针的方式存储副本在同一个数据中心。 NetworkTopologyStrategy尝试把数据放到其他机架,因为同一个机架可能会因为同样的原因挂掉。

当决定在每个数据中心放置几份副本时,有两个主要考虑的地方:(1)本地读,防止跨机房,(2)故障场景。下面是在配置多个数据中心通常的做法:

每个数据中心两份副本:这种配置容忍每个副本组在单一节点失效并能在一致性为ONE的时候允许本地读。

每个数据中心三份副本:这种配置容忍一个节点在强一致性标准LOCAL_QUORUM下失效或者在一致性标准ONE下有一个数据中心多个节点失效。

非对称的复制分组也是可以的。比如,可以在一个数据中心使用三份副本处理实时应用程序的请求,然后在其他地方使用一份副本处理分析。

选择keyspace的复制选项

为了设置keyspace的复制策略,可以查阅CREATEKEYSPACE命令。

当使用NetworkToplogyStrategy策略创建keyspace时,你将使用为snitch定义的数据中心名字。为了把副本存储到正确的位 置,Cassandra要求使用snitch配置的数据中心名字来定义keyspace。例如,如果集群使用PropertyFileSnitch,那么 在创建keyspace的时候就需要在cassandra-topologies.properties文件中定义用户自定义的数据中心名和机架名。如果 使用EC2Snitch,就需要定义EC2的数据中心和机架名(一般国内暂时用不着)。