转载自:http://blog.163.com/liaoxiangui@126/blog/static/795696402012121112831272/
1.背景
Gossip算法又被称为反熵(Anti-Entropy),熵是物理学上的一个概念,代表杂乱无章,而反熵就是在杂乱无章中寻求一致,这充分说明了Gossip的特点:在一个有界网络中,每个节点都随机地与其他节点通信,经过一番杂乱无章的通信,最终所有节点的状态都会达成一致。每个节点可能知道所有其他节点,也可能仅知道几个邻居节点,只要这些节可以通过网络连通,最终他们的状态都是一致的,当然这也是疫情传播的特点。
要注意到的一点是,即使有的节点因宕机而重启,有新节点加入,但经过一段时间后,这些节点的状态也会与其他节点达成一致,也就是说,Gossip天然具有分布式容错的优点。
Gossip是一个带冗余的容错算法,更进一步,Gossip是一个最终一致性算法。虽然无法保证在某个时刻所有节点状态一致,但可以保证在”最终“所有节点一致,”最终“是一个现实中存在,但理论上无法证明的时间点。
因为Gossip不要求节点知道所有其他节点,因此又具有去中心化的特点,节点之间完全对等,不需要任何的中心节点。实际上Gossip可以用于众多能接受“最终一致性”的领域:失败检测、路由同步、Pub/Sub、动态负载均衡。
但Gossip的缺点也很明显,冗余通信会对网路带宽、CPU资源造成很大的负载,而这些负载又受限于通信频率,该频率又影响着算法收敛的速度,后面我们会讲在各种场合下的优化方法。
2.基本概念
gossip分为两种. 本文只讨论anti-entropy
■anti-entropy 只要数据不同步,就开始同步数据
■rumor mongering 每隔固定的时间同步数据
见公式(1). 此公式表示在节点p上,q节点的属性k的值是v,其版本号是n。
为了保证一致性,规定数据的value及version只有宿主节点才能修改,其他节点只能间接通过Gossip协议来请求数据对应的宿主节点修改,即m (p)只能由有节点p来修改。
anti-entropy协议通过版本号大小来对数据进行更新。
两个节点(A、B)之间存在三种通信方式:
■push-gossip: A节点将数据推送给B节点,B节点更新A中比自己新的数据
■pull-gossip:A仅将摘要数据 (node,key,value,version)推送给B,B根据摘要数据来选择那些版本号比A高的数据推送给A,A更新本地。
■push-pull gossip:与pull类似,只是多了一步,A再将本地比B新的数据推送给B,B更新本地。
如果把两个节点数据同步一次定义为一个周期,则在一个周期内,push需通信1次,pull需2次,push/pull则需3次。从效果上来讲,push/pull最好,理论上一个周期内可以使两个节点完全一致。直观上也感觉,push/pull的收敛速度是最快的。
3.数据同步(RECONCILIATION)
3.1精确同步(precise reconciliation)
精确同步希望在每次通信周期内都非常准确地消除双方的不一致性,具体表现为相互发送所有对方需要更新的数据。实现过程中,精确同步很难做到。因为摘要数据过多,但Gossip消息存在大小限制。因此每次选择发送哪些数据就成了问题。
3.2整体同步(Scuttlebutt reconciliation)
节点会维护一个唯一的时间戳生成器, 时间戳生成器为各个属性生成时间戳,时间戳的值单调递增。节点在生成摘要数据时,每个节点只有一份数据{node,最大时间戳)。需要传输的摘要数据和同步的实体数据的量大大的减少了。
对于敏感的网络而言,可能同步的实体数据还是太多,还存在选择发送哪些数据的问题,如下的原则需要遵守:Scuttlebutt requires that if a certain delta (r; k; v; n) is omitted, then all the deltas with higher version numbers for the same r should be omitted as well.。即低版本号的实体数据比高版本号的实体数据的优先级高。
要实现上述原则有2种方法。
■广度优先(scuttle breadth)
出发点是对每个节点都公平。
It uses a ranking on deltas for the same participant. The delta with the lowest version number has rank 0, the next lowest rank 1, and so on. The deltas are first ordered by rank so that deltas with lower ranks are included before deltas with higher ranks.
■深度优先(scuttle-depth)
相比广度优先,此方法对所有节点不公平。待传输的数据(delta data)越多,其优先级越高。这个方法要好于以上方法,但是作者没有进行解释。
4.流控(flow control)
待研究。。。。。