盘古分布式存储系统的稳定性实践

简介: 本文介绍了阿里云飞天盘古分布式存储系统的稳定性实践。盘古作为阿里云的核心组件,支撑了阿里巴巴集团的众多业务,确保数据高可靠性、系统高可用性和安全生产运维是其关键目标。文章详细探讨了数据不丢不错、系统高可用性的实现方法,以及通过故障演练、自动化发布和健康检查等手段保障生产安全。总结指出,稳定性是一项系统工程,需要持续迭代演进,盘古经过十年以上的线上锤炼,积累了丰富的实践经验。

盘古分布式存储系统的稳定性实践

 

内容介绍:

一、飞天盘古的整体介绍

二、飞天盘古的稳定性实践

三、总结

 

本次分享的主题是盘古分布式存储系统的稳定性实践,由阿里云智能集团资深技术专家董元元分享。

今天分享的是分布式存储系统盘古的稳定性实践。整个分享内容分为三个部分:首先是对盘古系统的整体概述;接着是深入探讨盘古的稳定性实践;最后是总结环节。而今天的核心内容将聚焦于稳定性实践,具体涵盖数据的高可靠性、系统的高可用性,以及安全高效的生产运维这三个关键方面。

 

一、飞天盘古的整体介绍

盘古是阿里云针对云计算全栈自主研发的分布式存储系统,它基于通用服务器构建,规模庞大。然而,盘古并非阿里云直接面向市场的存储产品,而是作为飞天云操作系统的核心组件,扮演着阿里云统一数据存储底座的角色,为外部提供服务。具体而言,阿里云的各类存储产品,如块存储、对象存储、文件存储、表格存储,以及面向专有云的CDS产品,均是基于盘古构建的。

这些基于盘古的存储产品,支撑起了阿里巴巴几乎所有的数据存储业务,包括阿里巴巴集团的电商核心交易系统、阿里云的计算内大数据产品,以及数据库产品等。如此众多的业务依赖于盘古,这就要求盘古必须满足各业务共性的需求,这些需求可以总结为以下五个方面:

首先是稳定性,即存储数据必须做到高可靠性,确保数据不丢失、不出错。同时,服务也需要具备高可用性,系统服务不能中断,能够持续在线并支持多重容灾。

其次是规模性,盘古能够灵活支持从小到大的不同规模部署,最少支持4台服务器即可部署一个盘古集群,最大则可支持单集群数万台服务器,以满足不同业务对规模的需求。

第三是普适性,盘古能够支持多种业务场景,包括DM业务和高存储业务,同时也能够支持多种硬件介质,如闪存、非易失性存储和磁盘介质。此外,它还支持多种硬件平台,如UX86平台、ARM平台等。

第四是性能,盘古通过软硬件协同设计以及大规模应用RDMA技术,实现了用户网络VUM级的低延迟。例如,基于盘古的ESD云盘,可以单盘提供高达100万的IOPS,延迟控制在100秒以内。

最后是存储能力,盘古为OS盘和VS的每个租户提供了100G的存储能力,为后台存储提供了坚实的基础。在安全性方面,盘古还支持数据默认加密功能。

 

二、飞天盘古的稳定性实践

稳定性虽非新话题,却是众多业务系统需面对却非轻易能解决的共性问题。其之所以成为挑战,在于它是一个宽泛且抽象的目标,涵盖系统架构设计、开发、测试、线上运维等多个环节。任何一环的疏漏都可能引发稳定性风险。对于存储系统而言,稳定性尤为关键,主要体现在以下三个方面:

首先是数据高可靠性,即确保数据既不丢失也不出错,这是存储系统的基石。然而,在实际操作中,这一诉求往往难以实现。

其次,系统高可用性是另一大挑战。由于盘古运行所依赖的软硬件环境复杂多变,故障频发,数据丢失的风险始终存在。因此,我们不仅要确保数据服务的高可用性,还要保障服务在故障发生时能够持续运行,并在约定的时间内完成响应。

