阿里云对数据可靠性保障的一些思考
1. 背景
互联网时代的数据重要性不言而喻,任何数据的丢失都会给企事业单位、政府机关等造成无法计算和无法弥补的损失,尤其随着云计算和大数据时代的到来,数据中心的规模日益增大,环境更加复杂,云上客户群体越来越庞大,从而造成硬件故障、软件失效等错误发生的频率也在猛增,任何架构和流程上的疏漏都可能会造成大面积的数据丢失。由此可见,保证客户的数据可靠性对云计算服务提供商有多重要。
阿里云自研的盘古作为一个已经演进了近10年的分布式存储系统,经受了阿里巴巴内部各种产品、各种硬件的磨炼,发布到公有云来普惠大众,让每个基于阿里云的用户都可以享受到世界领先的数据可靠性服务。因此,在此分享一下阿里云自研的分布式存储系统——盘古针对数据可靠性问题的保障。
2. 数据可靠性的威胁
说起云环境下的数据可靠性,相信更多的一般云用户想到的是硬件错误,这类错误非常多,Firmware引起的静默数据丢失只是非常罕见的一类错误。但是,硬件错误只是云环境下威胁数据可靠性的一小部分因素,导致数据丢失的可能会是软件、运维部分出现错误。由此,可以看出在云环境下保证客户数据可靠性,不单单是硬件或者某一方面的事情,其涉及到存储系统的方方面面,是一个庞大的系统工程,这就要求云服务提供商在各方面都能提供稳定的、可靠的、有效的措施来保障客户的数据。
数据可靠性的威胁一般包括硬件、软件、运维等方面。
硬件威胁:
硬件错误类型非常多,包括磁盘坏道、Firmware bug磁盘静默错误导致数据损坏无法及时发现、电压不稳定导致数据未写入但返回写入成功、SSD长时间下线导致数据丢失、网络传输错误导致数据通过网卡后产生bits反转等,。
软件威胁:
内核bug导致的文件系统数据错乱、系统Page cache导致的机器重启和机房掉电丢失数据、野指针、多线程竞争、上层应用程序指针错乱导致正在被写入和读取的数据污染、存储层软件在机制上有数据丢失的漏洞等。
运维威胁:
运维是当前丢失数据概率最高的因素,包括客户的误操作、误删除等因素。
3. 数据可靠性的保障手段
对于数据可靠性来说,数据副本技术是目前大多数客户最容易理解的容错技术了,也是提升分布式系统可靠性、可用性、可扩展性的常用手段之一。目前,阿里云及各家厂商都提供了三副本技术保障数据的可靠,另外阿里云的三副本技术是支持跨可用区的,考虑到跨可用区的成本较高,现在还仅有少数厂商才能做到。但是,数据可靠性保障不是仅数据副本技术就能做到的,其是一个庞大的系统工程,并不是某一项或几项技术手段就能够保障的,必须从数据中心的基础建设开始、一直到整个软件栈的构建以及多种技术手段共同来保障。下面将详细分析阿里云在云环境下如何系统保障客户数据的可靠性。
3.1. 数据中心基础设施建设
基础设施硬件一般会在不同时间分批次购买不同厂商的硬件设备,其中就包含各种类型的磁盘设备。之所以这样做,除了从成本上考虑之外,还需要考虑影响范围问题。单纯一个厂商采购一旦出现类似Firmware的问题就出现大面积数据丢失,影响众多用户。另外硬件投入使用中也需要对使用情况进行跟踪,例如磁盘设备由于组装、运输等影响,在初期投入生产使用时出错率远远高于后期正常使用期间的出错率,所以刚投入使用的硬件应该有一个烤机的过程,将出错率降低后再投入使用,买来就大面积使用的方式是非常不负责任的一种做法。投入使用后也丝毫不能松懈,需要跟踪每个批次磁盘的Firmware版本更新通知,一旦发现高危风险更新,需要及时打布丁或者将数据迁移,把数据丢失风险降低到最低。
3.2. 数据可靠的软件栈构建
硬件错误类型非常多,想要在数量众多的硬件错误中,预期未来会出现哪种错误是非常困难的,所以需要在软件设计上规避掉硬件问题,设计一套优良的软件栈来防御预期和非预期的错误。
首先软件需要清晰的划分层次,层次间通过清晰的接口来协作,实现端到端的保证在每个环节都保证可靠性、无数据污染。
上层应用系统在接收到客户数据的第一刻起,首先做好数据防错准备,所有后续操作都依赖于此步骤的准备工作。数据防错最基本高效方法是对用户数据产生Checksum数据并传递到之后每一个层次,更高可靠性可以利用对数据做MD5进行保护,在之后的说明中用Checksum为例来说明如何对数据进行保护。
层次间传递数据的所有接口必须携带数据校验Checksum类型和数据的Checksum值。在本层次对数据加工的过程中,首先通过数据加工产生新数据和数据对应的Checksum,之后对新数据运行逆运算来重新产生原始数据并做验证对比,保证加工过程并未损坏任何数据,同时给下一个处理步骤提供数据检查依据,直到数据和对应的Checksum值被存储到底层盘古系统中。
当系统终端用户读取数据时,每个层次逐层检查下层系统的数据正确性,并依照数据加工流程重新恢复出用户需要的数据并返回,从而达到了整个阿里云系统对用户数据的全程无漏洞保护。
3.3. 存储系统设计要点
当上层业务系统加工完成数据后存盘过程中,盘古需要利用三副本和Erasure Coding编码存储技术保证不会由于单点硬件/软件异常导致数据损坏和不可用。
3.3.1. 跨多可用区的三副本技术
三副本技术
阿里云提供一个扁平的线性存储空间,在内部会对线性地址进行切片,一个分片称为一个Chunk。对于每一个Chunk,阿里云会复制出三个副本,并将这些副本按照一定的策略存放在集群中的不同节点上,保证数据的可靠性。
在阿里云数据存储系统中,有三类角色,分别称为Master、Chunk Server和Client。一个写操作,经过层层转换,最终会交由Client来执行,执行过程简要说明如下:
Client计算出这个写操作对应的Chunk。
Client向Master查询该Chunk的三份副本的存放位置。
Client根据Master返回的结果,向这3个Chunk Server发出写请求。
如果三份都写成功,Client向客户返回成功;反之,Client向客户返回失败。
Master的分布策略会综合考虑集群中所有Chunk Server的硬盘使用情况,在不同交换机机架下的分布情况、电源供电情况、机器负载情况,尽量保证一个Chunk的所有副本分布在不同机架下的不同Chunk Server上,有效防止由于一个Chunk Server或一个机架的故障导致的数据不可用。
数据保护机制
当有数据节点损坏,或者某个数据节点上的部分硬盘发生故障时,集群中部分Chunk的有效副本数就会小于3。一旦发生这种情况,Master就会发起复制机制,在Chunk Server之间复制数据,使集群中所有Chunk的有效副本数达到3份。
支持跨多可用区的存储系统
盘古文件系统在生产系统中采用跨多可用区部署的方式,目前还仅是少数能做到,经典的模式是支持横跨三个以上可用区,每个可用区距离30公里到50公里。无论是三副本还是EC(纠删码)副本,都是均匀分布在三个可用区内。任何一次写入都在三个可用区数据落盘后才会返回客户成功。由于各可用区的数据中心有独立的供电,网络和冷却系统等,跨多可用区的存储提供了数据中心级别的容灾能力,在任一可用区完全不服务的情况下,整体服务无缝切换,数据无任何丢失。跨多可用区对阿里云内部核心骨干网络的要求非常极高,端到端的延迟要求在稳定1毫秒以内,并且有Tb级别带宽能力。阿里云投入了大量的资源来建设高容错能力和高性能的多可用区互访的内部核心骨干网络。
综上所述,对云盘上的数据而言,所有用户层面的操作都会同步到底层三份副本上。因此,无论遇到软硬件的错误,这种模式都能够保障数据的可靠性和一致性。
3.3.2. 纠删码技术(Erasure Coding)
对于可靠性来说,数据副本技术是最容易理解的容错技术,目前一般云环境下采用三副本技术。数据副本技术另一大优势在于数据恢复的过程中对计算资源的消耗极少。由于采用的是直接复制,除了数据的存放位置可能需要计算之外,其它过程对CPU的利用极少。但是,使用数据副本技术也会带来两大方面的问题,一个是数据副本所占用的空间太大,对于网络以及磁盘空间都有着极大的负担;另一个问题在于维护副本间的数据一致性会带来极大的资源消耗。
为了提高磁盘的利用率,阿里云的数据中心系统使用冗余纠删码的方法来降低所需要的磁盘,并保证相同的容错能力。Reed Solomon是目前在云存储系统中最常用的纠删码算法。在这个编码中,假设原始数据为k 个大小相同的块,纠删码通过编码产生m 个冗余块,这n = k +m 个块中如果损坏了不超过m 个块,则利用剩下的至少k 个块可以将全部的n 个块恢复出来。如果采用k=8, m=4的情况下,需要150%存储空间即可,并且可以容忍4个磁盘的错误,纠删码技术对副本技术很大的改进。因此,云存储系统保证数据可靠性,研究纠删码极其重要。现在通常采用的副本技术并发读性能好,数据恢复速度快,但成本较高,通常用于保存热数据;采用纠删码成本低,容错能力可以进行选择,但数据恢复代价高,恢复速度慢,通常用于保存冷数据。
传统的盘古文件系统中的纠删码技术酝酿于2012年末,目标旨在通过应用Erasure Codes编码,在保障数据安全的前提下节省盘古数据的存储空间,通过使用某种Erasure Codes编码来达到节省空间的目的,将数据存储效率提升了100%甚至更多。然而,由于其潜在的网络流量、空间利用率等方面的局限性,2017年新一代盘古2.0对纠删码进行了优化和升级,除保持原有纠删码技术的基本功能之外,在设计上,读写场景、流量优化、空间效率上都会有大幅提升。
目前盘古2.0的纠删码技术对外支持多种存储业务,被大量而广泛的使用各种应用场景。阿里云通过采用Cauchy Reed Solomon(CRS)算法编码,该算法简单,编解码效率很高使得相对于盘古三副本模式下3倍的存储效率提升到了约2倍,同时能保证略好的理论数据安全性。阿里云存储的metadata需要设置数据块的数目和校验块的数目,以(3,2)配置为例,阿里云将一块数据拆成3份相同大小的数据块,并利用ErasureCode计算出2块校验块,将这五份数据分别写到5块机器上,如果其中任意2块数据出现了错误,都可以根据存活下来的块进行数据恢复,从而保证了数据的可靠性。
另外,盘古将Erasure Codes的能力实现在盘古内部而不是外部。HDFS Raid将Raid功能以contrib包的形式实现,独立于HDFS核心之外。好处是不会增加核心文件系统的复杂度,坏处是效率和灵活度不足。盘古将Raid功能实现在核心中,通过同各个子模块的紧密结合实现了最高的效率和灵活度。同时,支持实时编解码及文件级别指定编码方法和编码参数。实时编码直接写入Raid文件,无需后台转换,能最大程度节省网络和计算资源。文件级别编码参数的指定使得盘古能同时适用于在线和离线应用的独特要求。
综上所述,阿里云已将纠删码技术大量应用在了云存储环境和产品中,在保障客户数据可靠性的前提下,提升存储效率。未来阿里云将继续深入研究纠删码技术的应用,提升编码速度和数据恢复速度,拓展应用场景。目前,阿里云已和国内外顶尖高校在纠删码技术领域开展了广泛的科研合作,如清华大学、上海交通大学等,研究不同校验链融合的原理与策略和优化方法,尽可能降低跨AZ数据迁移、恢复和校验修改的资源开销,大大提高网络效率,针对不同的应用场景,在同时兼顾性能、成本、可靠性、可用性、可扩展性和管理策略的基础上进行优化。
3.3.3. 及时检测和快速恢复技术
结合三副本和纠删码技术确实能够保证数据一定程度的可靠性,但也需要充分考虑到数据检测和恢复,才能更大程度地保证客户的数据可靠性和可用性。因此,阿里云的盘古提供了及时检测和快速恢复技术,其设计要点:
1. 在选择存储参数时需要根据不同可靠性需求进行定制化。例如元数据的可靠性一定高于数据的可靠性,否则会导致虽然有数据但是数据不知道如何访问,虽然知道丢失了数据,但是说不清楚给用户丢了哪些数据等情况出现。所以元数据应该能够容忍更多的硬件/软件失效情况,一般类似Firmware磁盘静默等错误不会威胁到元数据的安全。
2. 在数据存储位置、介质类型等选择方面也需要做到精细控制,例如为了数据安全性考虑,多个副本需要尽量多的放置在多种介质类型上,防止某个类型的硬件出现错误导致多个副本受到威胁,同时也可以实现数据访问加速和节约成本的目的,一箭双雕。
3. 磁盘存储完成后还需要防止类似Firmware bug、SSD长期不加电、磁盘坏道等导致的静默错误,所以需要存储产品定期运行数据全量扫描、高频次的筛检等维护任务,防止数据静默错误后不能及时发现的问题。
4. 及时发现数据损坏后,需要对不同丢失风险的数据做优先级精确控制,保证高风险的数据被优先恢复。
上面的策略中,及时发现错误、快速数据恢复和数据原有的容错能力配置共同决定的数据可靠性有多高。
在数据存储格式上也需要非常缜密的设计,需要保证:
出现数据损坏可以高效发现,发现过程可以是在用户触发的读操作,也可能是存储产品的后台扫描等过程;
如果出现了元数据丢失、文件系统损坏、运维误操作等情况或者Firmware导致的文件系统元数据损坏,可以使用扫描落盘数据方式来快速重建元数据,将数据丢失风险降低到最低。这种缜密的设计是盘古系统接近10年的生命期内能保证无数据丢失的安身立命的基本功。
3.3.4. 端到端CRC保护
盘古系统提供端到端的数据校验,上层的云存储产品提供数据的CRC,盘古在落盘的时候进行校验,并且把CRC和数据一起写入磁盘。后台任务也一直巡检,检查存储介质可能出现的位跳变(bit rot)错误,一旦发现和写入的CRC不符,找到正确的副本,重新复制一份新的副本。
任何对数据转换的操作前后遵循检查步骤:
数据D转换为D’,计算CRC C’
逆转换D’到D,计算C’’,检查C ?= C’’
进行后续数据传输或存储
防御能力:
代码野指针导致的内存数据污染
网络bits翻转导致的数据错误
磁盘静默错误导致的数据损坏
数据块唯一性特征作为落盘前CRC的初始值:
防止内核文件系统错乱
数据丢失后裸盘扫描特征识别
数据节点定期全盘CRC检查
防止数据静默错误
3.3.5. 灰度变更
灰度变更是另外一项保障客户数据可靠性的关键技术。顾名思义,灰度变更是指在黑与白之间,能够平滑过渡的一种变更方式。这种变更方式类似于A/B test,让需要变更内容一部分先变更到目标内容,一部分保留,如果变更后的内容在运行一段时间内没有发生错误,再逐渐扩大范围,把全部内容变更为目标内容。灰度变更可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。灰度变更的优势在于:
云服务数据可靠性及可用性优先保障。
灰度变更能降低云操作风险,减少影响范围,并且范围可控。
方便集中监控日志,全量变更由于负载均衡的作用,需要整体跟踪,效率较低。
方便数据回滚。
避免出现错误给用户带来坏的体验。
阿里云将灰度变更用于硬件、软件及备份容灾等方面,具体如下:
软件灰度:
操作系统升级
软件版本灰度
硬件灰度:
新机型适配
新存储介质适配
跨地域容灾备份
防止自然灾害、战争引起的数据丢失
增加系统可用性
3.3.6. 防御运维误操作
盘古Pin
支持哪些顶级目录是不允许删除的,可以有效防止命令行中的空格导致的顶级目录被误删除的问题。
回收站
目录树回收站:保证文件删除后可以在目录树的回收站中保留一个可配置时间。
数据节点回收站:在磁盘空间富裕时,尽量保留删除的数据不被覆盖,给误删除数据恢复留余地。
元数据备份
专有云中,定期调用盘古功能对元数据的增量日志进行存储备份,防止数据被误删后恢复时间过长的问题。
盘古集群唯一标识
防止运维操作数据节点从一个集群下线后重新上线到其他集群后数据被清空的问题。
格式化审批
所有数据盘格式化都必须经过盘古管控模块确认数据安全的前提下才允许进行下线格式化。
下线审批
机器和磁盘下线前需要经过全盘扫描后,保证上面的数据在其他机器上有足后的副本数后才允许下线,防止误操作导致服务停止。
4. 总结
综上所述,阿里云非常重视客户数据的可靠性,将其作为一个庞大的系统工程进行设计和保障,久经磨练的盘古在经历了多次软件重构、架构迭代之后,最终作为统一的存储平台支撑各种云产品并推向公共云、专有云,利用跨多可用区的三副本技术、纠删码技术、纠删码和多副本融合技术、及时检测、快速恢复、端到端CRC保护、灰度变更、防止运维误操作等一系列的技术手段,为客户的数据提供了一套系统的保障方案,保障客户能够抵御涉及到硬件、软件及运维等多方面的错误,也保证了阿里云为用户提供世界领先的数据可靠性。
本文作者:刘晨旭
本文为云栖社区原创内容,未经允许不得转载。