原文首发于我的博客「tobe的呓语」欢迎你们的访问收藏啊~php
咱们知道,在面对大规模数据的计算和存储时,有两种处理思路:服务器
在分布式技术还没有成熟的时候,小型机、中型机、大型机、超级计算机逐步升级的方案几乎是大型公司的惟一选择,可是这种垂直扩展是有天花板的,硬件升级的速度远远比不上数据规模的增速,即便是超级计算机也没法知足人们对计算资源的需求。网络
水平扩展方案,也就是在一个系统里不断添加机器的方案,就这么走上了历史舞台。这就是如今的分布式技术。并发
在这篇文章里,我将分别介绍单机系统下的 RAID 存储技术以及分布式系统下的存储分布技术,这两种技术在思想上有很相近的地方,但愿读者慢慢体会。app
RAID,全称是Redundant Array of Inexpensive/Independent Disks,也就是磁盘冗余阵列,这里的 I 有两种说法,一种是 Inexpensive,廉价,另外一种是Independent ,独立。所谓 RAID 就是将多块磁盘组合在一块儿,对外抽象成一个容量大,读写速度高,容错性好的大型磁盘。负载均衡
我很喜欢「抽象」这个概念,由于它为咱们屏蔽了更底层的细节,好比操做系统中的文件系统,虚拟内存等。在我看来,RAID 就是对多个独立磁盘的抽象。分布式
注意,上面的图里的三个方面(存储容量、读写速度、数据可靠性)是衡量存储系统的重要标准,咱们在分布式系统里也会说起,不过如今让咱们先来看看经常使用的 RAID 技术。优化
RAID 0 是数据在从内存缓冲区写入磁盘时,根据磁盘的数量,将数据分红 N 份,而后把这些数据并发写入 N 块磁盘,每块磁盘上存储不一样的数据,这样总体的数据写入速度是单个磁盘的 N 倍,读取固然也是并发执行的。操作系统
所以 RAID 0 具备极快的数据读写速度。可是RAID 0不作数据备份,N块磁盘中只要有一块损坏,数据完整性就被破坏,其余磁盘的数据就没法使用了。设计
RAID 1 的策略更为简单,无论你有几个磁盘,都给我存同样的数据,这样数据的可靠性极高,可是写入速度收到很大影响。
Any read request can be serviced by any drive in the set. If a request is broadcast to every drive in the set, it can be serviced by the drive that accesses the data first (depending on its seek time and rotational latency), improving performance. Sustained read throughput, if the controller or software is optimized for it, approaches the sum of throughputs of every drive in the set, just as for RAID 0. Actual read throughput of most RAID 1 implementations is slower than the fastest drive. Write throughput is always slower because every drive must be updated, and the slowest drive limits the write performance. The array continues to operate as long as at least one drive is functioning.^1
这段话意思是说,RAID 1 的读取速度取决于哪个硬盘能最早访问到待读取的数据,若是软件上有优化,能够达到 RAID 0 的读取速度。可是最慢的磁盘限制了写入速度,由于系统须要等待最慢的磁盘完成写入并作好检验工做。RAID 1 的可靠性好,只要阵列里有任意一块磁盘还能用,阵列就能继续工做,并且当新磁盘替代旧磁盘后,系统会自动复制数据。
RAID 0 读写速度高,但没有数据冗余, RAID 1 作了数据备份,但读写速度受到制约,因此就须要想办法结合 RAID 0 和 RAID 1,扬长避短,RAID 10 就这么出现了。
RAID 10 就是将 N 个磁盘平均分红两份,这两份互为镜像,至关因而 RAID 1,但对于每份磁盘中的 N/2 块磁盘来讲,其存储方式像 RAID 0 同样,能够作到并发读写。这样就作到了折中,在读写速度和容错能力上有一个平衡。
咱们不难看出来,RAID 10 的磁盘利用率较低,有一半的磁盘都拿来作备份了,着实有些奢侈。
就通常状况而言,服务器上不多出现同时损坏两块磁盘的状况,每每是损坏一块磁盘的时候,就换上新的磁盘,而后利用恢复技术恢复损坏磁盘上的数据,因此咱们能够据此设计一个磁盘利用率更高的方案。
有了前面的讨论,咱们能够想到,若是任何一块磁盘上的数据,都能经过其它 N-1 块磁盘上的数据恢复出来,不就解决咱们的问题了吗?
校验机制正好知足咱们的要求。
在写入磁盘的时候,咱们把数据分红 N-1 份,并发写入 N-1 块磁盘,而后用剩下的一块磁盘记录校验数据,这样咱们就能够容忍任意一块磁盘的损坏。
根据校验数据写入的位置,咱们有了两种方案:
相较于 RAID 5,RAID 6 的可靠性更高,由于 RAID 6 采用了两种校验码螺旋写入的方案,这样能够容忍两块磁盘同时损坏。
什么状况下须要这样的容错能力?在大型服务器上,每块磁盘的容量每每很大,在某一块磁盘损坏后,即便立马替换上了新磁盘,也须要很长时间才能把全部数据恢复完毕,那么在这段时间里,若是有另外一块磁盘损坏,数据就没办法恢复了,这是咱们不能接受的,所以就须要 RAID 6 来确保数据的完整性。
PS:本文着重于分布式系统的副本与数据分布的关系,由于这部分的思想与 RAID 有类似之处,关于一致性哈希等问题将单独写一篇文章介绍。
分布式系统应对的存储规模要比单机大不少,但基本思想和设计目标都是一致的:
与单机状况不一样,分布式系统面临的问题要多得多,由于服务器之间的数据是经过网络传输,延时较高,甚至可能会出现网络中断,致使某些机器没法访问。这对咱们的存储方案有很大影响,好比,咱们还能用相似 RAID 5 的校验方式来作冗余吗?
答案是否认的,由于作校验的成本过高了,一次校验须要其它 N-1 台机器的响应,一等就是几十毫秒,效率极低,并且网络负载太大了。相反,RAID 10 的方案看起来更适合如今的状况。
在该方式下,若干机器互为副本,副本机器之间的数据是彻底同样的,就像 RAID 1 的方案同样。这种方式的优势就是简单,但缺点也很明显:
所以,以机器做为副本单位不适合当前的场景,咱们须要寻找其它的途径。
相较于以机器为副本单位,将数据拆分红以数据段为单位做为副本的灵活性更佳,下面我就用一个更直观例子来讲明该方案的优势。
该例子下,机器 1 的全部数据都分布在其余的 7 台机器上,忽略集群中其余的机器。
这种方案为咱们带来了什么好处?
可是这种方案不是没有问题,由于咱们须要一台服务器来记录数据段与机器的对应关系,这台服务器称为元数据服务器。能够想象,随着集群规模的增加,须要管理的元数据的开销也会不断增大,副本的维护难度相应增大,因此如今一种折中的方案是,将某些数据段组成一个数据段分组,以数据段分组为粒度进行副本管理,这样,能够将副本粒度控制在一个较为合适的范围。
分布式存储的副本分布内容就介绍到这里了,但愿你在看完个人文章以后有所收获,期待你的赞和转发!
若是本文对你有帮助,欢迎关注个人公众号 tobe的呓语 ,带你深刻计算机的世界~ 公众号后台回复关键词【计算机】有惊喜哦~