最后,安全生产运维也是不可忽视的一环。盘古部署规模大,支持的业务种类繁多,访问模式各异,这无疑增加了安全生产运维的难度。

在数据高可靠性方面,我们主要关注数据不丢和数据不错两个方面。数据丢失的问题主要源于硬件故障和数据未持久化。硬件故障,如服务器和磁盘的持续故障,若超出系统容忍范围,将导致数据丢失。此外,若数据未写入盘片即发生集群断电,也存在数据丢失的风险。在软件设计层面,若数据未持久化即返回用户成功,同样会导致数据丢失。

为了保障数据不丢,盘古采用多副本如三副本策略,确保数据强一致写入盘片后才返回用户成功。多个副本分布在不同的故障域,故障发生后能自动进行数据复制和恢复。同时,我们还实现了坏盘自动检测和ICD盘寿命性检测,以便在磁盘故障或寿命到期时主动替换,避免数据丢失风险。

故障后的数据恢复依赖于数据复制能力,该能力决定了系统对节点或磁盘故障的容忍程度。为了降低成本,业务可能采用大容量磁盘、高密机型以及第一种比例93码的编码方案,这都对数据复制提出了更高要求。例如,大容量机型故障后复制时间较长,若此期间更多节点出现故障,则数据丢失风险增加。

因此,盘古对数据复制进行了大量优化。一方面,我们实现了数据复制任务在全局集群范围内的并发调度和执行,提高数据复制吞吐能力,加快数据恢复速度。另一方面,我们基于优先级和节点负载进行动态任务调度,确保高优先级的数据能够更快恢复。

第三个优化策略是能够基于前台流量进行动态的流量调度。在集群节点数固定的情况下,其总吞吐能力相对恒定。因此,在业务流量低谷时段,我们可以提高数据复制的吞吐能力,以加速数据恢复;而在业务负载高峰时段,则降低数据复制的带宽,将更多吞吐能力分配给前端用户,从而减少对前端用户的干扰。通过这种流量削峰填谷的方式,我们实现了低干扰、高效率的数据复制,提升了节点故障后的数据恢复能力。

关于如何保证数据不出错,其风险来源与数据丢失有所不同。在硬件层面,可能存在磁盘故障、网络传输错误以及CPU的生态cropping导致的数据错误。在软件层面,则可能涉及软件缺陷、内存错误、指针异常等问题。

保证数据不出错的常规方案是基于CRC的数据校验。在业务写入数据时,同时生成数据的CRC校验码。在写入路径上,会对数据和CRC进行校验,一旦发现数据和CRC不匹配,即报错返回。这种方式可以确保在数据写入过程中,如果因软件错误、内存故障或网络传输中的比特反转导致数据出错,能够通过CRC校验识别出错误数据,从而避免错误数据的写入。

在数据读取过程中,也采用类似的校验机制。在返回用户数据之前,会对数据和CRC进行校验,以避免返回错误数据。同时,盘古后台也会定期对数据和CRC进行校验,以发现存储在磁盘上的数据错误。

然而,即便有了CRC校验,也不能完全保证数据的正确性。因为在实际应用中,还存在一些特定场景可能导致数据错误。例子如下。

一个因CPU标准问题导致的数据错误,简称SDC,是由于硬件故障使得CPU产生了错误数据,但CPU自身并未检测到此错误。这种异常通常源于HDC,其成因颇为复杂。简而言之,它可能是在制造过程中未被检测出的随机缺陷,或在使用过程中因温度、电压、频率等因素引发的电路边缘性故障。其实实际上,多家大厂如Google、Facebook以及阿里云已经发现并分析了CPU的SDC问题。阿里云采取了一系列措施,对存在CPU、SDC问题的服务器进行拦截,避免其上线。然而,这种方法并不能完全避免系统运行过程中CPU、SDC问题的出现,它仍可能导致数据错误。因此,系统软件层面的防护仍然必不可少。

