数据密集型系统的云原生架构与稳定性保障

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
日志服务 SLS,月写入数据量 50GB 1个月
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 本文是参加QCon全球软件开发大会(2023·北京站)专题分享后的一些总结。参加此次大会的最大感受是疫情后的快速恢复,到现场的听众座无虚席,一些场次甚至出现无座。同时也学习了其他多个专题分享,总体感觉是整个大会专业度很高,无论是从专题分享的内容、还是Q&A环节的听众互动。

引文

本文是参加QCon全球软件开发大会(2023·北京站)专题分享后的一些总结。参加此次大会的最大感受是疫情后的快速恢复,到现场的听众座无虚席,一些场次甚至出现无座。同时也学习了其他多个专题分享,总体感觉是整个大会专业度很高,无论是从专题分享的内容、还是Q&A环节的听众互动。此次大会的所有专题简介可参考QCon专题列表

先做下自我介绍,本人就职于阿里云SLS团队,负责SLS数据加工服务研发工作,服务阿里云上客户的海量日志处理。对机器数据处理场景痛点、核心技术和架构有深刻理解。当前主要关注实时计算、云原生等技术,欢迎交流。顺便附上几张参会的现场照片如上。

专题简介


在此专题分享中,我们讨论的主题是数据密集型系统的云原生架构与稳定性保障,将针对大规模数据实时加工场景深入探讨。从实际案例出发,针对此类规模场景下系统稳定性建设中遇到的典型问题,比如作业资源上限不可控性、算力扩缩容触发机制灵活性、系统变更潜在风险、上百集群统一监控等,探讨这些问题的根源,以及落地的处理实践。


以下是演讲的提纲:

  1. 第一部分,我们将讨论数据密集型服务进行一个概览
  2. 第二部分,基于SLS的数据密集型服务解决什么问题,以及怎么实现的
  3. 第三部分,实现以上数据服务我们遇到的问题、和痛点
  4. 第四部分,我们如何解决掉以上问题的
  5. 最后,讨论未来的技术发展思路

数据密集型服务架构


数据密集型系统其实包含了计算资源(CPU、内存),IO(磁盘、网络),数据规模等因素的完整架构。关于数据密集型系统的设计感兴趣可以参考Martin Kleppmann的书籍《Designing Data-Intensive Applications》。Lamdba架构与Kappa架构可参考博文《Questioning the Lambda Architecture》



上图是从数据处理链路的角度对SLS的描述,其中包含两个方面。一方面SLS本身是一个开放的日志数据平台。用户可以通过开放API,把其存储在SLS的数据与已有的大数据平台连接起来,这一点与阿里云上很多大数据产品也有紧密合作。另外今年iLogtail开源(iLigtail开源库)、阿里云Terrform集成、阿里云统一CLI等等都在推动SLS越来越开放化。

另一方面SLS为客户提供一站式数据处理链路服务,支持客户快速完成非结构化数据实时加工处理。如上图所示,整个数据处理链路包含四个功能点:

  1. 数据导入:打通阿里云上客户自建服务、外部开放服务与SLS的无缝对接
  2. 实时加工:对数据进行实时行处理、以及链路编排
  3. 聚集加工:对数据进行定时分析、聚合加工
  4. 数据导出:围绕“数据入湖”等场景给出相应的技术实现与解决方案

本文重点将放在实时加工场景上。

云原生下数据密集型服务的架构适配

云原生下数据密集型服务整体框架


对于云上数据实时加工服务而言,其面临的是超大数据规模(每秒数百万级的tps),以及苛刻的可用性和稳定性要求。一个严峻的挑战是作业处理的数据规模与用户的业务场景强关联,往往会出现流量洪峰,且不可预测。比如对于游戏服务,开服、活动等时间点会数据量出现瞬时数百倍的突增,对于数据处理系统产生极大压力。



基于上述的调度设计目标,我们设计了可观测性任务调度框架,如上图所示,下面从下到上来介绍。

  • 存储层:主要包括任务的元数据存储和任务运行时的状态和快照存储。任务的元数据主要包括任务类型,任务配置、任务调度信息,都存储在了关系型数据库;任务的运行状态、快照存储在了分布式文件系统中。
  • 服务层:提供了任务调度的核心功能,主要包括任务调度和任务执行两部分,分别对应前面讲的任务编排和任务执行模块。任务调度主要针对三种任务类型进行调度,包括常驻任务、定时任务、按需任务。任务执行支持多种执行引擎,包括presto、restful接口、K8s引擎和内部自研的ETL2.0系统。
  • 业务层:业务层包括用户直接在控制台可以使用到的功能,包括告警监控、数据加工、重建索引、仪表盘订阅、聚集加工、各类数据源导入、智能巡检任务、和日志投递等。
  • 接入层:接入层使用Nginx和CGI对外提供服务,具有高可用,地域化部署等特性。
  • API/SDK/Terraform/控制台:在用户侧,可以使用控制台对各类任务进行管理,对于不同的任务提供了定制化的界面和监控,同时也可以使用API、SDK、Terraform对任务进行增删改查。
  • 任务可视化:在控制台我们提供了任务执行的可视化和任务监控的可视化,通过控制台用户可以看出看到任务的执行状态、执行历史等,还可以开启内置告警对任务进行监控。

