一般来说,去中心化的算法具有以下特性。

  • 相关信息分布在多台计算机上。
  • 进程只根据本地信息做出决定。
  • 不应该有一个单一的临界点,它的失败会导致算法的崩溃。
  • 没有通用的时钟或其他准确的全球时间来源。

前三点都谈到了收集所有信息以在一个地方做出决定的不可接受性。在没有集中化的情况下提供同步需要与传统操作系统中使用的方法不同的方法。最后一点也很重要——在分布式系统中,按时达成一致绝非易事。从 UNIX make 程序的例子可以看出时间一致的重要性。主要的理论问题是缺少全局时钟和无法修复全局状态(分析情况 - 检测死锁,组织中间存储)。


时间同步

硬件时钟(而不是计时器 - 临时信号计数器和具有计数器初始值的寄存器)基于石英振荡器,并且在不同计算机中的频率可能会有所不同。

1978 年,Lamport 证明了时间同步是可能的,并提出了一种用于这种同步的算法。但是,他指出不需要绝对同步。如果两个进程不交互,那么它们不需要相同的时间。此外,在大多数情况下,约定的时间可能与广播中公布的天文时间没有任何关系。在这种情况下,可以说是逻辑时钟

对于逻辑时钟同步,Lamport 定义了“发生在之前”的关系。表达式 a->b 读作“ a发生在b之前”,表示所有进程都同意事件“ a ”首先发生,然后是“ b ”。这种关系在两种情况下很明显:

  1. 如果两个事件发生在同一个进程中。
  2. 如果事件 a 是一个进程中的 SEND 操作,事件b是另一个进程收到此消息。

关系->是可传递的。

如果两个事件x 和 y 发生在不交换消息的不同进程中,则关系 x->y 和 y->x无效,这些事件称为同时发生。

让我们以这样的方式引入逻辑时间 C,如果a->b,则C(a) < C(b)

算法:

  1. 时钟 Ci 随着进程Pi中的每个事件递增:Ci=Ci+d ( d > 0, 通常为 1)
  2. 如果事件 a是进程Pi 发送消息m,则将时间戳tm=Ci(a)写入该消息。当进程 Pj收到此消息时 ,其时间调整如下: Cj = max(Cj,tm+d)

用一个例子来解释这个校正是如何进行的。

为了对所有事件进行排序,要求它们的时间从不重合是很方便的。这可以通过添加一个唯一的进程号(40.1、40.2)作为时间的一小部分来完成。然而,对于许多应用(实时控制系统)来说,逻辑时钟是不够的。

物理时钟

17世纪发明机械钟后,时间是用天文方法测量的。太阳连续两次到达天空最高点的时间间隔称为一个太阳日。一个太阳秒等于一个太阳日的 1/86400(24*3600)。

在 1940 年代,人们发现地球的自转周期不是恒定的——地球由于潮汐和大气而减慢了自转速度。地质学家认为,3亿年前一年有400天。由于其他原因,一天的长度也会发生变化。因此,他们开始计算长期的平均太阳秒数。

随着 1948 年原子钟的发明,精确测量时间成为可能,而不受太阳日波动的影响。目前,全球有 50 个实验室拥有基于 Cesium-133 辐射频率的时钟。平均值为国际原子时 (TAI),从 1958 年 7 月 1 日开始计算。

当差异大于 800 微秒时,TAI 与太阳时的延迟通过增加一秒来补偿。这个更正的时间,称为 UTC(通用协调时间),取代了旧标准(格林威治标准时间 - 天文时间)。在宣布向 UTC 增加一秒时,电力公司将频率从 60 Hz 更改为 61 Hz(从 50 到 51),持续 60 (50) 秒。为了确保准确的时间,WWV 信号由短波发射器(科罗拉多州柯林斯堡)在 UTC 的每一秒开始时发射。还有其他时间服务。

时间同步算法

两个问题 - 时钟不应该倒退(需要加快或减慢以进行更正)和传递时间消息的非零时间(您可以重复测量传递的时间并取平均值)。


