Gossip协议的P2P会员管理

阅读此论文主要目的在于理解gossip协议及其背后的原理,此部分详细翻译,其余部分看时间

文章标题:Gossip协议的P2P会员管理

作者Ayalvadi J. Ganesh, Anne-Marie Kermarrec, and Laurent Massoulie ´

Abstract:基于Gossip的组通信协议具有吸引人的可扩展性和可靠性。迄今为止研究的概率八卦计划通常假定每个团体成员对全球成员有充分的了解,并随机选择八卦目标。全局知识的要求抑制了它对大规模群体的适应性。在本文中,我们提出了SCAMP(可扩展会员协议)——一种新颖的对等会员协议,它以完全分散的方式运行,并为每个成员提供成员的部分视图。我们的协议是自组织的,部分视图的大小可以自然地收敛到可靠支持gossip算法所需要的值。该值是组大小的函数,但是在没有任何节点知道组大小的情况下实现。我们提出了另外的极致来实现平衡的视图大小,即使是在非常不平衡的订阅模式下(也可以达到目的)。我们介绍设计,理论分析和基本协议及其细化的详细评估。模拟结果表明,SCAMP提供的可靠性保证与以往基于全球知识的方案相当。 实验的规模证明了协议的可扩展性。

Introduction:

为了可靠地扩展Internet范围的分布式应用程序组通信,对可扩展机制的需求正在被极大地推动着。网络级可靠的组播协议,如SRM或RMTP依靠IP组播,目前尚未广泛部署。 这激发了对应用级多播协议的需求,目前这是一个积极的研究课题。

基于概率八卦的传播协议正在成为一种具有吸引力的替代方案,它提供了良好的可扩展性和可靠性。在这些协议中,每个成员负责将每个消息转发给一组其他随机选择的组成员。这种主动使用冗余消息的方式提供了一种机制来确保在网络中遇到节点崩溃或高丢包率时候的可靠性。因为每个节点上的负载只能与组的大小呈对数增加,所以这些算法是可扩展的。基于Gossip的协议特别适用于组成员资格相对静态但群组成员的可用性呈间歇性的场景。 由于这些协议容忍高故障率,因此在这种情况下不需要重新配置机制。

虽然这些方法已经被证明是可扩展的消息传播,但是它们依赖于一个不可扩展的成员关系协议:1、它们假设节点gossips(闲话)的节点子集在所有参与节点之间均匀选择,并且要求每个节点应该知道其它每个节点。这对存储器和同步性提出了很高的要求,这会导致其扩展性受到不利影响。在没有任何具有全局会员知识的节点情况下,这有助于分配会员管理的工作,以便为每个节点提供系统的部分随机视图。然而,为了使基于gossip的消息传递成功,每个节点所需的部分成员关系的大小与系统的大小有关。当组增大时,每个节点的部分成员关系大小需要相应增加。在早期工作中,我们得出了实现高度可靠性的扇出(八卦目标的数量),并将其作为系统大小的函数。成员管理集中或分散在几个服务器之间时,可以轻松确定参与的数量,并且可以调整扇出来匹配可靠性要求。但是,在完全分散的模式中,每个节点都以系统的不完整视图运行,这就不是直接可以得知的了。以前提出的部分成员方案都需要知道系统大小。

我们提出了一个可扩展的概率成员协议,旨在解决这个问题。这个协议简单、完全分散而且是资配置的。随着参与节点数量的变化,我们展示了分析情况和模拟情形——部分视图的大小自动适应所需的值。这些结果是针对任意订阅模式(subscription patterns)实现的,包括所有订阅针对同一成员的最坏情况。评估结果表明,基于本协议提供的部分视图的八卦与基于被每个节点知道的全局成员的随机选择的八卦一样,对故障具有弹性。我们提出的协议具有并入现有的基于gossip的方案的潜力,能减少由于成员管理引起的内存和同步开销。

本文的其余部分组织如下:我在第2节中描述会员协议以及其背后理论的概述。第3节提出了两个互补的优化方案,即使在高度不平衡的订阅模式下也能实现视图的大小平衡。详细评估见第4节。相关工作在第5节中描述,我们在第6节中得出结论。

2 DECENTRALIZED MEMBERSHIP PROTOCOL

2.1 支持基于gossip的多播的要求

基于Gossip的协议使用随机化来可靠地传播组中的消息,它们在发布订阅系统(publish-subscribe systems)、分布式数据库、分布式故障检测、分布式资源环境、虚拟同步等环境中被广泛使用。它们提供了在链接受损或者存在失败节点的情况下概率性交付的保证。当配合合适的更高水平的恢复机制时,它们可以为提供确定性担保提供依据。这些协议的几种实现方式在八卦轮(gossip rounds)的长度以及八卦目标的数量和选择方面有所不同。为了清楚起见,我们以简单的八卦方式测试SCAMP,其中每个节点将每个多播消息一次传播到其他节点的随机子集。但是本文提出的机制和结果适用于基于gossip的多播协议的其他实现。