CPU的SDC可能导致数据在计算过程中出错,如纠删码的编码、解码、数据加密、压缩等环节,甚至可能导致数据的元数据发生错误。而且,CPU SDC导致的数据错误和元数据错误是无法通过3C校验发现的

以世界阿里算码为例进行说明。纠删码的编码过程是对数据进行切片,然后计算出校验块,并对切片后的数据与原始数据使用CRC进行校验。这种方式可以确保在编码过程中输入数据的正确性。但它无法保证在CPU的SDC发生时,计算过程不受影响,从而可能产生错误的校验块。由于这些校验块在生成时并未使用CRC进行预先校验,因此无法识别出其中的错误,进而引发数据错误。

针对这类问题,盘古采用的方案是数据副本间的交叉校验。从算法层面来看,这相当于对数据先进行编码,再解码,然后用解码后的数据与原始数据进行对比,以确保计算过程的正确性。但这种方式会增加较大的计算开销。为此,盘古还进行了一系列计算优化,以及数据加密压缩和类似的数据交叉校验方法,以避免CPU SDC引入的数据错误。

然而,CPU的SDC还可能引发数据的元数据错误。为了解决这个问题,盘古为所有数据块设计了一个实际化的数据块结构,其中包含了自包含的元数据。这些自包含的元数据也使用CRC进行校验。在自包含的元数据中,还会与系统中的元数据进行交叉对比,以确保数据块元数据的正确性。

通过这一系列措施,盘古在保障数据正确性方面积累了丰富的经验。在所有涉及数据正确性的IO路径上,我们不仅采用了完备的基于实验室的端到端数据校验,还设置了多级的交叉校验方式,如数据副本间的交叉校验、数据与元数据的一致性交叉校验等机制。

接下来是保障系统高可用方面的实践经验。在大规模部署的环境下,盘古运行的软硬件环境中的小概率故障已成为常态。

这是系统极简的模块图,图中的每个模块以及连接模块之间的网络都存在潜在的故障风险,这些故障都可能影响服务的可用性。例如,硬盘有4%的年化故障率,机器有2%的日宕机概率,网络则可能出现中断、丢包、重传以及网络分区等问题。原数据服务和业务进程同样会受到机器宕机、硬盘故障以及网络故障的影响,进而威胁到服务的可用性。此外,机房还可能遭遇断网、断电、升温等突发事件,导致AZ级别的故障。在这种背景下,盘古不仅要确保服务不中断,还要在约定的时间内完成响应。

我们将从数据节点和硬盘故障、原数据节点故障以及AZ级故障三个方面来介绍盘古采用的高可用实现方案。

首先,数据节点和硬盘的异常种类繁多,对业务可用性的影响显著,可能导致业务请求超时或延迟大幅增加。例如,数据节点或硬盘可能因故障而无法响应请求,导致业务请求超时;或者集群中部分节点和硬盘性能明显落后于其他节点和硬盘,导致业务请求响应缓慢,造成请求堆积;系统中存在的热点也可能导致业务请求响应时间变长。

针对这些问题,盘古的解决方案是对节点和硬盘进行实时异常检测。一旦判定访问的数据节点或硬盘出现异常,便将其加入黑名单。在读写IO路径上,采用主动规避机制来避开这些异常的节点和硬盘,从而确保延迟和响应的稳定性。当然,系统检测异常的时间决定了在遇到顺序阶段和排除异常后,对业务延迟影响的时间。盘古通过实时的IO统计信息结合硬件异常事件等,可以在1秒钟之内检测到异常。这样,在数据节点或硬盘出现异常后,对业务的影响时间可以控制在一秒钟以内。而且,在检测到数据节点和硬盘故障后,盘古还采用了一系列主动异常规避机制,如备份读、写亦不写、缺串和重试等,可以将这段时间内对业务的影响控制在毫秒级。

