文章内容:ZooKeeper
作者:优极限
数据存储历史背景
- 所有的的计算任务都由一台计算机完成,数据的存储也由一台计算机完成
- 单节点计算
- 单点故障
- 性能瓶颈
- IO的瓶颈
- 内存
磁盘阵列
Raid简介
- Redundant Arrays of Independent Disks
- 将数据存放在多块磁盘肯定能解决IO瓶颈的问题
磁盘阵列是由很多块独立的磁盘,组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能。利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上。
磁盘阵列还能利用同位检查(Parity Check)的观念,在数组中任意一个硬盘故障时,仍可读出数据,在数据重构时,将数据经计算后重新置入新硬盘中。
条带化
- 问题
- 大多数磁盘系统都对访问次数(每秒的 I/O 操作,IOPS)和数据传输率(每秒传输的数据量,TPS)有限制。
- 当达到这些限制时,后面需要访问磁盘的进程就需要等待,这时就是所谓的磁盘冲突。
- 解决方案
- 条带化技术就是将一块连续的数据分成很多小部分并把他们分别存储到不同磁盘上去。
- 这就能使多个进程同时访问数据的多个不同部分而不会造成磁盘冲突
- 在对这种数据进行顺序访问的时候可以获得最大程度上的 I/O 并行能力,从而获得非常好的性能。
Raid0
- RAID0 具有低成本、高读写性能、 100% 的高存储空间利用率等优点,但是它不提供数据冗余保护,一旦数据损坏,将无法恢复。
- RAID0 一般适用于对性能要求严格但对数据安全性和可靠性不高的应用,如视频、音频存储、临时数据缓存空间等。
Raid1
- RAID1 称为镜像,它将数据完全一致地分别写到工作磁盘和镜像 磁盘,它的磁盘空间利用率为 50%
- RAID1 在数据写入时,响应时间会有所影响,但是读数据的时候没有影响
- RAID1 提供了最佳的数据保护,一旦工作磁盘发生故障,系统自动从镜像磁盘读取数据,不会影响用户工作
Raid2
- RAID2 称为纠错海明码磁盘阵列,其设计思想是利用海明码实现数据校验冗余。
- 海明码是一种在原始数据中加入若干校验码来进行错误检测和纠正的编码技术,其中第 2n 位( 1, 2, 4, 8, … )是校验码,其他位置是数据码
- 海明码宽度和校验码计算
- 如果是 4 位数据宽度需要 4 块数据磁盘和 3 块校验磁盘
- 如果是 64 位数据宽度需要 64 块 数据磁盘和 7 块校验磁盘。
- 海明码的数据冗余开销太大,而且 RAID2 的数据输出性能受阵列中最慢磁盘驱动器的限制。再者,海明码是按位运算, RAID2 数据重建非常耗时。
Raid3
- RAID3 是使用专用校验盘的并行访问阵列,它采用一个专用的磁盘作为校验盘,其余磁盘作为数据盘,数据按位可字节的方式交叉存储到各个数据盘中
- RAID3 至少需要三块磁盘,不同磁盘上同一带区的数据作 XOR 校验,校验值写入校验盘中
- RAID3 完好时读性能与 RAID0 完全一致,并行从多个磁盘条带读取数据,性能非常高,同时还提供了数据容错能力。
- RAID3 写入数据时,必须计算与所有同条带的校验值,并将新校验值写入校验盘中。
- 一次写操作包含了写数据块、读取同条带的数据块、计算校验值、写入校验值等多个操作,系统开销非常大,性能较低。
- 如果 RAID3 中某一磁盘出现故障,不会影响数据读取,可以借助校验数据和其他完好数据来重建数据。
Raid4
- RAID4 与 RAID3 的原理大致相同,区别在于条带化的方式不同。
- RAID4 按照块的方式来组织数据,写操作只涉及当前数据盘和校验盘两个盘,多个 I/O 请求可以同时得到处理,提高了系统性能。
- RAID4 按块存储可以保证单块的完整性,可以避免受到其他磁盘上同条带产生的不利影响。
- RAID4 提供了非常好的读性能,但单一的校验盘往往成为系统性能的瓶颈。
- 数据块
- 数据块也称为存储块,它包含为文件系统分配的其余空间。这些数据块的大小是在创建文件系统时确定的。
- 缺省情况下,为数据块分配以下两种大小:8 KB 的逻辑块大小和 1 KB 的段大小 (fragment size)。
Raid5
- RAID5 应该是目前最常见的 RAID 等级,它的校验数据分布在阵列中的所有磁盘上,而没有采用专门的校验磁盘。
- 对于数据和校验数据,它们的写操作可以同时发生在完全不同的磁盘上。
- RAID5 还具备很好的扩展性。当阵列磁盘 数量增加时,并行操作量的能力也随之增长
- RAID5 当一个数据盘损坏时,系统可以根据同一条带的其他数据块和对应的校验数据来重建损坏的数据
- 重建数据时, RAID5 的性能会受到较大的影响。
Raid6
- RAID6 引入双重校验的概念,它可以保护阵列中同时出现两个磁盘失效时,阵列仍能够继续工作,不会发生数据丢失。
- RAID6 不仅要支持数据的恢复,还要支持校验数据的恢复,因此实现代价很高,控制器的设计也比其他等级更复杂、更昂贵。
- RAID6 思想最常见的实现方式是采用两个独立的校验算法,假设称为 P 和 Q ,校验数据可以分别存储在两个不同的校验盘上,或者分散存储在所有成员磁盘中。
- RAID6 具有快速的读取性能、更高的容错能力。但是,它的成本要高于 RAID5 许多,写性能也较差,并有设计和实施非常复杂。
- <img src="https://i0.hdslb.com/bfs/album/088f2391f96a7ec92586eeb614fdb073f62206eb.png" alt="1603900520854" style="zoom:150%;" />
CAP原则
定义
- CAP定理是2000年,由 Eric Brewer 提出来的。Brewer认为在分布式的环境下设计和部署系统时,有3个核心的需求,以一种特殊的关系存在。
- 这3个核心的需求是:Consistency,Availability和Partition Tolerance
- CAP定理认为:一个提供数据服务的存储系统无法同时满足数据一致性、数据可用性、分区容忍性
概念
- Consistency:
- 一致性,这个和数据库ACID的一致性类似,但这里关注的所有数据节点上的数据一致性和正确性,而数据库的ACID关注的是在在一个事务内,对数据的一些约束。
- 系统在执行过某项操作后仍然处于一致的状态。在分布式系统中,更新操作执行成功后所有的用户都应该读取到最新值。
- Availability:
- 可用性,每一个操作总是能够在一定时间内返回结果。需要注意“一定时间”和“返回结果”。
- “一定时间”是指系统结果必须在给定时间内返回。
- “返回结果”是指系统返回操作成功或失败的结果。
- Partition Tolerance:
- 分区容忍性,是否可以对数据进行分区。这是考虑到性能和可伸缩性。
推导
- 如果要求对数据进行分区了,就说明了必须节点之间必须进行通信,涉及到通信,就无法确保在有限的时间内完成指定的任务
- 如果要求两个操作之间要完整的进行,因为涉及到通信,肯定存在某一个时刻只完成一部分的业务操作,在通信完成的这一段时间内,数据就是不一致性的。
- 如果要求保证一致性,那么就必须在通信完成这一段时间内保护数据,使得任何访问这些数据的操作不可用。
结论
- 在大型网站应用中,数据规模总是快速扩张的,因此可伸缩性即分区容忍性必不可少,规模变大以后,机器数量也会变得庞大,这是网络和服务器故障会频繁出现,要想保证应用可用,就必须保证分布式处理系统的高可用性。
- 在大型网站中,通常会选择强化分布式存储系统的可用性和伸缩性,在某种程度上放弃一致性
数据的一致性
定义
- 一些分布式系统通过复制数据来提高系统的可靠性和容错性,并且将数据的不同的副本存放在不同的机器
- 在数据有多分副本的情况下,如果网络、服务器或者软件出现故障,会导致部分副本写入成功,部分副本写入失败。这就造成各个副本之间的数据不一致,数据内容冲突。
模型
- 强一致性
- 要求无论更新操作实在哪一个副本执行,之后所有的读操作都要能获得最新的数据。
- 弱一致性
- 用户读到某一操作对系统特定数据的更新需要一段时间,我们称这段时间为“不一致性窗口”。
- 最终一致性
- 是弱一致性的一种特例,保证用户最终能够读取到某操作对系统特定数据的更新。
- 从客户端来看,有可能暂时获取的不是最新的数据,但是最终还是能访问到最新的
- 从服务端来看,数据存储并复制到分布到整个系统超过半数的节点,以保证数据最终一致。
最终一致性
- 因果一致性(Casual Consistency)
- 如果进程A通知进程B它已更新了一个数据项,那么进程B的后续访问将返回更新后的值,且一次写入将保证取代前一次写入。
- 与进程A无因果关系的进程C的访问,遵守一般的最终一致性规则。
- 查询微博和评论
- 读己之所写一致性(read-your-writes)
- 当进程A自己更新一个数据项之后,它总是访问到更新过的值,绝不会看到旧值。这是因果一致性模型的一个特例。
- 读自己的数据都从主服务器去读取,读其他人的数据再从从服务器去读取
- 发表微博与修改微博
- 会话(Session)一致性
- 这是上一个模型的实用版本,它把访问存储系统的进程放到会话的上下文中。只要会话还存在,系统就保证“读己之所写”一致性。如果由于某些失败情形令会话终止,就要建立新的会话,而且系统的保证不会延续到新的会话。
- 确保会话内访问的都是最新的
- 单调(Monotonic)读一致性
- 如果进程已经看到过数据对象的某个最新值,那么任何后续访问都不会返回在那个值之前的值。
- 不会读取最旧的数据
- 单调写一致性
- 系统保证来自同一个进程的写操作顺序执行。要是系统不能保证这种程度的一致性,就非常难以编程了。
- 按照顺序完成数据的书写
感谢大家的点赞与转发,小编会持续转发《优极限》优质文章