分布式系 统应用到存储和数据库时 ,数据需要冗 余,而复制技术就是将数据复制 到多台服务器 ,从而在某台服务器 发生故障后,仍然能够提供服务。
2.1.1数据冗余技术
在计算机系统中,为原始数据增加额外的辅助数据来帮助错误检测和 数据恢复 ,就叫作数据冗余 ( Data Redundancy) 。例如,循环冗 余校验 ( CyclicRedundancyCheck, CRC)、副本、独立硬盘冗 余阵列 ( RedundantArrayofIndependentDisks, RAID)、纠删码就是典型的数据冗 余技术 。
1. 副本
将数据写入为多份副本 ,如 2 副本、3 副本,从而在单个副本发生故障后还能够读出数据,并进行数据修 复。按副本方式写入数据会存 在存储放大比,如 2副本的存储放大比为2。
2. RAID
RAID将多块盘组合在一起,通过算法提供数据冗 余,典型情况下支待多种 RAID 类型:
• RAIDO类 型 。将数据切 片存放到多块盘。例如,将1MB数据切为 8份,每份为 128KB ,存放到 8块盘。该类型通过多块盘同时存储数据 ,达到提升性能 的目的,此时没有 数据冗余,存储放大 比为 l。
• RAIDl类型。将数据冗 余存储,也叫作数据镜像 ,可以写 2份或多 份,没有校验计算代价。此时有数据冗余,存储放大比为 N( N表示镜像份数)。
• RAID2类型。将数据按位(bit)做条带 (Striping),同时用汉明码 ( HammingCode)计算校验保证冗余。例如,将1MB数据存放到9块盘,其中第9块盘专门存放汉明码校验值,其他8块盘按位存放1MB数据,第1位存放到第1块盘,第2位存放到第2块盘,……,第8位存放到第8块盘,前8位的汉明码校验值存放到第9块盘,第9位存放到第1块盘,依此类推。
• RAID3类型。将数据按字节 (Byte) 做条带 ,同时用校验 ( Parity, 典型如 XOR异或)保证冗余。例如 ,将 1MB数据存放到 9 块盘,其中第 9块盘专门存放校验值,其他 8块盘按字节 存放 1MB数据,第1字节存放到第 1块盘,第 2字节存放到第 2块盘,… ,第 8字节存放到第 8块盘,前8字节的校验值存放到第 9块盘,第9字节存放到第 1块盘,依此类推。
• RAID4类型。将数据按块(Block)做条带,同时用校验(Parity,典型如XOR异或)保证冗余。例如,将1MB数据存放到9块盘,其中第9块盘专门存放校验值,其他8块盘按条带大小存放1MB数据,其中分块大小为4KB。那么,第1块存放到第 l块盘,第2块存放到第 2块盘,…… ,第8块存放到第8块盘,前8块(共32KB)的校验值存放到第9块盘,第9块存放到第1块盘,依此类推。
• RAIDS类型。巾千RAID4是固定的盘存放校验,在发生数据故障时都需要读取校验盘,因此该盘成为系统瓶颈,RAID5为了解决该问题,将校验数据轮转存放到不同盘。例如,数据按128KB分片存放到9块盘,第1MB的数据按顺序存到盘l~盘8而校验数据存放到盘9,第2MB的数据按顺序存到盘2~盘9而校验数据存放到盘
l,依此类推。从而将系统的校验数据分布到所有的盘上,在数据修复时就可以充分发挥多盘的能力 ,提高数据修复性能。
• RAID6类型。巾千 RAID5只有一块盘存放校验数据,在盘容量大(如 20TB) 时修复时间很长,在此期间可能再次发生盘故障,从而出现数据丢失,为了解决该间题引入 RAID6, 它计算两份校验数据 (P和 Q) ,然后将它们存储在额外存储空间内 ,如10块盘存数据 、2块盘存校验。同样,为了降低固 定盘存放校验数据对 修复的性能影响,会像 RAID5那样将校 验块分布 到所有盘上,提升修复性能。
将 RAID2~RAID5数据存到 N个盘,校验数据只有 1 个盘,存储放大比为 ( N+l) IN;
将 RAID6数据存到 M个盘,校验数据只有 2个盘,存储放大比为 ( M+2) IM。
1. . 纠删码
RAID6技术最多提供 2个校验块 的计算,为了支撑更多校验块计算,业界引入 基千里德-所罗门 ( Reed-Solomon) 算法。该算法支待基千 N个数据块计 铮 M个校验块 ,存储放大比为 ( N+M) IN。
2.2.2复制一致性
业界的一致性由以下两个术语来描述:CAP和 ACID。
• CAP。该术 语于 1998年由 EricBrewer提出,其中 C表示一致性 ( Consistency, 读请求应该得到最新写入 数据,或者返回 错误),A表示可用 性 (Availability, 读/写 请求尽量得到响应,读可以不用返回最新写入数据),P表示分区容错能力 ( Partitiontolerance,网络节点丢包后,系统能够继续工作),对千典型的分布式系统,最多只能满足以上的两项。CAP 常用千分布式系 统,特别是副本数据冗 余场景,最终一致性(BASE) 就是选择满足A和 P而牺牲C。
• ACID。该术语于 1983由 AndreasReuter和 TheoHarder在JimGray的成果上提出,其中 A表示原子性(Atomicity) , C表示一致性( Consistency) , I表示隔离性( Isolation ) ,D表示持久性 ( Durab山 ty)。ACID常用千 数据库系统,它不关注底层副本数据冗 余,而是重点描述多个并发事务请求对 数据库记录 的表现,特别是写事务和写事务请求间、读事务和写事务请求间的表现。
所以,CAP的 C描述数据多副本之间的一致性,而 ACID的 C和 I结合起来 描述多事务并发请求在单份数据库记录 上的读、写的一致性,本书重点描述 CAP的分布式系统多副本数据的一致性。
1. . — 致性模型
对千典型的客户端/服务端系 统,通常都是从客户端衡量一致性的。但是分布式系 统存放多副本时 ,会有两种维度的一致性模型 ( ConsistencyModel) ,如图 2-14所示。
· 客户端一致性模型。多个客户端会同时访问服务端,如图 2-14中的客户端 l写对象X,表示为 W(X); 客户端 2也写对象 X, 表示为 W(X); 客户端 3读对象 X, 表示为R(X);客户端 N写对象 Y, 表示为 W(Y) 。此时客户端 N访问 Y和客户端 1~3访问X没有关联,可以同时执行。而客户端1~3都是访问X, 所以执行的顺序和返 回值决定一致性,应用和编程语言非常关 注该一致性行为 。
· 数据副本一致性模型。服务端采用分布式系统 的多数据副本时,正常状态时,多个副本保存的值相同,但某些故障状态时,不同副本可能保存的值不全相同。例如,图2-14中的副本 1~3中X对象的值为 101,而副本 M因为某些故障导致X对象的值为旧值 100。此时,多副本针对 X对象的值并未完全达成一致,还需要将副本 N的X值更新为 101;
如果系统设计不当,将 X对象的新值101返回给部分客户端,将副本 M的1B值 100返回另外部分客户端 ,那么就导致不同客户端得到对象 X的不同值。
图 2- 14一致性模型
1. 客户端维度的— 致性模型
客户端维 度的一致性定义 访间不同对象及相同对象 并发读/写 的表现,2007年,AndrewTanenbaum在DistributedSystems: PrinciplesandParadigms一 书 中 定义如下典型类型。
· 单调读一致性。若议对象 X返回值为 v, 则其后所 有读取对象 X的请求必须返回 V。
· 单调写一致性。在客户端的同一进程内,只有写对象 X的请求从服务 端返回后,才能执行新 的写请求。
· 读自己写一致性。在客户端的同一进程内,写对象 X的请求从服务 端返回后,后续读请求必须返回新的 写入值。
· 读后写一致性。在客户端的同一进程内,在写对象X前,必须先读取对象 X的值,根据该旧值再写入 新值。读后写一致性常用 千 MVCC的多版本并发控制 机制。
上面从教科书 的维度描述了一致性模型,而从应用编程的角 度看,客户端维度的一致性模型最好满 足如下要求 。
· 不同对象的访问请求(读、写)可并发执行、互不干扰 。
· 相同对象的读请求可并发执行、互不干扰 。
· 相同对象的读、写请求可并发执行,但 写请求(如写入对象X的值为 111) 返回成功后,再发起 的读请求必须返回新值(如议取对象 X的值必须为 111) ,不管是在哪个客户端 发起的请求。
· 若针对相同对象同时发起写请求,则以最后的写请求为准 ( LastWriteWin) 。例如,客户端 l的请求A写入对象X的值为111,此时客户端 2的请求B写入对象X的值为 112,两个请求几乎同时从客户端写入对象 X。请求 A和请求B通过网络后 ,会有先后顺序到达服务端,服务端将以最后收到的那个请求来更新对象 X的值,假设由于网络问题请求B最后到达服务端,那么对象 X的值最终被保存为 112。由于网络影响,客户 端并发写请求的一致性控制方案,最好是应用根据业务逻辑采用锁机制进行控。制
在某些情况下,为了提高 读请求的成功率,应用接收返回的旧值,叫作最终一致性( EventualConsistency) 。例如,写请求 (如写入对象 X的新值为 111) 返回成功后 ,再发起的读请求可以返回刚写入的值(如读取对象 X的值返回最新的 111) ,也可 以返回旧值 (如读取对象X的值返回旧的 100)。
(接下文