分布式存储副本和纠删码模式哪个更好用?
各位好,之前给大家具体介绍过分布式存储的副本模式和纠删码模式,两种都是数据冗余方式,只是机制不一样,哪种更好呢?其实没有绝对的更好或者不好,最主要的是要看这两种模式分别具体应用在哪个应用场景之中,今天就来聊一聊吧。
一、副本模式
这里的副本模式不同于简单的数据复制,复制是有源和目标,把源的数据再复制一份到目标空间,这里指的是同时双写或多写,也就是一份数据块同时写了两份或者多份,当其中一份数据块出现了故障,还有另外的一份或者多份中的一份可以立即使用,并且可以恢复损坏的数据块,对用户是透明的。在节点冗余情况下,任一台数据节点故障后,立即将该数据节点中丢失的数据块在其它节点中进行重构恢复,如果该故障节点恢复正常运行状态或加入了新的替代节点,再将新的数据节点加入到可均衡分布的存储资源池当中。
由于副本模式能够支持更多并发访问,无论是多个应用并发访问还是单个访问,数据可以从最快响应的节点中获得,因此系统会提供更好的性能响应,另外因为该模式不涉及额外的运算,所以设备的CPU 开销较低。
在I/O方面,以2副本或者2个以上的多副本节点级冗余为例,1个节点中的数据块故障,数据恢复需要从另外一个节点的副本中读取一次,然后写入一次恢复的数据块,需要开销1个节点的1次读取I/O以及1个节点的1次数据写入I/O,需要2个节点参与,除非在多副本中有2个节点同时损坏时会增加I/O开销,但这种情况概率非常小。
二、纠删码模式
纠删码Erasure Coding(简称EC)的原理与RAID5/6的原理类似,将实际数据以条带的方式写入,条带由数据条带与校验条带组成,所以EC不需要完整写入真实数据的副本,而是通过引入校验数据块保障数据冗余,从而获得了更多的存储空间。EC相对RAID技术而言更加灵活,条带由M个数据块和N个校验数据块组成,而且M和N是可以根据需求来进行调整的,校验位也就是N的值越高冗余性就越强,但相应重建的时候的计算开销也就越大,重建时也是无需任何人工干预的。
纠删码方式在读或写的时候都分别需要读取或写入数据块和校验数据块,在发生故障的时候需要先读取其他的没有损坏的数据块和校验数据块,然后再做计算,再写入到某个节点的硬盘中,所以由于EC读写都需要计算校验值,那么就需要额外的CPU资源开销。如果是校验数据块损坏,数据重构流程是一样的,读取数据块再重新计算即可,也可以理解为互为校验。
在I/O方面,假如纠删码EC设置为2+1(2个数据块1个校验数据块),做节点冗余时,随机的1个节点故障,数据重建需要读取1个数据块和1个校验数据块,需要开销2个节点的共2次读取I/O操作,然后通过运算后再写入一次恢复的数据块到某个节点,实际这个过程需要3个节点的参与。
以节点级冗余为例,EC配置1个校验位(FT=1)与2副本(RF=2)的可靠性相当,允许任意1个节点损坏。EC配置2个校验位(FT=2)与3副本(RF=3)的可靠性相当,允许任意2个节点同时损坏。整体效率副本模式要好一些,而纠删码的可用空间要多一些。
三、总结
抛开成本因素,个人觉得副本模式适合在线的对性能要求相对比较高一些的读写都很繁忙的应用、小文件应用,数据库等等,具体的小文件处理前面写过这里就不多说了,这种模式可用空间利用率虽然相比纠删码模式要小,但是用空间换取安全性或者效率是业内长期以来比较普遍的做法。纠删码模式适合于对性能要求不是那么高的但可用空间容量要求比较大的应用比如备份容灾数据,视频监控存储、媒体资源库,数据归档存储空间等等。