实时加工应用场景


这里我们总结下实时加工的常见场景(具体场景很多,这里仅列出典型、常见的场景):

  1. 规整:这是使用频率最高的场景,比如从文本日志数据中提取出关键信息,将其转为规范化的数据
  2. 富化:比如用户的点击数据中只包含商品ID,在分析时需要从数据库关联起详细信息
  3. 脱敏:随着我国信息安全相关法律的完善,对于敏感数据(比如个人信息)的处理要求越来越高
  4. 分裂:在数据写出时,出于性能、便捷性考虑会将多条数据合并输出,在分析前则需要拆分出独立数据条目
  5. 分发:将不同类型的数据分别写到不同的特定目标中,以供下游定制化使用

上图中右侧是实时加工在无规则数据字段规整的使用场景,这里的例子是 Nginx 访问日志的解析。通过4行代码表达式就可以完成了无规则文本解析、KV数据提取、字段精简、数据流编排一系列操作,而且无需手动写复杂的正则表达式,直接使用内置 GROK 模式即可。



上图是实时加工在信息富化的使用场景,这里的例子接着上一场景,在http请求中,我们需要将请求状态码(http_status字段)的详细描述(http_code_desc字段)添加到原始数据中。

实时加工实现架构、及其在云原生下的适配


上图描述的是实时加工服务整体架构。左侧源logstore基于分片(shard)存储,分片方便存储实现备份与扩展,数据加工服务的伸缩也是依赖存储的分片机制。当数据加工调度器启动一个新的作业时,会自动创建并绑定到源logstore的一个消费组,消费组内部的多个消费者独立负责处理不同分片中的数据。随着数据量增多,存储需要产生更多的分片,同时数据加工作业便可以扩展更多的消费者独立工作。
当作业需要关联外部资源的时候,每一个消费者独立维护一份资源的拷贝,实现高性能关联计算。



上文讨论的实时加工的一般架构在云原生下的架构适配如上图所示,以POD作为处理单元,充分利用k8s的资源与伸缩机制。调度器的调度过程则转换通过k8s的API server为作业分配与管理其所需的资源。

该架构下稳定性常见挑战

用户场景、以及数据流量带来的系统挑战


上图所描述的是用户使用场景所带来的系统挑战,包括用户代码复杂度、作业资源开销等。右侧所展示的是在常驻作业的场景中,业务在低峰/高峰时期的CPU使用情况。可以看出,在低峰时期所有节点的CPU使用差距并不大;但是到达高峰期时,就出现了明显的热点,此热点问题在不重新调度部分作业的前提下是无法做到再平衡的。

基于K8s的系统挑战

HPA伸缩灵活性


原生的K8S HPA内置支持CPU和内存两个指标,这对于绝大多数数据密集型作业来说已经足够了。但是在数据实时加工中,用户需要对数据流进行编排,完成跨地域数据流转,面对这类网络/IO敏感场景,内置的HPA指标就无法满足。另外,基于HPA的资源伸缩动作存在滞后。

系统变更的稳定性风险


集群运维中存在业务之间资源争抢、业务规模导致超大集群(社区版k8s限制是每个节点不超过110 POD、单集群不超过5000节点)、变更发布灰度范围难以精确控制等稳定性风险等待挑战。
另外,随着k8s的版本快速发布,集群升级也存在潜在风险。由于集群中运行大量线上作业,集群升级过程对于作业有潜在影响,所以集群升级需要一个确保线上作业稳定性的方案。这一点也导致了集群的升级无法频繁操作。

近百个集群带来的运维挑战


作为云上数据处理服务,全球多地域、单地域内多可用区部署是必备基础,以满足不同的用户需求。另外同一可用区内也需要多集群以保证高可用,这两个原因导致线上运行非常多的k8s集群。为了保障服务的稳定性,其网络必须完全隔离,这导致运维成本随着集群数目呈几何级增长。

对应问题处理方案与实践

执行引擎方案:作业运行核心优化


执行引擎是实时加工作业运行的计算核心,我们从不同角度进行了优化提升。比如针对计算密集型场景,我们对用户的逻辑在ast层进行优化、考虑到日志数据的重复性特征增加数据缓存等。针对IO/网络密集型场景,则是对数据协议做了优化。另外我们也对计算单元进行资源使用做了反压等能力。

系统架构方案

作业计算扩缩容触发机制扩展


