您的位置:首页 > 编程语言 > Go语言

【Cassandra】Gossip协议

2017-10-17 08:12 387 查看
因为Cassandra数据库的高并发优势,决定学习一下。都说它是列族数据库,这里所谓的列族其实是因为其数据模型和底层数据的存放来命名的。数据模型中Cassandra以Column来定义,其实和文档型数据库差别没有特别大,但是底层有差别,底层每一个定义的Column都有索引,所以Cassnadra在定位一个key对应的column时效率很高。

今天主要学了下Cassadra集群的通信原理,即Gossip协议。

在分布式存储中,冗余技术是提高系统容灾能力和高响应的手段。那么如何保证数据一致性呢?在MongoDB中,主要是一种主从的架构,写入只能对master,其余的节点则周期性的读取master的日志来更新自己。这种模式虽然实现起来更简单,不过master可能存在瓶颈。

Cassandra使用了另一种集群构架,即无主集群,没有master节点,所有节点都一样,这样系统的稳定性更高。在无主集群中,Gossip协议就是节点与节点之间同步的方式。其基本的思路是每一节点都周期性地和周围的节点交换信息,然后更新自己,那么经过一定时间,最终的系统会收敛到一个稳定的状态。

假设有a,b两个节点,二者需要同步信息,那么有3种方式:

(1)push,a把自己的信息传递给b,然后b直接更新

(2)pull,b把自己的想要的信息列表发给a,a收到以后根据b想要的数据发回给b

(3)pull-push,a把自己想要的信息list和自己本地的信息快照info发给b,b根据info来跟新自己的信息,同时按照list来返回a感兴趣的信息,a收到以后再更新自己的信息

Cassandra使用的是(3),这种方式是均等的,会有3次发送,但是发送完以后双方都可以更新彼此的信息。

在Cassandra中,任何一个节点既是提供方也是索求方,DigestList是每一个节点数据的快照,与时间有关。

如果a想和b同步,那么a会先发一个GossipDigestSynMessage的信息给b,里面包含了a自己的DigestList信息。

b节点收到GossipDigestSynMessage以后,会根据a的DigestList来对比包括自己的信息,之后根据这个对比就可以知道b有哪些数据是比a落后的,有哪些数据是比a新的。从而b就可以计算出以下两个数据:

(1)deltaGossipDigestList,这个消息是b对比以后发现自己落后于a的,然后希望a返回这些具体的信息。

(2)deltaEPStateMap,这个消息是b对比以后发现自己领先于a的,那么a之后会根据这个来更新自己。

这两个数据会被包装进GossipDigestAck中,然后发给a。

a收到GossipDigestAck以后,就会根据deltaEPStateMap来更新自己,同时根据deltaEPStateMap来返回b需要的数据,这个手会被包装进GossipDigestAck2数据中,发回给b。

当b收到以后,就会更新自己。

Cassandra集群中的每一个节点都会按照上述方式来与其他节点交换信息。最终会收敛为一致性状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息