内容简介:从client和server的角度看数据一致性
简介(未完成)
从一致性问题开始
从client和server的角度看
- 从客户端来看,一致性主要指的是多并发访问时更新过的数据如何获取的问题。
- 从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终一致。
数据一致性
- 在数据库系统中,通常指关联数据之间的逻辑关系是否正确和完整。
- 在分布式系统中,指的是由于数据的复制,不同数据节点中的数据内容是否完整并且相同。
分布式系统的CAP理论 : 一致性指“all nodes see the same data at the same time”,即更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致。==> 当更新操作完成之后,任何多个(节点)后续进程或者线程的访问都会返回最新的更新过的值。
一致性、XA、2pc/3pc paxos的关系
该话题在另一篇博客分布式系统小结 也有阐述
XA 是 X/Open DTP 定义的交易中间件与数据库之间的接口规范(即接口函数),交易中间件用它来通知数据库事务的开始、结束以及提交、回滚等。 XA 接口函数由数据库厂商提供。 二阶提交协议和三阶提交协议就是根据这一思想衍生出来的,而 分布式事务从广义上来讲也是一致性的一种表现: 事务是数据库特有的概念,分布式事务最初起源于处理多个数据库之间的数据一致性问题,但随着IT技术的高速发展,大型系统中逐渐使用SOA服务化接口替换直接对数据库操作,所以如何保证各个SOA服务之间的数据一致性也被划分到分布式事务的范畴。来自 以交易系统为例,看分布式事务架构的五大演进 。所以2PC/3PC也可以叫一致性协议。
在真实的应用中,尽管有系统使用2PC/3PC协议来作为数据一致性协议,但是比较少见,更多的是作为实现 数据更新原子性手段 出现。
为什么2PC/3PC没有被广泛用在保证数据的一致性上?主要原因应该还是它本身的缺陷,所有经常看到这句话:there is only one consensus protocol, and that’s Paxos” – all other approaches are just broken versions of Paxos. 意即世上只有一种一致性算法,那就是Paxos。
更新想要被其它node感知到,就要提交更新,各个一致性协议的不同、缺点,也主要体现在提交方式上:
- 单数据库事务
- 多数据库事务,一个数据源更新操作已提交,另一个数据源更新操作失败,则数据不一致。so,应该在所有数据源更新操作完之后,再提交。
- 基于后置提交的多数据库事务,一个数据源提交成功,另一个数据源提交失败,则数据不一致。
- XA事务,将提交分为两个步骤,预提交、确认提交。前一个步骤“重”,完成大部分提交操作。后一个步骤“轻”,失败概率很低。so,依然会有部分数据源确认提交失败的问题,不过因为概率低,数据量小,可以通过记录日志转向人工处理。
- 从数据库领域延伸到微服务领域,分布式事务,TCC。
- 放弃强一致性、达到最终一致性。初步解决一致性问题后,主要通过异步补偿机制进行部分妥协,提高性能。
一致性和共识
被误用的“一致性” 一致性和算法的误区
我们常说的“一致性(Consistency)”在分布式系统中指的是副本(Replication)问题中对于同一个数据的多个副本,其对外表现的数据一致性,如线性一致性、因果一致性、最终一致性等,都是用来描述副本问题中的一致性的。
分布式共识(Consensus):Viewstamped Replication、Raft以及Paxos
分布式共识问题,简单说, 就是在一个或多个进程提议了一个值应当是什么后,使系统中所有进程对这个值达成一致意见。
这样的协定问题在分布式系统中很常用,比如说选主(Leader election)问题中所有进程对Leader达成一致;互斥(Mutual exclusion)问题中对于哪个进程进入临界区达成一致;原子组播(Atomic broadcast)中进程对消息传递(delivery)顺序达成一致。对于这些问题有一些特定的算法,但是, 分布式共识问题试图探讨这些问题的一个更一般的形式,如果能够解决分布式共识问题,则以上的问题都可以得以解决。
小结一下就是,一致性是一个结果,共识是一个算法,通常被用于达到一致性的结果。
在《区块链核心算法解析》中,则采用另一种描述方式:对于一组节点,如果所有节点均以相同的顺序执行一个(可能是无限的)命令序列c1,c2,c3…,则这组节点 实现了状态复制。
一致性问题 的几个协议及其之间的关系
cap
从CAP理论到Paxos算法 基本要点:
- cap 彼此的关系。提高分区容忍性的办法就是一个数据项复制到多个节点上,那么出现分区之后,这一数据项就可能分布到各个区里。分区容忍就提高了。然而,要把数据复制到多个节点,就会带来一致性的问题,就是多个节点上面的数据可能是不一致的。要保证一致,每次写操作就都要等待全部节点写成功,而这等待又会带来可用性的问题。
- cap 着力点。 网络分区是既成的现实,于是只能在可用性和一致性两者间做出选择。 在工程上,我们关注的往往是如何在保持相对一致性的前提下,提高系统的可用性。
- 还是读写问题。多线程 提到,多线程本质是一个并发读写问题,数据库系统中,为了描述并发读写的安全程度,还提出了隔离性的概念。具体到cap 理论上,副本一致性本质是并发读写问题(A主机写入的数据,B主机多长时间可以读到)。2pc/3pc 本质解决的也是如此 ==> A主机写入的数据,成功与失败,B主机多长时间可以读到,然后决定自己的行为。
下文来自 李运华 极客时间中的付费专栏。
Robert Greiner (http://robertgreiner.com/about/) 对CAP 的理解也经历了一个过程,他写了两篇文章来阐述CAP理论,第一篇被标记为outdated
第一版 | 第二版 | |
---|---|---|
地址 | http://robertgreiner.com/2014/06/cap-theorem-explained/ | http://robertgreiner.com/2014/08/cap-theorem-revisited/ |
理论定义 | Any distributed system cannot guaranty C, A, and P simultaneously. | In a distributed system (a collection of interconnected nodes that share data.), you can only have two out of the following three guarantees across a write/read pair: Consistency, Availability, and Partition Tolerance - one of them must be sacrificed. |
中文 | 在一个分布式系统(指互相连接并共享数据的节点的集合)中,当涉及读写操作时,只能保证一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance)三者中的两个,另外一个必须被牺牲。 | |
一致性 | all nodes see the same data at the same time | A read is guaranteed to return the most recent write for a given client 总能读到 最新写入的新值 |
可用性 | Every request gets a response on success/failure | A non-failing node will return a reasonable response within a reasonable amount of time (no error or timeout) |
分区容忍性 | System continues to work despite message loss or partial failure | The system will continue to function when network partitions occur |
李运华 文中 关于Robert Greiner 两篇文章的对比 建议细读: 要点如下
- 不是所有的分布式系统都有 cap问题,必须interconnected 和 share data。
- 强调了write/read pair 。这跟上一点是一脉相承的。cap 关注的是对数据的读写操作,而不是分布式系统的所有功能。
Paxos
Paxos算法
* Phase 1 * proposer向网络内超过半数的acceptor发送prepare消息 * acceptor正常情况下回复promise消息 * Phase 2 * 在有足够多acceptor回复promise消息时,proposer发送accept消息 * 正常情况下acceptor回复accepted消息
只有一个Proposer能进行到第二阶段运行。
目前比较好的通俗解释,以贿选来描述 如何浅显易懂地解说 Paxos 的算法? - GRAYLAMB的回答 - 知乎 。
一些补充
-
proposer 和 acceptor,异类交互,同类不交互
-
proposer 贿选 不会坚持 让acceptor 遵守自己的提议。出价最高的proposer 会得到大部分acceptor 的拥护(谁贿金高,acceptor最后听谁的。换个说法,acceptor 之间没有之间交互,但), 但会以最快达成一致 为目标,若是贿金高但提议晚,也是会顺从 他人的提议。
思维线条
下面看下 《区块链核心算法解析》 中的思维线条
-
两节点
- 客户端服务端,如何可靠通信?如何处理消息丢失问题
- 请求-确认,客户端一段时间收不到 确认则重发,为数据包标记序列号解决重发导致的重复包问题。这也是tcp 的套路
- 单客户端-多服务端
-
多客户端-多服务端
- 多服务端前 加一个 单一入口(串行化器), 所以的客户端先发给 串行化器,再分发给服务端。即主从复制思路==> 串行化器单点问题
-
客户端先协调好,由一个客户端发命令
- 抽取独立的协调器。2pc/3pc 思路
- 客户端向所有的服务端申请锁,谁先申请到所有服务器的锁,谁说了算。缺点:客户端拿到锁后宕机了,尴尬!
- 票的概念,弱化形式的锁。paxos 套路(当然,具体细节更复杂)
- 广播多轮投票。随机共识算法,不准确描述:假设只对01取得共识,第一轮每个节点随机选定一个值,广播给其它所有节点,节点收到超过半数其它节点的值,如果恰好是同一个值,则节点改变自己本轮的“意见”,重新广播该值。
tips
- paxos 无法保证确定性,即理论上存在一直无法达成一致, 不停地投票的情况
- paxos/随机共识算法等 假定 参与节点都按规则 运行的基础上
- FLP 原理:不存在一个确定性算法 总是能解决共识问题。
拜占庭节点:节点可能不按规则行事,甚至故意发送错误数据,多个拜占庭节点也可能串谋。
基于拜占庭节点达成共识
- 拜占庭容错(BFT)算法,一系列算法的统称。网络中节点的数量和身份必须是提前确定好的
- POW,间接共识,先选谁说了算,再达成共识。
两个算法对cap的侧重有所不同
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
史蒂夫·乔布斯传
[美] 沃尔特·艾萨克森 / 管延圻、魏群、余倩、赵萌萌、汤崧 / 中信出版社 / 2011-10-24 / 68.00元
这本乔布斯唯一授权的官方传记,在2011年上半年由美国出版商西蒙舒斯特对外发布出版消息以来,备受全球媒体和业界瞩目,这本书的全球出版日期最终确定为2011年11月21日,简体中文版也将同步上市。 两年多的时间,与乔布斯40多次的面对面倾谈,以及与乔布斯一百多个家庭成员、 朋友、竞争对手、同事的不受限的采访,造就了这本独家传记。 尽管乔布斯给予本书的采访和创作全面的配合,但他对内容从不干......一起来看看 《史蒂夫·乔布斯传》 这本书的介绍吧!