当前位置:文档之家› 分布式存储系统的要点

分布式存储系统的要点

汉柏科技分布式存储系统要点王智民 汉柏科技有限公司分布式存储系统分布式存储系统,有块存储、对象存储、文件存储,有不同的开源项目如Ceph、GlusterFS、Sheepdog、Swift,还有不同的商业实现如Google、AWS、微软、金山、七牛、又拍、阿里云还有Qingcloud首先对象存储和文件存储的区别是不大的,存储的都是一样的东西,只是抛弃了统一的命名空间和目录树的结构,使得扩展起来桎梏少一些。

独立的互联网存储服务一般都是做对象存储的,因为块存储是给计算机用的,对象存储是给浏览器等HTTP客户端用的。

分布式存储系统的三个问题•对于一套分布式存储的方案,怎样评估它是好还是不好?•如何对分布式存储的不同实现进行分类?•分布式存储中的“数据可靠性”是如何计算的?1.运行或在线系统需要高性能2.离线或备份数据需要高容量,低价格3.所有的数据都必须是可靠的,绝对不能丢•对于块存储,要求的访问时延是 10ms 级的,因为给虚拟机用的,传统硬盘也是10ms 级的时延,请求尺寸都很小,但qps(iops)可能会很高,那么在这种情况下: ◦异地多中心是不现实的,存储要和主机尽量接近,相应地可靠性必然会有所打折◦强一致副本不会过多,强一致要求对时延有影响•对于对象存储,要求的访问时延是 100ms - 1s 级的,请求一般是中到大尺寸,低 qps 的,在这种情况下 ◦可以用更多的分散副本数来换取更高的可靠性,但过多副本增加维持一致性的难度,需要折衷分布式存储系统的三个问题•对于一套分布式存储的方案,怎样评估它是好还是不好?•如何对分布式存储的不同实现进行分类?•分布式存储中的“数据可靠性”是如何计算的?按照存储接口来划分1.对象存储: 也就是通常意义的键值存储,其接口就是简单的GET、PUT、DEL和其他扩展,如七牛、又拍、Swift、S32.块存储: 这种接口通常以QEMU Driver或者Kernel Module的方式存在,这种接口需要实现Linux的Block Device的接口或者QEMU提供的Block Driver接口,如Sheepdog,AWS的EBS,青云的云硬盘和阿里云的盘古系统,还有Ceph的RBD(RBD是Ceph面向块存储的接口)3.文件存储: 通常意义是支持POSIX接口,它跟传统的文件系统如Ext4是一个类型的,但区别在于分布式存储提供了并行化的能力,如Ceph的CephFS(CephFS是Ceph面向文件存储的接口),但是有时候又会把GFS,HDFS这种非POSIX接口的类文件存储接口归入此类。

分布式存储系统的三个问题•对于一套分布式存储的方案,怎样评估它是好还是不好?•如何对分布式存储的不同实现进行分类?•分布式存储中的“数据可靠性”是如何计算的?按照应用场景来划分1.对象存储(键值数据库):接口简单,一个对象我们可以看成一个文件,只能全写全读,通常以大文件为主,要求足够的IO带宽。

2.块存储(硬盘):它的IO特点与传统的硬盘是一致的,一个硬盘应该是能面向通用需求的,即能应付大文件读写,也能处理好小文件读写。

但是硬盘的特点是容量大,热点明显。

因此块存储主要可以应付热点问题。

另外,块存储要求的延迟是最低的。

3.文件存储(文件系统):支持文件存储的接口的系统设计跟传统本地文件系统如Ext4这种的特点和难点是一致的,它比块存储具有更丰富的接口,需要考虑目录、文件属性等支持,实现一个支持并行化的文件存储应该是最困难的。

但像HDFS、GFS 这种自己定义标准的系统,可以通过根据实现来定义接口,会容易一点。

分布式存储系统的三个问题•对于一套分布式存储的方案,怎样评估它是好还是不好?•如何对分布式存储的不同实现进行分类?•分布式存储中的“数据可靠性”是如何计算的?按照实现技术来划分1.系统的分布式设计:主从、还是全分布式或者是兼而有之,目前现在存储系统因为一致性的要求,以主从为主。

2.底层的单机存储:一种是依赖本地文件系统的接口,如GlusterFS,Swift,Sheepdog,Ceph一种是依赖块接口的,目前只知道Nutanix是使用这个的一种是依赖键值接口的,目前应该只有Ceph是支持(Ceph支持多种单机存储接口)第一种依赖文件系统是因为分布式存储系统本身已经够复杂,实现者很难从上层一直到底层存储都去实现,而本地文件系统已经是一个通用化并且非常成熟的实现,因此分布式存储系统绝大部分(上述提到的都应该是)都会直接依赖本地文件系统。

第二种接口目前只知道Nutanix是支持的(传统的存储厂商的存储产品一般会使用这种方式),这种接口也就是比第一种去掉了文件系统层,实现一个简单的物理块管理即可。

第三种它的主要原因是“存储定义”和对象存储的普及,希望硬盘来提供简单的键值接口即可,如希捷的Kinetic API,Fusionio NVMKV,这种接口另一方面是闪存厂商非常喜爱的,因为闪存的物理特性使得它支持键值接口比快接口容易得多,目前Ceph是支持这种接口,而希捷和华为最近推出了IP硬盘,听说已经实现了Swift上的原型。

