本篇来回答上一篇的问题: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:下面的内容基于对一致性哈希的了解。
数据分布——一致性哈希
<