针对k8s的HPA灵活性限制,我们需要引入更灵活的HPA指标(由计算单元自动上报),以支撑多种多样业务场景下的作业需求。技术上使用的是external metric service能力,自定义指标则是存储在SLS MetricStore中。
另外,我们还使用智能算法对HPA指标进行续升级优化,比如基于作业的历史运行特性,提前做资源分配,更进一步提升作业运行的稳定性。

跨集群作业调度系统


针对集群升级、变更存在的稳定性风险,我们的方案是在调度层实现多集群负载均衡的能力,需要升级集群时,将新建作业创建至新集群,逐步地将旧版本集群汰换掉。除此之外,该方案也解决了同集群内不同服务的资源争抢、单一集群变更灰度、超大集群限制等挑战。
此方案也应如一个痛点,新旧版本集群会同时存在很长一段时间,这使得运维工作进一步增加,这也驱动我们进一步完善运维自动化,并且对于大量的集群统一监控的紧迫性,接下来我们就讨论这一点。

K8s可观测方案:SLS全栈监控

  • 实时监控各类系统,包括主机监控、Kubernetes监控、数据库监控、中间件监控等。
  • 支持ECS、K8s一键安装,支持图形化的监控配置管理,无需登录主机配置采集监控项。
  • 运维老司机多年经验的报表总结,包括资源总览、水位监控、热点分析、详细指标等数十个报表。
  • 支持自定义的分析,支持包括PromQL、SQL92等多种分析语法。
  • 支持对接AIOps指标巡检,利用机器学习技术自动发现异常指标。
  • 支持自定义告警配置,告警通知直接对接消息中心、短信、邮件、语音(电话)、钉钉,并支持对接自定义WebHook。



如上图所示,实时加工系统的监控架构分为三部分:

  • 左侧部分是监控数据的生成与采集。在k8s侧的组件包括开源的事件监测node-problem-detector、采集agent iLogtail、SLS监控sls-monitoring。采集的指标包括k8s event、节点配置数据、节点资源使用指标、k8s资源监控指标,以及服务的运行日志和加工作业的运行日志。
  • 中间部分是针对Log、Metric、Trace数据的统一存储、消费、分析引擎。
  • 右侧部分是监控数据的应用。底层是用于系统研发运维人员对系统运行、资源使用等的监控;上层则用于实时加工用户对其创建的作业的可视化观测与监控。



接下来我们看下全栈监控的效果。左侧显示的是主机资源使用大盘、与k8s核心组件状态。右侧显示的是基于DevOps经验内置的监控告警规则列表。

未来展望

  • 伸缩指标算进一步深入:应对超大级别的数据突增,伸缩更灵敏。
  • 多集群调度系统增强:并发单元级别负载均衡,加快旧集群汰换效率。
  • 数据处理引擎核心效率提升:将部分计算逻辑下推至存储层执行,极致提升数据处理链路的效率。

结语

以上专题分享中,我们讨论的主题是大规模数据处理服务(实时加工场景)的云原生架构稳定性建设。从实际案例出发,针对此类规模场景下系统稳定性建设中遇到的典型问题,比如作业资源上限不可控性、算力扩缩容触发机制灵活性、系统变更风险、大量集群统一监控等,探讨这些问题的根源,以及落地的处理实践。