选择协调员

许多分布式算法需要其中一个进程充当协调者、发起者或其他一些特殊角色。这种特殊过程的选择将被称为协调器的选择。在这种情况下,通常选择哪个过程并不重要。我们可以假设通常选择具有最高唯一编号的进程。可以使用具有一个目标的不同算法 - 如果选举程序已经开始,那么它必须在所有关于新协调员的进程的同意下结束。

欺凌算法
如果进程检测到协调器很长时间没有响应,它就会发起选举。进程P进行如下选举:

  1. P 向所有编号高于自身的进程发送“SELECT”消息。
  2. 如果没有答案,则 P 被认为是获胜者并成为协调者。
  3. 如果编号较大的进程之一响应,它将接管选举。进程 P参与选举结束。

在任何时候,一个进程都可以从它的一个具有较低编号的对等点接收“OPTIONS”消息。在这种情况下,他发送一个“OK”响应以表明他还活着并接管了选举的运行,然后开始选举(如果他还没有这样做的话)。因此,所有进程都将停止选举,除了一个 - 一个新的协调器。他通过消息“协调员”通知每个人他的胜利和上任。

如果一个进程被关闭,然后想要重新获得它的参与,那么它就会举行一次选举(因此是算法的名称)。

循环算法

该算法基于使用环(物理或逻辑)但没有标记。每个进程都知道循环列表中的下一个。当一个进程检测到没有协调者时,它会向下一个进程发送一个“ELECT”消息及其编号。如果下一个进程没有响应,则将消息发送到其后的进程,依此类推,直到找到正在运行的进程。每个正在运行的进程将自己的编号添加到正在运行的进程列表中,并将消息转发到更远的圆圈中。当进程在列表中找到自己的编号(循环完成)时,将消息类型更改为“COORDINATOR”并绕着循环,通知每个人有关工人列表和协调员(编号最高的进程)在列表中)。


相互排斥:集中式算法

  • 所有进程都向协调者请求进入关键部分的许可,并等待这一许可。 协调器按照收到请求的顺序提供服务。
  • 获得许可后,该过程进入了关键部分。 在离开关键部分时,它通知协调人。
  • 每个关键部分的信息数量为3。
  • 该算法的缺点是集中式算法的通常缺点(协调器崩溃或信息过载)。

分散的基于时间戳的算法

进入一个关键部分

  • 当一个进程想进入一个临界区时,它向所有进程发送一个包含临界区名称、进程号和当前时间的请求消息。
  • 发送请求后,该进程等待每个人给予它许可。在得到所有人的许可后,它进入了关键部分。

进程在收到请求时的行为

  • 当一个进程收到一个请求消息时,根据它与指定的关键部分有关的状态,它以下列方式之一行事。
  • 如果收件人不在关键部分内,也没有请求进入该部分的许可,它就会向发件人发送一个 "OK "消息。
  • 如果收件人在一个关键部分内,它不会响应,但会记住该请求。
  • 如果收件人发出了进入该部分的请求,但还没有进入,它就会比较其请求的时间戳和其他人的时间戳。时间戳小的一方获胜。如果外国请求获胜,该进程将发送一个 "OK "消息。 如果外国请求有更大的时间戳,则不发送响应,外国请求被记住。

退出一个关键部分

  • 在退出部分后,它向所有它记住的请求的进程发送一个 "OK "消息,然后删除所有记住的请求。
  • 每节传递的信息数量是2(n-1),其中n是进程的数量。
  • 另外,一个临界点被n个点所取代(如果某些过程停止运作,缺乏来自它的决议将使所有人停止)。
  • 最后,如果在集中式算法中存在协调器超载的危险,在这种算法中,任何进程的超载都会导致同样的后果。
  • 对算法的一些改进(例如,等待大多数人的许可,而不是所有的人)需要不可分割的广播信息。

该算法被命名为Ricart-Agrawala。 需要对系统中的所有事件进行全局时间排序。

