Gossip思想的算法?(学校作业向,并非标准算法。)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gossip思想的算法?(学校作业向,并非标准算法。)相关的知识,希望对你有一定的参考价值。

首先说点没用的:

  在老师留下这份作业的时候,说的大致意思是这样的(T T因为讲作业内容那节课翘掉了,导致关键东西没听到什么也不明白滚回来自学。):

  你们作业做出来大致是这个意思的就行:“就是节点再获得信息之后,想要获得信息的欲望弱了。也就是每次兴趣的逐渐减少,衰减”,体现出这个思想就行,要求P2P的,N个nodes什么的。

  另外老师补充道:要想研究标准的这个算法,一定要去找他的论文,网上大部分都是不标准的。所以你们只要体现出来这个思想就ok。

  先自己查一波资料(并不能看太懂):这个算法是干这个活的——gossip 是一种弱一致算法,也就是最终一致性算法。

Gossip本质

Gossip是一个带冗余的容错算法,更进一步,Gossip是一个最终一致性算法。虽然无法保证在某个时刻所有节点状态一致,但可以保证在”最终“所有节点一致,”最终“是一个现实中存在,但理论上无法证明的时间点。

因为Gossip不要求节点知道所有其他节点,因此又具有去中心化的特点,节点之间完全对等,不需要任何的中心节点。实际上Gossip可以用于众多能接受“最终一致性”的领域:失败检测、路由同步、Pub/Sub、动态负载均衡。

但Gossip的缺点也很明显,冗余通信会对网路带宽、CUP资源造成很大的负载,而这些负载又受限于通信频率,该频率又影响着算法收敛的速度,后面我们会讲在各种场合下的优化方法。

 

 

 // 然后最骚的是,想查查一些其他的人怎么看的,好多复制粘贴那一堆概念。。

  

  反熵思想(Anti-entropy)。

  反熵又是啥啊:修复分布式各节点永久性错误的东西。

 

废话先放一放,查询教材之后找出提到的几个概念:

  1.感染协议(epidemic protocol):应该说的就是这类协议是基于流行病理论衍生的,然而在分布式系统中要传染的不是病,而是信息罢了。那么以下的概念都是些源于传染病的术语了??;

  2.已感染的(infected):分布式系统的某个节点如果具有了要传播的其他的节点的数据。(已经染上病了的)

  3.易受感染的(susceptible):还没有接受到数据的节点。(想要染病的。。。容易染上病的说法更好一点)

  4.已隔离的(removed):不会传播其数据的已更新节点。(染上病都好了有抗体了的)

摘自教材(分布式系统原理与范式 第二版中文版 Andrew.S.Tanenbaum ,Maarten.Van.Steen写的):

    要解释这杨算法东风恶一般原理,我们假定特定数据项的更新都是从单个节点发起的。这些就可以避免写冲突。

    分布式系统的感染算法设计人员则是试图尽可能快递用新信息“感染”所有节点。

    

    这里我们假定可以区分新旧数据,因为数据可能加上时间戳或者版本号了。

    一种流行的传播模型是 反熵(anti-entropy)。再这个模型中,节点P随机选取另一个节点Q,然后与Q交换更新信息。三种方法如下:

    (1)push:P只把自己的更新信息给Q。

    (2)pull: P从Q那里活得更新信息。

    (3)push-pull:PQ交换更新信息。      

 

    后文解释道:

    快速方面push不好,push只能已感染的点发,已经感染的点多了的话,那么每个点去感染别人的时候能碰到易感染的点的几率就小了。但是,如果易感染的节点很多的话,push方法就很好的发挥作用了。这种情况下,易感染的被选择的几率高,就有着良性循环。

    书上又说:

    如果是只有一个节点感染的话,三种方法相比较之下,push-pull的方法最好。

    所有点都与随机的另一点交换过了的这一过程成为 一轮(round)

    所以更新信息传到所有结点就需要O(logN)轮。

    这中方法的特殊变体称为————gossiping。

  然后这个例子让我马上明白了这个算法怎么玩得:

    gossiping完全源于生活(因为这个单词的意思是流言蜚语的意思的吧),比如(虚构的)说:

    Bob知道了同班同学A要过生日的事情准备通知大家给他准备个惊喜。Bob给Alice打电话通知,Alice又给她的朋友打电话通知,

    但是她其中一个朋友Chuck说我都知道了,Alice觉得那大家可能都知道了把,就没有再打电话的兴趣了。

  也就是说:

    一个点(因为改变之后变成了“感染者”)开始发更新信息(当然是随机选),然后被选到的那个点也变成了“感染者”

    然后感染者们继续选点,继续感染。如果选到一个已经感染的点的话(因为是push-pull算法),自己变得没兴趣了,就是变成了“被隔离者”,相当于便成了已经知道的人。

    直到所有的感染者们都被隔离。    

    这种方法不能保证所有的节点都真的被更新了。

 

 

   下面进行编码的尝试:

    编码ing。。。

 

以上是关于Gossip思想的算法?(学校作业向,并非标准算法。)的主要内容,如果未能解决你的问题,请参考以下文章

Raft算法和Gossip协议

分布式共识算法——Gossip协议(图解)

分布式共识算法——Gossip协议(图解)

基础算法Gossip协议

基于Gossip算法的分布式数据库同步实现

面霸系列 - 5一致性算法-Gossip协议详解