分布式系统中的概念--第一篇 一致性协议、一致性模型、拜占庭问题、租约

1,一致性协议

两阶段提交协议与Raft协议、Paxos协议

①两阶段提交协议

在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败。当一个事务跨越多个节点时,为了保持事务的ACID特性,需要引入一个作为协调者的组件来统一掌控所有节点(称作参与者)的操作结果并最终指示这些节点是否要把操作结果进行真正的提交(比如将更新后的数据写入磁盘等等)。因此,二阶段提交的算法思路可以概括为: 参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。

因此,系统包含两类节点,一类是协调者,一类是参与者,协议的执行由两个阶段组成:

具体参考:二阶段提交:维基百科

两阶段协议是阻塞的,节点在等待对方的应答消息时,它不能做其他事情且持有的资源也不释放。它主要是用来保证跨多个节点的操作的原子性--要么都操作,要么都不操作,而像Raft协议则诸如用来保证操作的一致性,即各个节点都执行相同的操作

两阶段协议的举例参考:两阶段提交协议

②Raft协议和Paxos协议

Raft与Paxos 在分布式应用中的基本功能相似,但是Paxos难于理解,相对而言Raft算法要简单一些。关于Raft协议有一篇经典的论文:

《In Search of an Understandable Consensus Algorithm (Extended Version)》

其中文翻译地址参考:寻找一种易于理解的一致性算法(扩展版)

还有一篇文章详细解释了Raft算法的相关实现:Raft论文的第 31 号参考文献。

下面仅记录一下看论文过程中出现的一个问题:

为什么 “大多数规则” 能够保证对于一个给定的任期,只会有一个候选人最终赢得选举成为Leader?
在Raft中,对于一个给定的任期号,每一台Server按照先来先服务原则对该任期号最多只投一张票,若某Candidate发送的请求投票RPC带有的任期号获得超过半数的Server的同意,则该Candidate成为Leader。
正是由于每个Server对某个任期只最多投一次票,且获得的投票要超过半数才能成为Leader,故在一个给定的任期投票中,最终只会有一个Candidate成为Leader。

关于Raft协议中的Leader选举步骤参考:Raft系列文章之二:Leader选举

2,分布式系统中常见的三种一致性模型

①强一致性:当更新操作在某个副本上执行成功后,之后所有的读操作都要能够获得最新的数据。对于单副本而言,读写操作都是在同一数据上执行,很容易保证一致性;而对于多副本数据,则需要使用分布式协议如2PC协议。

②弱一致性:当更新某数据时,用户读到最新的数据需要一段时间。

③最终一致性:它是一种特殊形式的弱一致性。它不能保证当某个数据X更新后,在所有后续对X的操作能够看到新数据,而是需要一个时间片段,在经过该时间片段之后,则能保证。在这个时间片段内,数据可能是不一致的,该片段称“不一致窗口“。

参考:数据一致性模型

3,拜占庭将军问题

在分布式理论中,经常看到”在非拜占庭错误情况下,算法是有效的……“ 或者说 ”...可以容忍非拜占庭失效“。那么什么是拜占庭将军问题呢?

在分布式计算上,不同的计算机透过讯息交换,尝试达成共识;但有时候,系统上协调计算机(Coordinator / Commander)或成员计算机 (Member / Lieutanent)可能因系统错误并交换错的讯息,导致影响最终的系统一致性。参考:维基百科:拜占庭将军问题

也即,在系统不同的机器之间会传递错误的消息,这种情况即为拜占庭问题。这与”网络分割、机器崩溃...”是不同的。比如Raft协议不能容忍拜占庭问题,但是能够 在非拜占庭错误情况下,有网络延迟、分区、丢包、冗余和乱序等错误情况出现时,都可以保证其操作的正确性。

4,租约,心跳包(heartbeat)

①租约

这里主要列举租约可以用来干什么?

a,进行故障检测。这类似于ZooKeeper中master 与 slaver 之间发送的心跳包的作用。在ZK中, master 和 slaver 之间通过交换心跳包来检测它们是否还存活。一个具体的例子参考:故障检测

b,维护缓存一致性维护缓存的一致性,第一种办法是轮询:每次读取数据时都先询问服务器数据是不是最新的,若不是,则先让服务器传输新数据,然后再读取该新数据。第二种方法是回调:由服务器记录有哪些客户端读取了数据,当服务器对数据做修改时先通知记录下来的这些客户端,上次读取过的数据已经失效。这二种方法都有一定的缺陷,参考:租约机制简介

因此,可以引入租约机制。在租约期限内,可以保证客户端缓存的数据是最新的。当租约过期后,客户端需要重新向服务器询问数据,重新续约。

租约的定义:租约就是在一定期限内给予持有者特定权力的 协议。每个租约都有一个期限,正是这个期限可以保证租约机制容忍机器失效和网络分割。

租约机制优化后台数据库访问的一个例子:使用租约机制解决缓存数据更新的问题

时间: 2024-12-26 18:17:56

分布式系统中的概念--第一篇 一致性协议、一致性模型、拜占庭问题、租约的相关文章