带有圆形标记的算法

  • 所有的过程都形成了一个逻辑环,每个人都知道谁在遵循它们。
  • 一个令牌在环中循环,授予进入一个关键部分的权利。
  • 在收到令牌后(通过点对点消息),进程要么进入关键部分(如果它在等待许可),要么进一步转发令牌。
  • 在离开关键部分后,令牌被转发,不允许用同一令牌再次进入该部分。

广播标记算法(Suzuki-Kasami)

该标记包含。

  • 请求队列。
  • 数组LN[1...N],包含最后满足的请求的数量。

进入关键部分

  • 如果请求关键部分的进程Pk没有令牌,它将增加其请求序列号RNk[k]并发送一个包含进程号(k)和请求号(Sn = RNk[k])的广播消息 "REQUEST"。
  • 如果进程Pk有(或收到)一个令牌,它就会执行关键部分。

收到请求时的处理行为

  • 当进程Pj收到来自进程Pk的请求信息时,它设置RNjj[k]=max(RNjj[k],Sn)。
  • 如果Pj有一个空闲的令牌,它只在RNjj[k]==LN[k]+1(请求不老)时才将其发送给Pk。

退出Pk进程的关键部分。

  • 将令牌中的LN[k]设置为等于RNk[k]。
  • 对于RNk[j]=LN[j]+1的每个Pj,它将其标识符添加到请求标记队列中(如果它还没有在那里)。
  • 如果请求标记队列不是空的,那么第一个元素将被移除,标记将被发送到相应的进程(其请求是队列中的第一个)。

 

 

树标算法(Raymond)

所有进程都表示为平衡的二叉树。每个进程都有一个来自自身和相邻进程(第1、第2或第3)的请求队列和一个指向令牌所有者的指针。

关键部门的入口

  • 如果有一个令牌,进程就执行COP。
  • 如果没有令牌,这个进程:
    • 将其请求放在请求队列中。
    • 向令牌所有者发送一个 "REQUEST "消息,并等待消息的到来。

进程在接收信息时的行为 
不在CW中的进程必须对两种类型的信息做出反应--"MARKER "和 "REQUEST"。
A) "MARKER "信息已经到达。

  • М1. 从队列中取出第1个请求,并将令牌发送给其作者(概念上,可能是发送给自己)。
  • М2. 将指针的值向标记处改变。
  • М3. 从队列中排除一个查询。
  • М4. 如果队列中还有任何请求,就向标记者发送 "REQUEST "消息。

B) 收到REQUEST信息。

  • 将请求放入队列。
  • 如果没有标记,则向标记处发送 "REQUEST "信息,否则(如果有标记)转到M1点。

退出关键部分

  • 如果请求队列是空的,退出时不做任何事情,否则 - 转到M1点。

​​​​​​​

 