其次,原数据服务也会受到服务器和网络故障的影响。在分布式系统中,这些原数据故障对系统可用性的影响往往更大。因此,盘古也采取了一系列措施来降低原数据服务对系统可用性的影响。盘古构建了分布式元数据管理系统,在整个集群中采用多种元数据来管理。这样,在单组元数据出现故障后,可以降低故障的影响范围。

再者,每组原数据服务都是高可用的,能够容忍一定数量的节点故障。在组件故障后,能够快速进行组织切换,保证系统的高可用性。此外,在数据路径上,盘古还能主动判定原数据服务的健康状态。即使高可用服务出现异常,也可以在数据路径上主动对其进行降级处理,确保读写打开的文件读写流程不会中断。

还有一种影响服务可用性的场景是业务进程故障。由于节点或硬盘故障可能导致业务进程崩溃。针对这种场景,盘古提供了原数据和数据的分析机制,支持业务进程进行更快的HA切换。基于盘古的分析机制,业务进程的HA切换可以在1秒钟以内完成。这意味着业务进程在故障后,可以在1秒钟内切换到备用服务,极大地提升了业务系统的可用性。

最后,机房可能出现的断网、断电、升温等故障也是不容忽视的。这类问题已经多次发生。这就要求业务具备多AZ的容灾能力。为了满足业务的这一需求,盘古支持同城多AZ部署,主要采用3AZ方案,同时也支持2AZ或更多AZ的部署。以3AZ部署为例,盘古的数据和原数据在3AZ内均匀分布,并同步写入。在任何一个AZ出现故障后,系统能在一分钟内检测到故障,并采用2AZ方案来降级服务。在采用2AZ降级服务后,数据在两个AZ中仍有足够的冗余,不会存在数据丢失的风险。此外,在故障的AZ恢复后,数据也能自动恢复到3AZ的分布状态。

基于盘古提供的数据持久化能力以及同城多AZ容灾能力,业务可以更容易地实现业务侧的多AZ容灾。例如,对象存储、块存储以及表格存储等都基于盘古实现了多AZ容灾。阿里云曾多次遭遇机房级故障。在这种情况下,单AZ部署的业务出现了服务中断,并面临了较大的数据风险。但多AZ部署的业务都能够快速地进行自动降级和恢复服务,且没有数据损失。

以上是在系统架构和设计的层面,盘古在保障数据不丢不错、系统高可用方面的实践经验分享。

接下来,我将介绍盘古在安全生产方面的实践经验。在全面、大规模部署复杂运行环境及业务场景时,我们依然会面临多种风险。例如,线上配置错误可能导致系统处于风险状态,若未能及时发现,将引发更大隐患。此外,软件中的低概率Bug、硬件在特定模式下的访问失效、资源配置不足以及业务高峰期的稳定性风险等问题,都可能导致系统出错,正如那句老话所说:“凡是可能出错的事情,那必定会出错。”这些在盘古的大规模应用过程中,都得到了多次验证。

第一个经验是故障演练。故障演练旨在两个方面进行提升:一是检验系统能力,即在极小概率的大规模故障发生时,系统的行为是否符合预期,告警是否及时准确,以及故障应急处理的预案和工具是否完备;二是锻炼故障处理机制,即在大规模故障处理过程中,不同角色人员的配合是否高效,应急决策是否合理,以及整个应急处理的操作是否熟练且合理。

故障演练的场景可以分为三类:第一类是What-if演练,即模拟各代组件发生大规模异常时的影响,并评估这些影响是否符合预期,以及是否存在改进空间;第二类是数据正确性及恢复能力演练,即模拟系统注入导致数据丢失、错误或不一致的故障,检验系统是否具备数据不丢、不错的能力,或在故障超出系统容忍范围后,是否有足够的工具恢复数据;第三类是对机房进行断电、断网等AZ级故障演练,以检验盘古是否具备AZ级容灾能力。