上图是SLS团队的技术博客,我们会不定期推出技术文章分享和产品更新介绍,欢迎大家订阅,有任何问题也欢迎与我们反馈。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
6天前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
在9月20日2024云栖大会上,阿里云智能集团副总裁,数据库产品事业部负责人,ACM、CCF、IEEE会士(Fellow)李飞飞发表《从数据到智能:Data+AI驱动的云原生数据库》主题演讲。他表示,数据是生成式AI的核心资产,大模型时代的数据管理系统需具备多模处理和实时分析能力。阿里云瑶池将数据+AI全面融合,构建一站式多模数据管理平台,以数据驱动决策与创新,为用户提供像“搭积木”一样易用、好用、高可用的使用体验。
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
|
6天前
|
弹性计算 Kubernetes Cloud Native
云原生架构下的微服务设计原则与实践####
本文深入探讨了在云原生环境中,微服务架构的设计原则、关键技术及实践案例。通过剖析传统单体架构面临的挑战,引出微服务作为解决方案的优势,并详细阐述了微服务设计的几大核心原则:单一职责、独立部署、弹性伸缩和服务自治。文章还介绍了容器化技术、Kubernetes等云原生工具如何助力微服务的高效实施,并通过一个实际项目案例,展示了从服务拆分到持续集成/持续部署(CI/CD)流程的完整实现路径,为读者提供了宝贵的实践经验和启发。 ####
|
12天前
|
监控 Cloud Native Java
云原生架构下微服务治理策略与实践####
【10月更文挑战第20天】 本文深入探讨了云原生环境下微服务架构的治理策略,通过分析当前技术趋势与挑战,提出了一系列高效、可扩展的微服务治理最佳实践方案。不同于传统摘要概述内容要点,本部分直接聚焦于治理核心——如何在动态多变的分布式系统中实现服务的自动发现、配置管理、流量控制及故障恢复,旨在为开发者提供一套系统性的方法论,助力企业在云端构建更加健壮、灵活的应用程序。 ####
58 10
|
7天前
|
Kubernetes Cloud Native API
云原生架构下微服务治理的深度探索与实践####
本文旨在深入剖析云原生环境下微服务治理的核心要素与最佳实践,通过实际案例分析,揭示高效、稳定的微服务架构设计原则及实施策略。在快速迭代的云计算领域,微服务架构以其高度解耦、灵活扩展的特性成为众多企业的首选。然而,伴随而来的服务间通信、故障隔离、配置管理等挑战亦不容忽视。本研究聚焦于云原生技术栈如何赋能微服务治理,涵盖容器编排(如Kubernetes)、服务网格(如Istio/Envoy)、API网关、分布式追踪系统等关键技术组件的应用与优化,为读者提供一套系统性的解决方案框架,助力企业在云端构建更加健壮、可维护的服务生态。 ####
|
7天前
|
监控 安全 Cloud Native
云原生安全:Istio在微服务架构中的安全策略与实践
【10月更文挑战第26天】随着云计算的发展,云原生架构成为企业数字化转型的关键。微服务作为其核心组件,虽具备灵活性和可扩展性,但也带来安全挑战。Istio作为开源服务网格,通过双向TLS加密、细粒度访问控制和强大的审计监控功能,有效保障微服务间的通信安全,成为云原生安全的重要工具。
25 2
|
7天前
|
弹性计算 监控 Cloud Native
云原生架构下的性能优化实践与策略####
在数字化转型加速的今天,云原生技术以其弹性、敏捷和高效的特点成为企业IT架构转型的首选。本文深入探讨了云原生架构的核心理念,通过具体案例分析,揭示了性能优化的关键路径与策略,为开发者和企业提供了可操作的实践指南。 ####
|
12天前
|
运维 Cloud Native 持续交付
云原生架构下的微服务设计原则与实践####
【10月更文挑战第20天】 本文深入探讨了云原生环境中微服务设计的几大核心原则,包括服务的细粒度划分、无状态性、独立部署、自动化管理及容错机制。通过分析这些原则背后的技术逻辑与业务价值,结合具体案例,展示了如何在现代云平台上实现高效、灵活且可扩展的微服务架构,以应对快速变化的市场需求和技术挑战。 ####
41 7
|
11天前
|
监控 Cloud Native 测试技术
云原生架构下的性能优化与实践####
【10月更文挑战第21天】 本文深入探讨了在云原生环境下,如何通过一系列技术手段和最佳实践来提升应用性能。文章首先概述了云原生架构的基本原则与优势,随后详细分析了影响性能的关键因素,包括容器编排、微服务设计、持续集成/持续部署(CI/CD)流程以及监控与日志管理。针对这些因素,文中不仅介绍了具体的优化策略,如资源请求与限制的合理配置、服务间通信的高效实现、自动化测试与部署的优化,还结合案例分析,展示了如何在实际项目中有效实施这些策略以显著提升系统响应速度和处理能力。此外,文章还强调了性能测试的重要性,并提供了几种常用的性能测试工具和方法。最后,总结了云原生性能优化的未来趋势,为开发者和架构师
11 2
|
12天前
|
Kubernetes Cloud Native 持续交付
云原生架构下的微服务设计原则与最佳实践##
在数字化转型的浪潮中,云原生技术以其高效、灵活和可扩展的特性成为企业IT架构转型的首选。本文深入探讨了云原生架构的核心理念,聚焦于微服务设计的关键原则与实施策略,旨在为开发者提供一套系统性的方法论,以应对复杂多变的业务需求和技术挑战。通过分析真实案例,揭示了如何有效利用容器化、持续集成/持续部署(CI/CD)、服务网格等关键技术,构建高性能、易维护的云原生应用。文章还强调了文化与组织变革在云原生转型过程中的重要性,为企业顺利过渡到云原生时代提供了宝贵的见解。 ##
|
11天前
|
运维 Cloud Native API
云原生时代下的微服务架构实践
【10月更文挑战第22天】在数字化转型的浪潮中,云原生技术正以前所未有的速度重塑软件开发和运维的模式。微服务架构作为云原生的重要组成部分,其设计哲学、技术栈选择以及与传统单体应用的根本区别成为了现代软件工程讨论的焦点。本文将深入探讨微服务架构的核心概念,通过实际案例分析其在云平台下的应用,并分享在实施过程中的经验教训,旨在为读者提供一套清晰的微服务架构实践指南。