在基于Gossip的协议中,消息传播如下:当节点生成消息时,它将其发送到其他节点的随机子集。当任何节点第一次接收到消息的时候,它都做上述操作。八卦目标的随机选择为随即失败提供了弹性,并实现了分散化操作。我们使每个成员可选择的八卦目标数量足够大,并把它作为组大小的函数的方式引入足够的冗余,这样保证了可靠性。

问题就在于确定这些随机子集的大小,以便将消息以高可能性可靠地传播给所有群组成员。在早期工作中,有以下清晰的结论:存在n个节点,每个节点平均八卦给log(n)+k个其他节点,则每个节点收到消息的概率收敛到e^-e^-k,这个是指给定节点接收到消息的概率,而不是每个节点接收到的概率。我们将这个属性称为强原子性,已将其与传统的原子性属性^2区别开来。在这个传统的原子性属性^2要求要么没有节点收到消息,要么所有节点都收到消息。 在[17]中,我们还得出了成功概率取决于节点和链路的故障率的表达式。

传统的基于gossip的协议依赖于从所有组成员中随机选择的八卦目标,我们把这种方法称为满成员协议。这种协议需要每个节点有整个组的成员关系信息,它在大群组或成员资格频繁变化的组中是不切实际的。 在[17]中,我们提出了一种方案,一组服务器维护全局成员关系列表,并为个体节点提供周期性更新的随机部分视图。 我们在目前工作中的目标是消除对服务器的需求,并制定完全分散的协议,为每个节点提供部分成员资格。 该协议的设计要求包括:

1、可扩展性:每个节点维护的部分视图的大小应随组大小而增长缓慢。

2、 可靠性:每个节点的部分视图应足够大,来保障它的可靠性与依靠完全了解组成员身份传统方案相比也不落下风。

3、分散操作:在维护上述属性的同时,部分视图应更新为成员订阅或取消订阅。 更新应仅使用本地信息进行。 即使没有节点知道系统大小,部分视图大小也会自动缩放到正确的值作为系统大小的函数。

4、隔离恢复:传统八卦方案的一个重要特征是,每当一个节点闲聊多播消息时,它随机选择新的八卦目标。 因此,就算一个节点偶尔会错过一个消息时,它也不太可能被重复地省略。相比之下,如果节点从部分视图中选择长期保持不变的八卦目标,则需要一种从隔离恢复的机制。

2.2 基础的成员管理协议

该协议由节点订阅(连接)和取消订阅(离开)组的机制,节点可以从隔离中检测和恢复。节点的部分视图以完全分散的方式响应不断变化的组成员而演变。