在故障演练的形式上,我们主要采用红蓝双方突袭演练的方式。红方负责注入故障,并观察和记录系统行为及故障处理过程的合理性;蓝方则在收到故障报警后,紧急启动故障处理流程,以快速恢复服务。演练结束后,红蓝双方会共同对系统行为及故障处理过程进行时间线分析和复盘,以找出不足并提出改进措施。对于已多次演练且较为成熟的场景,我们会将其加入自动演练平台,实现常态化演练。

通过这些故障演练,我们不断推动系统优化,完善故障处理机制和预案,并锻炼应急处理能力,以确保在真正发生重大故障时,能够尽量降低影响时间,缩短恢复时间。

第二个经验是实施自动化的发布编排,并严格执行发布的灰度策略。发布是线上生产稳定性风险的重要来源之一。为了降低发布风险,我们构建了自动化的发布系统,并严格执行灰度发布策略。发布过程被分为多个批次,从低影响区域到高影响区域,从少量集群到大量集群逐步推进。同时,发布过程也在多个核心区域进行错开,以避免对业务造成同时的多个影响。

在发布过程中,系统会自动进行巡检,一旦发现异常就会暂停发布。对于高风险问题,系统会自动进行回滚。对于已发布的问题及高风险问题,系统会进行标记并阻塞后续发布,直到问题解决。根据最近几个月的统计数据,盘古在全网、全业务的每月发布次数超过了2500次。通过这种高频发布及自动化能力,我们能够快速上线功能并解决线上风险问题,且对业务完全无影响。

保障安全生产的第三个经验是进行集群健康度检查和自动化治理。这是盘古应对系统运行潜在风险的重要机制。集群健康度检查类似于人的体检,通过高频检查能够确保系统处于健康运行状态。集群健康度检查的指标包括系统参数、硬件故障、软件配置一致性、系统运行状态等。通过集群架构检查,我们可以统一线上风险的管理和治理,规范线上运行环境。

对于检查中发现的问题,我们会开出工单并跟进修复。对于常见问题,我们会实现自动化修复过程,以降低运维负担。目前,在整个系统中累积的系统监控项有八千多项,提炼出的自动化巡检指标有一千多项。根据最近几个月的统计数据,每天能够发现并自动化修复两千多项线上问题。通过这种方式,极大地增强了系统在线上运行的稳定性。

 

三、总结

最后,提出两个观点。首先,稳定性是一项系统工程。盘古通过面向容错的系统设计以及多重的事务处理机制,确保数据的完整性和准确性,即保证数据不丢、不错。此外,盘古还具备多重故障恢复优化技术和分布式元数据容灾能力,这些措施共同保障了系统的高可用性。更为先进的是,盘古能够在服务不中断的同时,有效屏蔽异常对系统性能的影响。为了保障现场的安全生产,盘古还采用了故障演练、自动化发布、自动化的健康检查以及高效的运维手段等多种措施。

其次,稳定性不是一蹴而就的,它需要持续不断的迭代演进。作为阿里云的统一数据存储底座,盘古已经经历了阿里集团和阿里云等核心产品十年以上大规模的线上锤炼。

 

 

 

 