分布式存储系统的三个问题•对于一套分布式存储的方案,怎样评估它是好还是不好?•如何对分布式存储的不同实现进行分类?•分布式存储中的“数据可靠性”是如何计算的?按照实现技术来划分(续)3.策略方面,三副本、多AZ六副本和网络RAID都是一类的,它们都是指数据的分布策略来提供数据可用性,通常来说前两者情况就是数据的多个副本分布在所有服务器的几个中,也就是只要超过副本数的服务器挂掉,存储系统就面临部分数据不可用的情况。

网络RAID是为了避免这种情况,比如在1000台服务器的情况,将其分成10台一组的100组,这样同样是一份数据(Data1)的三个副本都只属于某一个组,它不可用只当1组内(10台)中超过3个台机器不可用时才会发生,这样概率会小非常多。

EC(擦除码)是一个类副本策略,它可以理解为增强版的复制,更少的副本可以达到更好的数据可用。

4.硬件方面,SSD,SAS,SATA和内存的组合是为了提供数据访问的性能。

千兆、万兆甚至Inifiniband是组合是为了提供网络传输的性能。

分布式存储系统的三个问题•对于一套分布式存储的方案,怎样评估它是好还是不好?•如何对分布式存储的不同实现进行分类?•分布式存储中的“数据可靠性”是如何计算的?实际上这个计算是需要依赖于存储系统本身的。

我们使用Ceph,Ceph的优势是提供了一个叫CRush算法的实现,可以轻松根据需要来规划数据的副本数和高可用性。

参考Ceph提供的模型定义来规划自己的。

这是我的同事朱荣泽做的故障计算,这个计算只针对副本策略,并不适合使用EC(擦除码)的情况。

硬盘发生故障的概率是符合泊松分布的。

fit = failures in time = 1/MTTF ~= 1/MTBF = AFR/(24*365)事件概率 Pn(λ,t) = (λt)n e-λt / n!这里只计算丢失数据的概率,不计算丢失每个object的概率。

N代表OSD的个数、R代表副本数、S代表scatter width,关系着recovery时间我们忽略Non-Recoverable Errors的概率计算1年内任意R个OSD发生相关故障概率的方法是:1年内OSD故障的概率。

在recovery时(R-1)个OSD发生故障的概率。

以上概率相乘。

假设结果是Pr因为任意R个OSD不一定属于Ceph的Copy Sets,则Ceph的丢失Copy Sets的概率是:M = Copy Sets Number在N个OSD中,任意R个OSD的组合数是 C(R,N)丢失Copy Sets的概率是 Pr * M / C(R, N)。

最终公式是:P = func(N, R, S, AFR)分布式存储系统的三个问题•对于一套分布式存储的方案,怎样评估它是好还是不好?•如何对分布式存储的不同实现进行分类?•分布式存储中的“数据可靠性”是如何计算的?可靠性的定义可以有不同,比如有人会定义为:假设整个系统有 L 个对象,在 1 年内会损失 m 个对象,那么可靠性为1 - m/L。

我在我那篇文章中的定义是:整个系统有 L 块硬盘,1 年内丢失数据的概率是多少(而不管丢失了多少个对象)。

沿用文章中的可靠性定义,数据可靠性的计算涉及到以下几个量:集群规模-总硬盘数目(L)、容错度(M)、修复速度(t)、单盘可靠性(p:在t时间内损坏的概率)我的计算方法是,先计算这L块硬盘在t时间内同时损坏M+1块硬盘的概率是多少(Pt,也就是丢失数据的概率,当然有细心的网友说t时间内同时损坏M+1块盘不一定会丢失数据,这点当然是正确的,但是这个丢失数据的概率虽然不为1但是非常接近1,而且此时对软件系统来说已经是失控状态,为了简化计算假设为1),然后把时间拉长到1年(T)的数据丢失概率(P)。

这个拉长是非常简单换算公式:P = 1 - (1 - Pt)^(T/t) ≈ Pt * (T/t)所以关键是计算 Pt(这L块硬盘在t时间内同时损坏M+1块硬盘的概率)。

我们扩展一下,用 Pt(i) 表示 t 时间内有且仅有 i 块盘损坏的概率。

前面的 Pt 实际上是 Pt(>M),而不是 Pt(M+1)。

不难得出:Pt(>M) = 1 - Pt(0) - Pt(1) - ... - Pt(M)好了,我们就剩下计算 Pt(i) 了。

这个概率的计算比较常规:Pt(i) = C(L, i) * p^i * (1-p)^(L-i)其中 C(L, i) 是组合数,也就是 C(L, i) = L! / (i! * (L-i)!)至此整个计算过程完成。

不过有一个细节需要说明下,由于以下两个原因,你无法用计算机常规的浮点数计算来得到 P:•C(L, i) 值会很大,甚至会超过 float64 浮点类型的最大值(约为1e308),用浮点运算最终会变 Inf(无穷大)。

•p 非常小,这会导致计算过程精度损失非常大,计算的累计误差无法忽略,答案和理论值大相径庭。

所以如果你真要去算这个概率,需要用无损计算的数学包。

相关主题