入木三分学网络第一篇--VRRP协议详解第一篇(转)

因为keepalived使用了VRRP协议,所有有必要熟悉一下. 虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是解决局域网中配置静态网关时,静态网关出现单点失效现象的路由协议. VRRP广泛应用在边缘网络中,它的设计目标是支持特定情况下IP数据流量失败转移不会引起混乱,允许主机使用单路由器(位于一个虚拟路由器组中, 在该组中,只有一台路由器--master路由器工作,转发数据包,其它路由器是backup路由器,不参与转发数据包),以及在实

剖析Elasticsearch集群系列第一篇 Elasticsearch的存储模型和读写操作

剖析Elasticsearch集群系列涵盖了当今最流行的分布式搜索引擎Elasticsearch的底层架构和原型实例. 本文是这个系列的第一篇,在本文中,我们将讨论的Elasticsearch的底层存储模型及CRUD(创建.读取.更新和删除)操作的工作原理. Elasticsearch是当今最流行的分布式搜索引擎,GitHub. SalesforceIQ.Netflix等公司将其用于全文检索和分析应用.在Insight,我们用到了Elasticsearch的诸多不同功能,比如: 全文检索 比如找

分布式系统中的一致性协议

前言 在分布式系统设计的过程中,我们需要考虑cap理论的指导思想,如下图所示,P分区容错性,考虑到分布式系统部署在多个结点上,因此分区容错性是分布式系统的最基本要具备的.因此我们只能在一致性和可用性之间作权衡.于是就出现了很多一致性协议.著名的协议有二阶段提交协议,三阶段提交协议和Paxos算法.本文主要介绍二阶段提交协议和三阶段提交协议的理论基础. 基本概念 ①二阶段提交. 2pc,是two-phase-commit的缩写,即二阶段提交.二阶段分为提交事务请求.执行事务提交. ②三阶段提交 3

转载 Paxos算法 分布式系统中成员们的一致性决议算法

维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人现在在微软研究院)于1990年提出的一种基于消息传递且具有高度容错特性的一致性算法. 原文 Paxos算法目前在Google的Chubby.MegaStore.Spanner等系统中得到了应用,Hadoop中的ZooKeeper也使用了Paxos算法,在上面的各个系统中,使用的算法与Lamport提出的原始Paxos并不完全一样,这个以后再慢慢分析.本博文的目的是,如何让一个小

分布式系统中有关一致性的理解

首先什么是一致性? 一致性就是分布式系统中相互独立多个节点就某个值达成一致. 具体可分为强一致性和弱一致性. 强一致性:在任意时刻,所有节点中的数据是一样的.同一时间点,你在节点A中获取到key1的值与在节点B中获取到key1的值应该都是一样的. 弱一致性:不保证任意时刻所有节点数据一样,有很多不同实现.最广泛实现的是最终一致性.所谓最终一致性,就是不保证在任意时刻任意节点上的同一份数据都是相同的,但是随着时间的迁移,不同节点上的同一份数据总是在向趋同的方向变化.也可以简单的理解为在一段时间后,

分布式系统的一致性协议之 2PC 和 3PC

在分布式系统领域,有一个理论,对于分布式系统的设计影响非常大,那就是 CAP 理论,即对于一个分布式系统而言,它是无法同时满足 Consistency(强一致性).Availability(可用性) 和 Partition tolerance(分区容忍性) 这三个条件的,最多只能满足其中两个.但在实际中,由于网络环境是不可信的,所以分区容忍性几乎是必不可选的,设计者基本就是在一致性和可用性之间做选择,当然大部分情况下,大家都会选择牺牲一部分的一致性来保证可用性(可用性较差的系统非常影响用户体验的

OC学习篇之---协议的概念和用法

这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习Java中的接口时候,看可以知道其实接口就相当于一种契约(协议),给他的实现类打上标记了,当然这个活在Java5.0之后,被注解替代了,因为注解就是为了此功能诞生的. 协议就是定义了一组方法,然后让其他类去实现 下面来看代码: WithProtocol.h [objc] vi

一致性哈希算法及其在分布式系统中的应用(转)

原文:http://blog.codinglabs.org/articles/consistent-hashing.html 本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用.首先本文会描述一个在日常开发中经常会遇到的问题场景,借此介绍一致性哈希算法以及这个算法如何解决此问题:接下来会对这个算法进行相对详细的描述,并讨论一些如虚拟节点等与此算法应用相关的话题. 分布式缓存问题 假设我们有一个网站,最近发现随着流量增加,服务器压力越来越

一致性哈希算法及其在分布式系统中的应用 作者 张洋

转 http://blog.codinglabs.org/articles/consistent-hashing.html 摘要 本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用.首先本文会描述一个在日常开发中经常会遇到的问题场景,借此介绍一致性哈希算法以及这个算法如何解决此问题:接下来会对这个算法进行相对详细的描述,并讨论一些如虚拟节点等与此算法应用相关的话题. 分布式缓存问题 假设我们有一个网站,最近发现随着流量增加,服务器压力越