相关文章
|
1月前
|
数据采集 人工智能 分布式计算
MaxFrame:链接大数据与AI的高效分布式计算框架深度评测与实践!
阿里云推出的MaxFrame是链接大数据与AI的分布式Python计算框架,提供类似Pandas的操作接口和分布式处理能力。本文从部署、功能验证到实际场景全面评测MaxFrame,涵盖分布式Pandas操作、大语言模型数据预处理及企业级应用。结果显示,MaxFrame在处理大规模数据时性能显著提升,代码兼容性强,适合从数据清洗到训练数据生成的全链路场景...
83 5
MaxFrame:链接大数据与AI的高效分布式计算框架深度评测与实践!
|
24天前
|
存储 分布式计算 Hadoop
基于Java的Hadoop文件处理系统:高效分布式数据解析与存储
本文介绍了如何借鉴Hadoop的设计思想,使用Java实现其核心功能MapReduce,解决海量数据处理问题。通过类比图书馆管理系统,详细解释了Hadoop的两大组件:HDFS(分布式文件系统)和MapReduce(分布式计算模型)。具体实现了单词统计任务,并扩展支持CSV和JSON格式的数据解析。为了提升性能,引入了Combiner减少中间数据传输,以及自定义Partitioner解决数据倾斜问题。最后总结了Hadoop在大数据处理中的重要性,鼓励Java开发者学习Hadoop以拓展技术边界。
39 7
|
2月前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
阿里云容器服务ACK提供强大的产品能力,支持弹性、调度、可观测、成本治理和安全合规。针对拥有IDC或三方资源的企业,ACK One分布式云容器平台能够有效解决资源管理、多云多集群管理及边缘计算等挑战,实现云上云下统一管理,提升业务效率与稳定性。
|
2月前
|
机器学习/深度学习 存储 运维
分布式机器学习系统:设计原理、优化策略与实践经验
本文详细探讨了分布式机器学习系统的发展现状与挑战,重点分析了数据并行、模型并行等核心训练范式,以及参数服务器、优化器等关键组件的设计与实现。文章还深入讨论了混合精度训练、梯度累积、ZeRO优化器等高级特性,旨在提供一套全面的技术解决方案,以应对超大规模模型训练中的计算、存储及通信挑战。
104 4
|
3月前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
99 8
|
3月前
|
机器学习/深度学习 人工智能 分布式计算
【AI系统】分布式通信与 NVLink
进入大模型时代后,AI的核心转向大模型发展,训练这类模型需克服大量GPU资源及长时间的需求。面对单个GPU内存限制,跨多个GPU的分布式训练成为必要,这涉及到分布式通信和NVLink技术的应用。分布式通信允许多个节点协作完成任务,而NVLink则是一种高速、低延迟的通信技术,用于连接GPU或GPU与其它设备,以实现高性能计算。随着大模型的参数、数据规模扩大及算力需求增长,分布式并行策略,如数据并行和模型并行,变得至关重要。这些策略通过将模型或数据分割在多个GPU上处理,提高了训练效率。此外,NVLink和NVSwitch技术的持续演进,为GPU间的高效通信提供了更强的支持,推动了大模型训练的快
70 0
|
4月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
|
6月前
|
NoSQL Redis
基于Redis的高可用分布式锁——RedLock
这篇文章介绍了基于Redis的高可用分布式锁RedLock的概念、工作流程、获取和释放锁的方法,以及RedLock相比单机锁在高可用性上的优势,同时指出了其在某些特殊场景下的不足,并提到了ZooKeeper作为另一种实现分布式锁的方案。
165 2
基于Redis的高可用分布式锁——RedLock
|
2月前
|
存储 NoSQL Java
使用lock4j-redis-template-spring-boot-starter实现redis分布式锁
通过使用 `lock4j-redis-template-spring-boot-starter`,我们可以轻松实现 Redis 分布式锁,从而解决分布式系统中多个实例并发访问共享资源的问题。合理配置和使用分布式锁,可以有效提高系统的稳定性和数据的一致性。希望本文对你在实际项目中使用 Redis 分布式锁有所帮助。
192 5
|
3月前
|
NoSQL Redis
Redis分布式锁如何实现 ?
Redis分布式锁通过SETNX指令实现,确保仅在键不存在时设置值。此机制用于控制多个线程对共享资源的访问,避免并发冲突。然而,实际应用中需解决死锁、锁超时、归一化、可重入及阻塞等问题,以确保系统的稳定性和可靠性。解决方案包括设置锁超时、引入Watch Dog机制、使用ThreadLocal绑定加解锁操作、实现计数器支持可重入锁以及采用自旋锁思想处理阻塞请求。
77 16