日期:2017.8.15
Gossip是p2p通信时候,广泛使用的一种协议。
具有以下特点:
最终一致性。
明确的收敛速度O(n²)和时间复杂度O(logn)
较强的网络容错性
依据节点工作方式分为两种类型:
Anti-Entropy(反熵):以固定的概率传播所有的数据
Rumor-Mongering(谣言传播):仅传播新到达的数据
Anti-Entropy模式有完全的容错性,但有较大的网络、CPU负载;Rumor-Mongering模式有较小的网络、CPU负载,但必须为数据定义”最新“的边界,并且难以保证完全容错,对失败重启且超过”最新“期限的节点,无法保证最终一致性,或需要引入额外的机制处理不一致性。
协调机制:
精确协调
每个数据项维护版本号
整体协调
整体维护版本号,依据数据多少进行排序
通信模式:
Push: 节点 A 将数据 (key,value,version) 及对应的版本号推送给 B 节点,B 节点更新 A 中比自己新的数据
Pull: A 仅将数据 key, version 推送给 B,B 将本地比 A 新的数据(Key, value, version)推送给 A,A 更新本地
Push/Pull: 与 Pull 类似,只是多了一步,A 再将本地比 B 新的数据推送给 B,B 则更新本地
网络负载:
Gossip集群节点中会随机选择几个节点发送消息,其他节点在随机选择几个节点发送,取代了遍历发送。节省了网络负担
身份验证:
每个节点都维护一份证书的映射表,同时自己存有证书的私钥。以节点证书的hash为值,叫做PKI-ID
在节点通信中,验证发送消息时带有证书的hash值和证书,同时对此进行签名,对端节点验证证书的有效性,通过验证签名正确与否来选择相信这个节点。
节点选举:
节点启动15秒后,开始选举,总体规则使用PKI-ID字母顺序,选择靠前的节点。
区块获取:
1.节点定期检查本地区块的序列号,小,则广播获取,收到的数据和已提交区块序列号连续了,就存入账本
2.从排序服务获取区块,主节点从排序服务获取一个区块后,广播给其他节点。
Gossip 的缺陷:
1.消息的延迟 节点只会随机向少数几个节点发送消息,消息最终是通过多个轮次的散播而到达全网的
2.消息冗余 节点会定期随机选择周围节点发送消息,而收到消息的节点也会重复该步骤,因此就不可避免的存在消息重复发送给同一节点的情况,造成了消息的冗余
基于memberlist的gossip实现:http://vearne.cc/archives/584
memberlist源码使用分析:https://lrita.github.io/2017/05/14/hashicorp-memberlist/#alive