2.2.1 订阅(Subscription

订阅算法进行如下:

1、联系人:新节点通过向任意成员发送订阅请求来加入组,称其为联系人。 他们开始的部分视图仅包括他们的联系。

2、新订阅:当一个节点收到一个新的订阅请求时,它将新的node-id转发给自己的本地视图的所有成员, 它还创建了c个新订阅的附加副本(c是确定故障容忍的设计参数),并将其转发到其本地视图中随机选择的节点。

3、转发订阅:当节点接收到转发的订阅的时,如果订阅尚未存在其列表中,它将以概率p将新订阅者集成,该概率p取决于视图的大小。如果没有保留新订阅者,则将订阅转发到其本地视图中随机选择的节点。这些转发的订阅由其邻居保存或转发,但是在某些节点保留之前不会被销毁。

4、保留订阅:每个节点维护两个列表:PartialView和InView。节点发送gossip消息给PartView中的节点,从InView的节点接收gossip消息。如果节点i决定保留节点j的订阅,则将节点j的nodeID放在其PartialView中,并且向节点j发送一条消息,告诉它将节点i的nodeID保留在它的InView中。

算法1描述了接收新订阅的节点的伪代码。 算法2描述了接收转发订阅的节点的伪代码。

算法1 订阅管理  在一个联系节点contact上订阅新订阅者

算法2 处理转发的订阅


此协议仅需要处理订阅请求节点处可用的本地消息,它具有如下属性:如果新节点通过向从现有成员随机选择出来的成员发送订阅请求,则系统将自身配置为大小为(c+1)log(n)的部分视图。n是系统中的节点数,c是设计参数。可以发现,一个通知到达每个节点的概率在log(n)处有一个极其尖锐的阈值:小于log(n)的部分视图接近0,在大于log(n)的部分接近1。这个结果适用于没有故障的系统,并且可以容易地扩展到解决链路和节点故障。例如,如果链接以概率α独立于其它链路失败,那么阈值就是(log(n))/(1-α)。维持某些大小为(c+1)log(n)的视图c>0的另一个原因是它使我们能够选择不同的大小为log(n)+k的子集作为不同消息的gossip目标。这保证了链路和节点故障不太可能导致网络的持续分区,并使我们能够使用为传统八卦协议设计的恢复机制。因此,就算我们保持相当小的部分视图,我们仍然可以获得这些协议的许多好处。

我们使保存转发订阅的概率p=1/(1+sizeof(PartialView))有两个目的:首先,我们使得这个概率是当前部分视图的大小的递减函数,我们的目标是在不同的节点上获得更加平衡的视图大小,从而实现围绕平均视图的大小集中的视图大小的分布。第二,假设部分视图大小大致是(c+1)log(n),在一个订阅被保留之前的转发步骤数量大致平均是(c+1)log(n)。我们可以看出正在考虑的随机图具有与log(n)成比例的直径。我们期望概率p的值能使得转发的订阅在被某个节点保存之前遍历图相当大的部分。

我们现在给出订阅协议的平均值分析。

我们将系统建模为随机定向图:节点对应组成员,并且有一条有向弧(x,y),其中y在x的部分视图中(patial view)中。当一个节点发起新订阅时,我们算法的动作是创建一个随机数量的附加有向弧,如下所示:假设组中已经有n个成员,如果新节点订阅了具有外向度为d的节点,则增加d+c+1个弧。新节点具有外向度1,其中列表仅有其订阅的节点组成。接受订阅的节点将订阅节点的节点id的一个副本转发到其每个邻居,并将附加的c份拷贝转发到随机选择的邻居。所有转发的订阅最终将由某个节点保存。

当节点数量已经增加到n时,让E[Mn]表示预期有向弧数目,使得每个节点的平均出度为E[Mn]/n。假设新节点订阅至一个随机选择的成员,我们有


从上面这个式子我们可以看出E[Mn]≈(c+1)nlogn。

2.2.2 取消订阅

上述订阅机制创建连接图。但是,节点故障或未完成的脚本可能导致网络断开连接。网络可能会断开连接的主要原因是单个节点的隔离。当所有节点在其部分视图中包含其标识符失败的时候,节点与图形隔离。为了重新连接这些节点,我们提出了心跳机制。每个节点向在其部分视图中的节点定期发送心跳消息。长时间没有收到心跳消息的节点知道它被隔离了,它会通过其部分视图中的任意节点重新订阅。此外,第三部分提出的图表重新租赁机制也有助于降低长期隔离的可能性。

3 重新平衡图的机制(这个是新介绍的东西,有时间补上,现在先这样)


然后附一篇对我帮助很大的博文,虽然我觉得gossip-based protocols过程描述方面有点出入,但是能帮助我们较好理解基本思想。

http://blog.csdn.net/zhangxinrun/article/details/7087541?locationNum=12

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java集合之LinkedHashSet源码分析

概述 LinkedHashSet与HashSet类似, 不同的是LinkedHashSet底层使用LinkedHashMap维护元素插入的顺序. LinkedHashSet继承自HashSet, 只是重写了HashSet的构造方法, 初始化一个LinkedHashMap, 其他均与HashSet相同. LinkedHashSet构造方法 HashSet的构造方法: 以上几乎就是Li…

Java集合之ArrayList源码分析

概述 ArrayList可以理解为动态数组, 根据MSDN的说法, 就是Array的复杂版本. 与数组相比, 它的容量能动态增长. ArrayList是List接口的可变数组的实现. 实现了所有可选列表操作, 允许包括null在内的所有元素. 数组的特点, 查询快增删慢. 每个ArrayList实例都有一个容量, 该容…

Java集合之Hashtable源码分析

概述 Hashtable也是基于哈希表实现的, 与map相似, 不过Hashtable是线程安全的, Hashtable不允许 key或value为null. 成员变量 Hashtable的数据结构和HashMap一样, 采用 数组加链表的方式实现. 几个成员变量与HashMap一样: 方法 Hashtable的方法与HashMap基本一样, 只是 Ha…

视频质量检测中的TP、FP、Reacll、Precision

在看论文《Measuring Vedio QoE from Encrypted Traffic》的时候看到TP(True Positives)、FP(False Positives)、Precison、Recall的概念,这属于数据挖掘方面的内容,学习之后特来记录。 首先,下…

Java集合之LinkedHashMap源码分析

概述 HashMap是无序的, 即put的顺序与遍历顺序不保证一样. LinkedHashMap是HashMap的一个子类, 它通过重写父类的相关方法, 实现自己的功能. 它保留插入的顺序. 如果需要输出和输入顺序相同时, 就选用此类. LinkedHashMap原理 LinkedHashMap是如何保证输入输出顺序的呢? L…

Java集合之HashSet源码分析

概述 HashSet是基于HashMap来实现的, 底层采用HashMap的key来保存数据, 借此实现元素不重复, 因此HashSet的实现比较简单, 基本上的都是直接调用底层HashMap的相关方法来完成. HashSet的构造方法就是创建HashMap: 基本操作 1.添加操作 2.删除操作 3.迭代器 其他方法基本也是调…

三次握手wireshark抓包分析,成功握手和失败握手

转载之前:基于HTTP的视频流中,客户端有时会打开使用多条TCP与服务器连接,为了验证每一对话的sessionID是否相同,使用wireshark进行了抓包分析(抓到的都是加密的包,无卵用orz....),这…

Java 内部类及其原理

Java中实现内部类 内部类相信大家都用过很多次了,就不说它是怎么用的了。 内部类 1.成员内部类 需要注意的是, 当成员内部类拥有和外部类同名的成员变量或这方法时, 默认情况下访问的是内部类的成员, 如要访问外部类的同名成员&…

Java8 Lambda表达式

概述 lambda表达式, 是Java8中的一个新特性。可以理解为一个匿名函数。 lambda表达式可以理解为将一个函数浓缩为一行代码,使代码更加简洁紧凑。 lambda表达式语法: (parameters) -> statement; 或 (parameters) -> {statements;} 参…

Java8 方法引用

概述 方法引用是用来直接访问类或实例阴茎存在的方法或者构造方法.它需要由兼容的函数式接口(lambda表达式中用到的接口)构成的目标类型上下文. 有时候, 当我们想要实现一个函数式接口的方法, 但是已经由类实现了我们想要的功能, 这时可以使用方法引用来直接使用现有的功能实现…

配置过程中的一些问题

一、 Tomcat相关问题 1、百度经验有设置用户名密码,但是按照步骤进行,到测试的时候发现还是错误的。 解决:在设置的时候应该stop Tomcat,在设置好之后再重新开启Tomcat,发现可以。 2、把web项目加入Tomcat&#xff0…

流媒体通信协议HLS与DASH的对比

简单了解 HLS(HTTP Live Streaming)协议 是由苹果公司实现的基于HTTP的流媒体通信协议,并成为Quick TIme X和IPhone软件系统的一部分。苹果的IPad也有支持HLS的能力。 HLS传出的视频文件为基于MPEG2文件的切片,每个媒体切片在服务器上单独存放。在一个流…

Activity的四种启动模式和onNewIntent()

Android中Activity启动模式详解 在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。 Android总Activity的启动模式分为四种: Activity启动模式设置…

Java8 默认方法

概述 Java8新增了接口的默认方法。使用default关键字。 默认方法就是接口可以有实现方法,而且不需要实现类来实现其方法。相对于JDK1.8之前的接口来说,新增了可以接口中实现方法。 可以说在接口中实现方法一部分原因是为了lambda表达式服务的&#xf…

Android Activity 生命周期中onStart()和onResume()的区别

首先了解Activity的四种状态 Running状态:一个新的Activity启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。 Paused状态:当Activity被另一个透明或者Dialog样式的Activity覆盖时的…

Android 原生ExoPlayer 解析

1.简述与应用范围 ExpPlayer是一个开源的,App等级的媒体API,它的开源项目包含了library和示例。 ExoPlayer相较于MediaPlayer有很多优点: 1. 支持基于http的移动流媒体协议,包括DASH,HSL,Smooth Stream。同…

Java8 Stream

概述 Java8 API中添加了一个新的抽象成为流Stream,可以以一种声明的方式处理数据。 Stream与java.io包中的InputStream和OutputStream是完全不同的概念。Java8中的Stream是对集合对象功能的增强,专注与对集合对象进行各种非常便利、高效的聚合操作&…

Java 注解原理

下面来看看Java中注解是如何实现的 创建注解类Inter: 创建测试类Test: 在程序第二句设置断点,可以看到: 可以看到,注解的实例是一个动态代理类的对象. 要想查看这个动态代理类,可以在代码中加 System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", …

myeclipse导入项目报错Target runtime Apache Tomcat v8.0 is not defined

今天想要查看一个现有的项目,本着最好使用原版本开发工具的奇怪想法,下载了一个myeclipse,在导入项目的时候报了一个错误 问题倒是挺明确的,就是项目需要的tomcat运行环境没有,有两种方法解决: 第一种方…

Android Studio查找功能(搜索功能)及快捷键

1、在当前窗口查找文本【CtrlF】 F3 向下查找关键字出现位置 ShiftF3 向上一个关键字出现位置 2、在当前工程内查找文本【CtrlShiftF】 先会弹出一个对话框,直接点击【find】,开始在整个工程内查找该字符串 查找结果如下: 3、查找类【C…