4. 分布式系统中的同步相关推荐

  1. 分布式系统中节点之间的同步形成区块链

    链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载. 分布式系统中节点之间的同步形成区块链 分布式系统由Tanenbaum定义,"分布式系统是一组独立的计算 ...

  2. 分布式系统中一些主要的副本更新策略——Dynamo/Cassandra/Riak同时采取了主从式更新的同步+异步类型,以及任意节点更新的策略。...

    分布式系统中一些主要的副本更新策略. 1.同时更新 类型A:没有任何协议,可能出现多个节点执行顺序交叉导致数据不一致情况. 类型B:通过一致性协议唯一确定不同更新操作的执行顺序,从而保证数据一致性 2 ...

  3. 工作中感受到的消息中间件在分布式系统中的使用场景

    经历 以前在qunar实习,第一次接触消息中间件,那时候概念还不清楚,朦朦胧胧有个初步认识,现在正式工作了,又一次接触了消息中间件,初步总结几种场景. 场景 1.分布式系统中,不同系统之间传递消息. ...

  4. 分布式系统中只有两个难题

    分布式系统抽象 讨论编程语言时,我们使用通用术语并用函数.运算符.类.变量和指针来定义我们的程序.通用的词汇可以帮助我们避免每次都为了描述某些东西而发明新词.我们的定义越精确.越没有歧异,听众也就越容 ...

  5. 大型网站架构系列:缓存在分布式系统中的应用(二)

    缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题.提供高性能的数据快速访问. 本文是缓存在分布式应用第二篇文章,介绍分布式缓存,Memcache,Redis,本地缓存 ...

  6. 大型网站架构系列:缓存在分布式系统中的应用(一)

    缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题.提供高性能的数据快速访问. 本文是缓存在分布式应用第一篇文章,介绍缓存的原理,缓存的分类,缓存的设计,CDN缓存(原 ...

  7. 在一个成熟的分布式系统中 如何下手做高可用?

    对于企业来说,随着规模越来越大,整个系统中存在越来越多的子系统,每个子系统又被多个其他子系统依赖或者依赖于其他子系统.大部分系统在走到这一步的过程中,大概率会发生这样的场景:作为某个子系统的负责人或者 ...

  8. QCon演讲速递:异步处理在分布式系统中的优化作用

    本文根据阿里巴巴技术保障研究员赵海平在2015年QCon全球软件开发大会(北京站)主题演讲整理而成. \\ 赵海平在Facebook工作8年期间,主要针对后端进行性能优化的工作,包括PHP的优化,me ...

  9. 分布式系统中处理参数配置的 4 种方案

    一个系统中包含有各种各样的配置信息,如一个日志文件需要配置以下几个信息. 日志文件生成主目录 日志文件名称,不同的日志级别对应不同的文件 当前日志级别 还有其他各种业务参数.系统参数等,大多单一系统是 ...

最新文章

  1. 微信小程序----调用用户信息
  2. Python开发基础总结(三)排序+迭代+生成器+装饰器
  3. python 函数的嵌套 和 作用域链
  4. cognos学习轨迹
  5. 开发日记-20190825 关键词 管道和FIFO
  6. java synchronized关键字_Java synchronized 关键字,你用的对吗?
  7. 济宁市机器人科技乐园_人工智能的“游乐场”,邀你免费畅玩!
  8. 整理加解释:以太网、快速以太网、千兆以太网和万兆以太网分别的概念和区分 大详解
  9. Android:使用Activity制作中间弹窗
  10. SpringBoot 注解 @Configuration @PropertySource @Value
  11. 8个优质自学网站收藏
  12. 【docker系列】docker深入浅出之安装Nginx+PHP+MySQL
  13. 视频综合平台系统架构分析-1
  14. iOS13.4系统来袭CarPlay更好用,安卓微信内侧7.0.13支持黑暗模式了,附下载地址...
  15. [人工智能-综述-3]:人工智能与硅基生命,人类终将成为造物主
  16. 四种连接类型:inner(内连接),left[outer](左外连接),right[outer](右外连接),full[outer](完全外连接)
  17. 马来西亚SIRIM认证
  18. 海康威视真是太恶心了
  19. 榜样访谈| 陈婧:机会是留给有准备的人
  20. 对于win7上共享的文件在工作组的其他电脑上无权限访问的问题解决,以及工作组电脑无需密码登入访问设置

热门文章

  1. 微信LV项目(全流程)
  2. RGB与LAB优化互转
  3. 国际机器人赛事RoboCup@Home Education2020线上比赛成功举办
  4. OTA升级详解(一)
  5. ​美国UIUC信息学院汪浩瀚老师课题组招收全奖博士生及合作者
  6. java编写流星_[Java教程]【原创】java 流星划过天空
  7. 计算4000000000以内最大的f(n)=n的值---字符串问题python实现(五)
  8. 企业建站之是自招开发人员组团队还是外包?软件外包开发靠谱吗?
  9. WINDOWS XP 瘦身行动
  10. PHP将swf转为gif,如何将flash swf影片格式转换为gif动画?flash视频文件转换工具