全部博文(356)
分类: LINUX
2018-12-06 15:22:11
原文地址:关于数据一致 作者:raochaoxun
在大型业务中,随着业务扩张,不可避免带来数据的扩张,数据扩张就涉及到数据分布存储。出现一些分库分表,按业务切分,按key切分等思想。其中为了提高性能。比较常用的有 master/slave 方式提高读性能。这是目前大部分企业使用的方式,因为这个比较容易实施,简单容易理解。
但是,这并不能达到我们最终目标,对于开发人员来说,最理想的状况是,不用考虑机器容量和机器性能,而是有一个无限容量的虚拟机器,可以无限制读写,无限CPU运算。不光是可以支撑大并发安全读,还可以支持大并发安全写。于是乎就有master/master方案。
并发写引来的问题是数据一致性问题,关于这些话题,已经不是新鲜话题。网上各种资料也不少,作为时代的话题,我也不甘寂寞,写下一点文章,希望能为众多资料中做一点补充。我侧重于一些细节的整理。本篇文章只是作为一个引子导出,后续会有一些详细的东西出土。
1、 CAP理论
Eric Brewer 于2000 提出:Consistency(一致性)、Availability(可用性)、Tolerance to network Partitions)分区容错性),任何分布式系统只可能同时满足二点,没法三者兼顾。
Consistency: 一致性,一个服务是一致的完整操作或完全不操作,也有人将其简称为数据一致性。也可以理解为不允许同一数据有不同的值。
Availability: 可用性。
Partition Tolerance: 分区容忍性,部分节点故障或节点之间连接故障下系统仍可正常工作。
2、 ACID理论
Atomicity 原子性。一个事务(transcation)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
Consistency 一致性 。两个事务的执行是互不干扰的,两个事务时间不会互相影响。
Isolation 隔离性。两个事务的执行是互不干扰的,两个事务时间不会互相影响。
Durability 持久性。在事务完成以后,该事务对数据库所作的更改便持久地保存在数据库之中,并且是完全的。
3、 BASE理论
Basically Available 基本可用。支持分区失败。
Soft state 软状态状态可以有一段时间不同步,异步。
Eventually consistent 最终一致,最终数据是一致的就可以了,中间有段时间可以不一致。
4、 实际应用中的一些弱一致性约束
Read-your-writes consistency :读不旧于写一致性,使用者读到的数据,总是不旧于自身上一个写入的数据。
Session consistency: 比读不旧于写一致性更弱化。使用者在一个会话中才保证读写一致性,启动新会话后则无需保证。
Monotonic read consistency: 单读一致性,读到的数据总是不旧于上一次读到的数据。
Monotonic write consistency: 单写一致性,写入的数据完成后才能开始下一次的写入。
Writes-follow-reads consistency:写不旧于读一致性,写入的副本不旧于上一次读到的数据,即不会写入更旧的数据。
5、 Quorum NRW模型
N: 复制的节点数量,即主本和副本总数
R: 成功读操作的最小节点数
W: 成功写操作的最小节点数
只需 W+R > N, 就可以保证强一致性。就是读取的份数一定要比总备份数减去确保写成功的倍数的差值要大。
道理很简单,写了W份,那么有W份最新数据, N-W 份旧数据。 因为R > N - W, 所以读出来的数据中总有一个是最新的。
读写速度受性能最差的节点影响,R和W越小,系统的响应越快,W越大,数据的一致性,可用性越强。
W=N, R=1时,高性能读,强一致性。写性能低。
W=1, R=N时,写性能高,读性能低。
建议W = N/2 + 1;
目前常用nosql一般采用N=3
6、 vector clock 向量时钟
上面NRW模型中,如何判断R份读出数据中那一份是最新的数据呢。好啦,就是这个vector clock向量时钟(也叫多版本向量)算法来实现。
向量时钟理论并不复杂,关键是他把数据合并问题留给业务自己去实现,简单业务也许可以简单去实现,但是对有些业务来说,也许是不可能完成的事情。
7、 时间戳
时间戳是比向量时钟跟简单的一种判断数据序列的方法,每次写入数据带上当时绝对时间(精确到微妙)。这里就要求各个server时钟保持一致,这个条件对大多数服务来说,这个算不上问题。
8、 Two-phase commit(2PC)
2pc 和向量时钟,时间戳不同,是从提交时候就解决数据一致性问题,用在NRW模型多写(write)时候或replication,会出现某些W成功和某些W失败,如何防止脏数据(数据不一致),和回滚策略。
2pc思想比较简单,是一个失败,全体不成功;如果成功,就没有一个失败的简单逻辑,实现简单。但是2pc存在一些问题。如机房断电或网络故障时候出现数据不一致问题。在实际生产环境中,很少被使用。
存在一些增强版的2pc,如T2PC和D2PC,有兴趣可以google,资料比较多。这里就不转载别人的内容。后边有时间我自己整理一些这方面内容。
9、 Three-phase commit(3PC)
3pc是2pc的改进版,但是还是存在机房分离脑裂问题。后续单独补充详细篇幅介绍。
10 Paxos --唯一的一致性算法
Paxos 是一种少数服从多数的投票协议,协议比较复杂。网上资料比较多。后续我会在自己理解基础上整理输出一些文章