Erasure Code在SDS中的应用,以Ceph和VSAN为例
在SDS(软件定义存储)领域,多备份(Replication)是流行的数据保护方案;但是,随着数据量的增大,硬件成本是一个重要的考虑因素。Erasure Code相对于Replication具有更高的空间使用率,成为一些场合的优先选择。例如在Supermicro推出的Ceph整体解决方案中,存档和音频就使用了这种策略。
Erasure code是个什么概念呢?简单地说,就是把一份数据分成k个chunk,计算出m个校验信息,然后存放在k+m个不同的磁盘上,这样可以保证在任意m个磁盘同时损坏时数据依然能够完全恢复回来。所以,Erasure code使用k+m来表示,如上图中的7+2。(严格意思上讲,k个chunk不一定是原始数据,但是这种实现最简单)
上面这个介绍让我们想到了更为熟知的RAID,在RAID中,我们也经常提到n+1,n+2等。但是RAID这个概念在SDS中已经被摒弃,因为我们需要服务器节点间的数据保护,而不是Local形式。然而RAID的影响却一直存在,比如Replication的方式跟RAID1实现接近,Erasure code则类似于RAID5/6。新的数据保护将RAID从磁盘层面扩展到服务器节点层面,提高了数据保护的范围,增强了扩展性,为实现PB级的数据存储系统提高保障。
Erasure code的类型(算法)
Erasure code并不是一个很新的东西,在学术界和工业界都有很多研究和实现,在分布式和云计算领域已经被大量使用。
典型的Erasure code算法有Reed-Solomon和LRC。这些算法的区别除了编解码使用的时间和CPU overhead之外,还有对读写性能和Reconstruction的效率产生的影响,如Azure上使用的LRC相比于其他的算法消耗更少的读操作。
而清华大学的EC-FRM算法结合Reed-Solomon和LRC在读速度方面获得提升。
可以看到,不同的算法具有自己的优势,实际中面对具体的业务模型可以选择不同的算法。抛开这些陌生的算法,其实有一种简单的实现就是前面提到的RAID5/6,根据Erasure code的定义,RAID5/6可以实现k+1和k+2,这也是目前VMware VSAN中采纳的算法。
在实际的工程中,我们不一定需要掌握这些算法才能使用它们,因为已经有很多研究机构公布了它们的实现代码,如Jerasure erasure code,Luby erasure code等。这些实现在编解码效率上存在差异,下图展示了它们在RAID 6+2的编码效率的区别。
VMware VSAN中的Erasure code应用
在VSAN6.2以上,存储策略提供了RAID1(多备份)和RAID5/6的保护级别。
这里的RAID5/6是在故障域这一层面实施。由于使用的是RAID5/6,Erasure Code状态下FFT就只能为1或者2。如果我们以一个ESXi Host为一个故障域,则chunk数据被均匀分布在这些Host中。
Ceph中的Erasure code应用
Ceph在Firefly版本就已经具备了Erasure code的能力。作为一个开源的系统,ceph直接使用plugin的方式将外界实现的Erasure code算法导入到自己体系中。如下是一个使用Jerasure 的配置文件。
用户在创建存储池的时候,就决定了其存储类型,称之为Replicated Pool和Erasure Coded Pool。Ceph中,chunk分布在各个OSD上,用户可以通过CRUSH配置来进一步控制chunk在服务器节点的分布。
这里我们可以粗略比较下Replication和Erasure code占用的存储空间。如以容错2磁盘的保护级别来设计,在Replication方案中,用户数据备份在3个OSD上,实际占用空间为原始数据的300%;在Erasure code方案中,用户数据被拆成3部分,然后计算2个校验信息,5等份存储在5个OSD上,实际占用空间为原始数据的166%。两者相差接近1倍。
在Ceph的实施文档中,更直观地展示了Erasure code对数据的处理。
Erasure Code对性能的影响
Erasure Code能够节省这么多的空间,为什么没有被广泛使用呢?除了这些feature推出时间较短之外,一个重要原因是其对性能影响较大。在VSAN中,其明确将RAID1标记为Performance,RAID5/6标记为Capacity,意味着选择RAID5/6在节省容量的同时,造成性能下降。在Supermicro的解决方案中,纠删码也只用于对性能要求低,对容量要求高的存档等场景。那么他们到底产生多大的影响呢?忽略算法间的差异,Redhat的一份白皮书公布了他们的测试数据,可以作为参考。
我们只比较Erasure code相对于Replication的性能下降,从下图可以看到,在顺序写带宽方面,Erasure code造成明显的性能下降(除了4KB的时候,此时性能本来就很低)。
在顺序读时,虽然此时不需要编解码,但是由于Erasure Code导致数据分布在多个osd上,所以一个读请求产生更多的读操作,降低了性能。而对于Replication方式,则可直接读取Primary OSD上的数据。
来自 Mellanox的Dror Goldenberg通过图示讲解了这个过程的细节:Replication(图上方)和Erasure code(图下方)。可以看到,同样的保护级别,Erasure code读写操作更多。
总结
在分布式存储中,简单的备份处理是最常用的方式。但是随着更多的业务部署和数据量的急剧增加,这种方式缺点显现。Erasure Code是相对于多备份的另一种选择,但对性能造成负面影响,被认为是性能要求不高而容量很大的存储场景的最好选择。近两年,SSD尤其是NVMe的普及为系统提供了性能阈量,一定程度弥补了Erasure Code这个缺点对应用的影响,为后期该技术的推广提供了有力支撑。
参考文献
https://www.supermicro.com/solutions/storage_ceph.cfm
http://docs.ceph.com/docs/master/rados/operations/erasure-code/#creating-a-sample-erasure-coded-pool
https://www.redhat.com/en/files/resources/en-rhst-ceph-cache-tier-erasure-coding-faq-INC0218091.pdf
http://cormachogan.com/2016/02/15/vsan-6-2-part-2-raid-5-and-raid-6-configurations/
https://community.netapp.com/t5/Technology/Erasing-Misconceptions-Around-RAID-amp-Erasure-Codes/ba-p/83689
http://web.eecs.utk.edu/~plank/plank/papers/CS-08-625.pdf
http://www.snia.org/sites/default/files/SDC/2016/presentations/erasure_coding/DrorGoldenberg_Optimize_Storage_Efficiency-v2.pdf
https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/LRC12-cheng20webpage.pdf
http://storage.cs.tsinghua.edu.cn/~jiwu-shu/papers/ EC-FRM