分布式存储如何保证数据的可靠性和一致性的

 

对比了开源软件Ceph和Swift的数据存储方式...



最近被客户各种的折磨,因为无论介绍哪种分布存储方案和技术都被问到和几种开源技术相比如何如何,有没有xxx,能不能xxx。无奈之下,小编自己学习了几种开源的对象存储软件,这里把学习的心得发上来一下。不保证原创,但是一定会把引用的原文出处作以说明。

为了保证数据一致性,最简单的技术就是多副本,这里的最简单是原理最简单,实现起来一点都不简单,因为我们设定的题目,不但考虑可靠性,还要考虑一致性。副本越多,一致性就越难保证。因为如果要求多个副本之间强一致,则对于前端的响应速度会变慢,而非强一致的时候,如何保证不会读到没有同步完的副本。

使用多副本方式的软件有大家非常熟悉的Swift和Ceph,下面说一下他们都是如何保证一致性的。

Ceph:

Ceph采用强一致性设计,即Write-All-Read-One,这种模式的好处在于读取效率较高,而且工程难度较低,比较适合与读多写少的系统。

Write-All-Read-One的特点是必须等待所有的副本全部写入完毕才算是写入成功,这实际上对系统硬件的可靠性要求较高,因为如果在写入过程中存在任意硬件故障,则写入过程都要受影响。通常表现为卡顿,一般在数秒级别,时间长短和判断故障的机制以及故障恢复过程中IO的处理策略相关。



上图展示了Ceph的数据保护的机理,即在任意对象访问的时候,会指定其中一个存储节点(OSD, Object Service Device)多个副本中一定有一个是主节点,由该主节点负责将数据分发到其他两个节点。当然数据读取时也是首先访问主存储节点,以此保证,返回的数据一定是最新的数据。

看起来原理很简单,但是怎么都有点Low的赶脚。这种机理的优势很明显,IO在客户端和主IO节点完成,读的性能非常好。分发在内部完成,随意分发的数据不占用外部带宽(分发在本地的情况)。不存在一致性的问题。

但是缺点更明显,首先分发的性能影响着写性能,所以Ceph只适用于读多写少的情况。另外,因为数据十分分散,每个磁盘上可能涉及到很多数据块。而每一个磁盘的损坏都意味着部分的主存储访问实效,访问需要切换到二或三副本。

根据《各品牌硬盘年故障率》(来自百度文库)里面的数据,磁盘年平均故障率2%~10%,3年平均故障率3.1%~26.5%。最高的我们就不说是哪家了,我们取中间值,1年6%,3年15%。一个500颗4TB磁盘的Ceph系统,物理容量2PB,可用容量667TB。1年内IO受影响平均次数为30次,3年为90次。所以Ceph适用的场景应该在百TB级别以内。

Swift:

同样是多副本,Swift设计原理要好一些。



Swift 是基于一致性散列技术,通过计算可将对象均匀分布到虚拟空间的虚拟节点上,在增加或删除节点时可大大减少需移动的数据量;虚拟空间大小通常采用 2 的 n 次幂,便于进行高效的移位操作;然后通过独特的数据结构 Ring(环)再将虚拟节点映射到实际的物理存储设备上,完成寻址过程。

数据一致性模型(Consistency Model

按照 Eric Brewer 的 CAP(Consistency,Availability,Partition Tolerance)理论,无法同时满足 3 个方面,Swift 放弃严格一致性(满足 ACID 事务级别),而采用最终一致性模型(Eventual Consistency),来达到高可用性和无限水平扩展能力。为了实现这一目标,Swift 采用 Quorum 仲裁协议(Quorum 有法定投票人数的含义):

1)定义:N:数据的副本总数;W:写操作被确认接受的副本数量;R:读操作的副本数量

2)强一致性:R+W>N,以保证对副本的读写操作会产生交集,从而保证可以读取到最新版本;如果 W=N,R=1,则需要全部更新,适合大量读少量写操作场景下的强一致性;如果 R=N,W=1,则只更新一个副本,通过读取全部副本来得到最新版本,适合大量写少量读场景下的强一致性。

(3)弱一致性:R+WN/2,再保证读操作与写操作的副本集合至少产生一个交集,即 R+W>N。Swift 默认配置是 N=3,W=2>N/2,R=1 或 2,即每个对象会存在 3 个副本,这些副本会尽量被存储在不同区域的节点上;W=2 表示至少需要更新 2 个副本才算写成功;当 R=1 时意味着某一个读操作成功便立刻返回,此种情况下可能会读取到旧版本(弱一致性模型);当 R=2 时,需要通过在读操作请求头中增加 x-newest=true 参数来同时读取 2 个副本的元数据信息,然后比较时间戳来确定哪个是最新版本(强一致性模型);如果数据出现了不一致,后台服务进程会在一定时间窗口内通过检测和复制协议来完成数据同步,从而保证达到最终一致性。



所以可以看到,Swift的存储方式更灵活一些,可以牺牲一定的一致性从而提高读取速度。而一致性可以通过后台的方式完成同步,从而保证数据的完整。所以Swift和Ceph相比可以获得更大的扩展性。

当然了Ceph的某些优点就是Swift的缺点,对于跨站点的部署,数据的同步和读取需要占用额外的带宽。

特别说明,上面的比较仅限于数据存储方式的比较,至于谁的功能强,算法好不在这里说明。

要说Swift还有什么缺点,就是多份拷贝的原理本身了。3份拷贝意味着3倍的空间存放数据,是否还有能够提高空间利用效率的方法,是否可以向磁盘整列一样用RAID提高磁盘利用率。这就要提到纠删码,只需要


    关注 老鸟论IT


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册