1. 概述

对象存储能够提供海量、安全、低成本、高可靠的云存储服务,使用RESTful API 可以在互联网任何位置存储和访问,容量和处理能力弹性扩展,多种存储类型供选择全面优化存储成本,并提供99.999999999%的数据可靠性。

2. 可靠性定义

数据的可靠性,即丢失数据的可能性,类似于数据库系统中ACID中的D,数据的持久性,一旦在系统中成功写入数据,那么这条数据不应该丢失。

对象存储可靠性定义:
一个对象在一年中保存完整可以被访问到的概率,100%意味着一个对象永远不会丢失,90%意味着对象有1/10的概率丢失。提供99.999999999%的持久性保证,这意味着如果存储10,000个对象,需要经历10,000,000年才有可能丢失一个对象。

3. 可靠性挑战

有很多因素都会影响到存储可靠性,包括:介质故障、灾难性故障、系统故障等方面。

3.1 介质故障

磁盘的局部故障,磁盘的某个扇区损坏,或者是磁头损坏,导致整个磁盘报废,我们可以采用RAID,多副本方式来处理的方式来避免数据丢失。

3.2 灾难性故障

数据中心发生地震、火灾等破坏,这时同一个数据中心的多副本也不能避免数据丢失,可以采用异地数据同步,数据中心间多副本等方法防止灾难性故障。

3.3 系统故障

比如断电和软件错误,由于内存是易失性的,掉电会导致内存中的内容丢失,导致丢失更新。未防止这种情况会现在磁盘上记录操作日志,系统重启后可以进行恢复。

Linux中write调用返回后并不能保证数据写入到磁盘上,机器断电后可能丢失数据,需要使用fsync保证数据写到磁盘。

4. 可靠性保证

业界通过增加数据冗余度来提高可靠性,对象存储也不例外,同时采用多副本、纠删码的方式来提供数据冗余度,通过校验码的方式及时发现数据损坏,通过其他副本后分片来恢复数据。

4.1 多副本

在分布式系统比如SDFS、NEFS中采用副本的方式来提高数据的冗余度。在副本选择时,为了提供服务的可用性,还会考虑到机架的因素,可以将一个副本写入到另外一个机架,即使这个机架因为网络故障时,服务器升级时仍然能够对外提供服务。

一般来说一个机架上的机器很可能是同一批采购的,磁盘出现故障的概率不是完全相互独立,存在着一定的相关性,这也是副本选择时的一个重要依据。

4.3 纠删码

增加副本个数可以提高数据的可靠性,但是无疑会增加存储成本,对于低频的数据可以使用纠删码技术使用降低数据冗余度,在不降低数据的可靠性的前提下降低成本。目前对象存储低频存储引擎就是用纠删码技术(reed-solomon算法)节约存储成本。

Reed-solomon算法的大致原理是: 根据K个原始数据块算出M个校验块,丢失任意M块数据,都能够恢复出来。比如有1G数据,将之分为10个100MB的数据块,计算得到4个校验块,则丢失任意4块数据,都能从剩下的数据中恢复出来。

4.2 校验码

当把数据保存到磁盘上,磁盘有可能会发生扇区损坏,导致某些文件损坏,如果不进行数据校验,则无法发现这些问题。

为了保证用户能够读到正确的数据,我们可以在数据读取时进行校验,如果发现数据损坏可以读另外一个副本或者其他分片。

另外我们还在后台做定期静默检查数据,如果发现数据损坏,则用有效的副本或分片恢复出错副本或分片。

校验算法有奇偶校验、CRC(Cyclic Redundancy Check, 循环冗余校验)、md5、SHA、FNV,在实际工程中crc、md5码、FNV用的比较多。

对象存储采用在不同的路径上采用不同的校验方式。在业务层通过md5的方式检查数据在传输过程中是否出现数据损坏或被篡改。
在存储底层通过crc64的方式检查介质损坏。

4.3 跨分区复制

即使在一个数据中心存储多个副本,但是如果发生地震、海啸、火灾等非可可抗力时,仍然面临数据丢失的风险。或者当发生机房光缆损坏,即使数据不丢但是这段时间不能提供服务,从提供服务的可用性角度,也需要进行异地备份。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