欢迎投稿

今日深度:

cassandra的架构——Data distribution and replication(分布式存储和复制),

cassandra的架构——Data distribution and replication(分布式存储和复制),


    本篇来回答上一篇的问题:cassandra选择了CAP中的AP,但没有撇下C,他是如何做到的?或者会出现下面的问答。

Q:原来只有一台服务器的时候,一旦当机,我们就只能等着了。。。现在我们有了分布式集群,妈妈再也不用担心我不能提供服务了吗?

A:当然,我们把数据分散在了不同的机器上,一台机器倒下了,千百个机器(前一台机器的复本)站出来。

Q:①如何均匀的分散数据到集群的不同机器上,以分担负载,避免热点(hot spot)?

       ②如何选择其他的机器作为我的复本机器呢?

       ③其中一台机器当机了,它存储的数据怎么办?我又新加了一台机器,怎么把数据分给它?


cassandra的架构是一个Peer-to-Peer(点对点)分布式模型,与现行的master-slave的主从结构不同处在于:

  • master-slave:master节点负责接收数据,slave节点从master节点处复制数据,会有潜在的单点故障(single point of failure)
  • Peer-to-Peer:所有的节点在结构上都是等同的,所有的节点都可以接收数据,并把数据分发给关联的节点去复制,从而避免了单点故障
    针对这些结构上对等的数据节点和它将要存储的数据,cassandra使用一致性哈希(consistent hashing)来解决上述几个问题(借鉴了Dynamo的设计),在cassandra1.2之前,没有引入virtual Node的结构,单纯的使用一致性哈希ring,1.2之后使用了virtual node的设计,这一点也许也是认可了Dynamo的设计。PS:下面的内容基于对一致性哈希的了解。
数据分布——一致性哈希
下图中的A—G七个节点通过hash函数计算出的在ring的位置(注意:它们的位置实际上不会如图中分布的这么均匀),一个需要存储的以K为key的数据,同样通过同一个hash函数计算出它在ring中的值,从这个值顺时针找到第一个碰到的节点B,即把此条数据存储在节点B上,同时为了保证可用性,需要将B上的数据复制到其他节点上,如果设定的replication_factor是N,则从B开始顺时针的N-1个节点作为他的复本节点。
但是上面的这种设计存在一些问题:
数据分布——虚拟节点(virtual node)
Dynamo 先来看一下Dynamo是如何利用虚拟节点的。 于是出现了virtual node的设计,即在ring上计算出多个位置(token),多个token对应一个真实的节点机器,也就是几个token上的数据都存在同一台节点机器上。 下图是关于利用Vnode来分割数据的策略演变。

图例说明:包括A,B,C在内的箭头代表实际节点机器计算出来的虚拟节点位置,每台实际节点机器的虚拟节点是随机分布的,不是顺序的;阴影区域表示存储在A,B,C上的数据区间;k1是一条数据的key。 S:实际节点机器数
T:每个实际节点机器生成的虚拟节点数
N:每条数据需要存储的节点数(replaction_factor:复本因子)
Q:环上的分区区间(patition)个数

策略1:图中Strategy 1的分配策略和未使用虚拟节点的策略一样,但是通过增加节点数均化分割区间大小,以及同一台实际节点机器的虚拟节点的随机分布,降低了负载不均的概率。由此也会带来一些问题,例如:一旦有一个新的Vnode加入到ring中,例如若B是后加进来的节点,则原来存储在C节点上的A-B区间上的数据就要复制到B节点上,而确定哪些数据是在A-B之间的需要扫描C节点上的所有数据,这非常耗时。
策略2:如图Strategy 2,把整个环的哈希空间分割成等大小的Q个区间(Q >> N, Q >> S * T),机器节点的位置,与Strategy 1一样。每个分区(partition)的末端沿着顺时针方向遇到的前N个VNode,即为该分区数据的存储节点。
策略3:与策略2类似,也是均分哈希空间为Q个等大小的partition,并且每个VNode分配的patition个数为Q/S。如图Strategy 3,VNode的位置不是每个实际节点机器计算出来的,而是每个partition的末端,这些位置分配给不同的实际节点机器。
Cassandra Cassandra1.2前后,它的分布式策略和复制,也从原始一致性哈希发展出类似Dynamo策略3的策略。

上图下半部分,对于N=3,S=6,Q=16,A-P这16个虚拟节点并没有重复被不同的6个真实节点拥有,1个虚拟节点只被1个真实节点拥有(图中的形式比较容易让人误解)。
比如虚拟节点A,当一条数据落在了A这个区间,由于N=3,顺时针找到B,C这两个虚拟节点,那拥有A,B,C这三个虚拟节点的真实节点将会保存这条数据,反映到图上,Node2是对虚拟节点A负责的真实节点,Node1是负责虚拟节点B的真实节点,同时也是A的副本节点,同理可知,Node5是负责虚拟节点C的真实节点,也是A的副本节点。
因此,虚拟节点并没有改变副本选择方式,仍然是顺时针寻找下N-1个节点(或者虚拟节点)。
对于性能不同的机器,可以设定不同的虚拟节点数来调节负载(配置num_tokens)。

对于最开始提出的问题③,如果S <= N,当了一台机器,在写入数据时则会出错,某些一致性要求下的读数据可以满足;如果S > N,无论是减少一台机器还是增加一台机器,涉及的都是虚拟节点对应数据partition区间的拷贝,如果每个虚拟节点的数据都存在一个文件中将会变得很容易,如果不是,则仍然会存在扫描数据的问题,具体cassandra是如何做的,目前还不清楚,如果有了解的同学,希望能回复和大家共享。
数据复制
通过设定replication_factor来决定副本节点的个数。有两种数据复制的策略可以选择:
  • SimpleStrategy:用于单个数据中心,前文中提到的副本选择策略适用于此种策略
  • NetworkTopologyStrategy:用于多个数据中心之间复制数据
数据复制——NetworkTopologyStrategy

如下图所示,多个数据中心,多机架的节点将会交替出现在ring上,只要顺时针搜寻副本节点,则数据被复制到不同的数据中心的不同机架上,从而保证数据的高可用性。(下面两张图来源于datastax关于cassandra1.0的文档,2.0没有相关变更说明)


Consistency的妥协

对于一致性consistency,Cassandra允许用户提供读写时的一致性要求,从而达到与延时(latency)之间的妥协,后面单拿一篇介绍。

参考资料:

1.关于cassandra的学习(0)中提及的主要参考资料

2.http://www.datastax.com/docs/1.0/cluster_architecture/replication

www.htsjk.Com true http://www.htsjk.com/cassandra/33651.html NewsArticle cassandra的架构——Data distribution and replication(分布式存储和复制),     本篇来回答上一篇的问题:cassandra选择了CAP中的AP,但没有撇下C,他是如何做到的?或者会出现下面的问答。...
相关文章
    暂无相关文章
评论暂时关闭