找回密码
 会员注册
查看: 21|回复: 0

复杂环境下落地ServiceMesh的挑战与实践

[复制链接]

9

主题

0

回帖

28

积分

新手上路

积分
28
发表于 2024-10-7 12:08:23 | 显示全部楼层 |阅读模式
总第426篇2020年 第50篇在私有云集群环境下建设 Service Mesh ,往往需要对现有技术架构做较大范围的改造,同时会面临诸如兼容困难、规模化支撑技术挑战大、推广困境多等一系列复杂性问题。本文会系统性地讲解在美团在落地 Service Mesh 过程中,我们面临的一些挑战及实践经验,希望能对大家有所启发或者帮助。一、美团服务治理建设进展1.1 服务治理发展史首先讲一下 OCTO,此前美团技术团队博客也分享过很多相关的文章,它是美团标准化的服务治理基础设施,现应用于美团所有事业线。OCTO 的治理生态非常丰富,性能及易用性表现也很优异,可整体概括为 3 个特征:属于公司级的标准化基础设施。技术栈高度统一,覆盖了公司 90% 以上的应用,日均调用量达数万亿次。经历过较大规模的技术考验。覆盖数万个服务、数十万个节点。治理能力丰富。协同周边治理生态,实现了 SET 化、链路级复杂路由、全链路压测、鉴权加密、限流熔断等治理能力。回顾美团服务治理体系的发展史,历程整体上划分为四个阶段:第一阶段是基础治理能力统一。实现通信框架及注册中心的统一,由统一的治理平台支撑节点管理、流量管理、监控预警等运营能力。第二阶段重点提升性能及易用性。4 核 4GB 环境下使用 1KB 数据进行 echo 测试,QPS 从 2 万提升至接近 10 万,99 分位线 1ms;也建设了分布式链路追踪、分阶段耗时精细埋点等功能。第三阶段是全方位丰富治理能力。落地了全链路压测平台、性能诊断优化平台、稳定性保障平台、鉴权加密等一系列平台,也实现了链路级别的流量治理,如全链路灰度发布等。第四阶段是建设了跨地域的容灾及扩展能力。在每天数千万订单量级下实现了单元化,也实现了所有 PaaS 层组件及核心存储系统的打通。1.2 服务治理体系的困境目前,美团已具备了较完善的治理体系,但仍有较多的痛点及挑战。大的背景是公司业务蓬勃发展,业务愈发多元化,治理也愈发精细化,这带来了较多新的问题:业务与中间件强耦合,制约彼此迭代。当中间件引入 Bug,可能成百上千、甚至数千个业务需要做配合升级,中间件的新特性也依赖业务升级后才能使用,成本很高。中间件版本碎片化严重。发布出去的组件基本托管在业务侧,很难统一进行管控,这也频繁造成业务多类的问题。异构体系融合难。新融入公司的技术体系往往与美团不兼容,治理体系打通的成本很高,难度也很大。此前,美团与大众点评打通治理,不包含业务迁移,就历时 1 年半的时间;近期,摩拜使用的 gRPC 框架也无法与系统进行通信,但打通迫在眉睫。非 Java 语言治理体系能力弱,多个主流语言无官方 SDK。多元业务场景下,未来多语言也是个趋势,比如在机器学习领域,Python 语言不太可能被其他语言完全代替。二、服务治理体系优化的思路与挑战2.1 优化思路总结来看,OCTO 在服务层实现了统一抽象来支撑业务发展,但它并未解决这层架构可以独立演进的问题。1.2节中问题1与问题2的本质是“耦合”,问题3与问题4的本质是“缺乏标准服务治理运行时”。在理想的架构中,异构语言、异构治理体系可以共用统一的标准治理运行时,仅在业务使用的 SDK 部分有轻微差异。所以,我们整体的优化思路分为三步:隔离解耦,在隔离出的基础设施层建设标准化治理运行时,标准之上建体系。上述解决方案所对应的新架构模式下,各业务进程会附属一个 Proxy 进程,SDK 发出以及接收的流量均会被附属的 Proxy 拦截。像限流、路由等治理功能均由 Proxy 和中心化的控制大脑完成,并由控制面对接所有治理子系统集成。这种模式下 SDK 很轻薄,异构的语言、异构的治理体系就很容易互通,从而实现了物理解耦,业界将这种模式称为 Service Mesh(其中 Proxy 被称为数据面、中心化控制大脑被称为控制面)。2.2 复杂性挑战美团在实践中所面临的复杂性划主要包括以下4类:兼容性:技术改造涉及范围较大,一方面需要通过保证现有通信方式及平台使用方式不变,从而来保障业务研发效率,另一方面也要解决运行载体多样性、运维体系兼容等问题。异构性:第一是多语言互通问题;第二是打通治理体系内的众多治理子系统,像服务鉴权、注册中心等系统的存储及发布订阅机制都是不同的;第三是快速打通新融入公司的异构治理体系。大规模支撑:出于性能方面考虑,开源 Istio 等产品不宜直接应用于大规模的生产环境,美团控制面需具备百万级链接下高吞吐、低延迟、高精确的系统能力。重交易型业务容错性低:交易型业务场景下,业务对 Service Mesh 的性能、稳定性往往持怀疑态度;美团基础架构团队也强调在业务价值导向下,基于实际业务价值进行运营推广,而不是采用从上至下的偏政策性推广方式。三、美团落地 Service Mesh 的解决方案3.1 整体架构美团采用数据面基于 Envoy 二次开发、控制面自研为主、SDK 协同升级的方案(内部项目名是 OCTO Mesh )。架构简介如下:各语言轻薄的 SDK 与 Proxy 通过 UDS(Unix Domain Socket)交互,主要出发点是考虑到相比透明流量劫持,UDS 性能与可运维性更好。控制面与 Proxy 通过双向流通信,控制面与治理生态的多个子系统交互,并将计算处理过的治理数据及策略数据下发给 Proxy 执行,协同配合完成路由、限流等所有核心治理功能。控制面内部的 5 个模块都是自研的独立服务。Pilot 承载核心治理能力,与 Proxy 直接交互。Dispatcher 负责屏蔽异构子系统差异。集中式健康检查管理节点状态。Config Server 管理 Mesh 体系内相关的策略,并将 Pilot 有状态的部分尽量迁移出来。监控及巡检系统负责提升稳定性。自研了的 Meta Server 系统实现 Mesh 体系内部的节点注册和寻址,通过管理控制面与数据面的链接关系,也实现了按事业群隔离、水平扩展等能力。3.2 兼容性解决方案兼容性的目标及特征用一句话来总结就是:业务接入无感知。为此,我们做了以下三件事情:(1) 与现有基础设施及治理体系兼容将 Service Mesh 与 OCTO 深度打通,确保各治理子系统的使用方式都不变。运行载体方面,同时支持容器、虚拟机、物理机。打通运维体系,保证服务治理基础设施处于可管理、可监测的状态。(2) 协议兼容服务间调用往往是多对多的关系,一般调用端与服务端无法同时升级,为支持 Mesh 与非 Mesh 的互通,增强后的协议对业务完全透明。与语义相关的所有内容(比如异常等),均在 SDK 与 Proxy 之间达成共识,保证兼容。无法在控制面及数据面中实现的能力,在 SDK 中执行并通过上下文传递给 Proxy,保障功能完全对齐,当然这种情况应该尽量避免的。(3) Mesh 与非 Mesh 模式的无缝切换基于 UDS 通信必然需要业务升级一次 SDK 版本,我们在 2020 年初时预先发布早做部署,确保当前大部分业务已经升级到新版本,但默认仍是不开启 Mesh 的状态。在可视化平台上面通过开关操作,几乎无成本实现从 Mesh 模式与非 Mesh 模式的切换,并具备实时生效的能力。3.3 异构性解决方案异构性的目标及特征用一句话总结就是:标准化服务治理运行时。具体可拆分为3个子目标:标准化美团内部 6 种语言的治理体系。架构层面由控制面统一对接各个治理子系统,屏蔽注册中心、鉴权、限流等系统具体实现机制的异构性。支持摩拜及未来新融入公司的异构治理体系与公司整体的快速融合。针对上述3个子目标,我们所采取的方案如下:将数据面 + 控制面定义为标准化的服务治理运行时,在标准运行时内打通所有治理能力。建设统一接入中心系统 Dispatcher ,并由其对接并屏蔽治理子系统的异构性,从而实现外部系统的差异对 Pilot 透明;下图中 Dispatcher 与 Pilot 直接交互,Meta Server 的作用是避免广播降低冗余。重构或从零建设 SDK,目前使用的 6 种语言 SDK 均已落地并使用。异构语言、异构体系均使用增强的统一协议交互,实现互通。通过 Service Mesh 实现体系融合的前后对比如下:引入 Service Mesh 前,单车向公司的流量以及公司向单车的流量,均是由中间的 adaptor 单点服务承接。除稳定性有较大隐患外,所有交互逻辑均需要开发两份代码,效率较差。引入 Service Mesh后,在一套服务治理设施内打通并直接交互,消除了中心 adaptor 带来的稳定性及研发效率方面的缺陷;此外整个打通在1个月内完成,异构体系融合效率很高。通过上述方案,针对异构性方面取得了较好的效果:标准化 6 种语言治理体系,非 Java 语言的核心治理能力基本对齐 Java;新语言也很容易融入,提供的官方 Python 语言、Golang 语言的通信框架新版本(依托于 OCTO Mesh),开发成本均控制在1个月左右。支持异构治理子系统通过统一接入中心快速融入,架构简洁、扩展性强。支持异构治理体系快速融合并在单车侧落地,异构治理体系打通成本也从 1.5 年降低到 1 个月。3.4 规模化解决方案3.4.1 开源 Istio 问题分析规模化的目标及特征用一句话总结是:具备支撑数万服务、百万节点体量的系统能力,并支持水平扩展。挑战主要有3个:美团体量是最流行开源产品 Istio 上限的上千倍。极高的实时性、准确性要求;配置下发错误或丢失会直接引发流量异常。起步较早,业界参考信息很少。经过对 Istio 架构进行深入分析,我们发现核心问题聚焦在以下3个瓶颈点:每个控制面实例有 ETCD 存储系统的全部数据,无法水平扩展。每个 Proxy 链接相当于独立与 ETCD 交互,而同一个服务的 Proxy 请求内容都相同,独立交互有大量的 I/O 冗余。当 Proxy 批量发版或网络抖动时,瞬时风暴很容易压垮控制面及 ETCD。每个节点都会探活所有其他节点。10 万节点规模的集群,1 个检测周期有 100 亿次探活,会引发网络风暴。3.4.2 措施一:横向数据分片针对 Istio 控制面各实例承载全集群数据的问题,对应的措施是通过横向逻辑数据分片支持扩展性,具体方案设计如下:Proxy 启动时会去向 Meta Server 系统请求需要连接的 Pilot IP,Meta Server 将相同服务的 Proxy 尽量落到同一个控制面节点(内部策略更为复杂,还要考虑地域、负载等情况),这样每个 Pilot 实例按需加载而不必承载所有数据。控制面节点异常或发布更新时,其所管理的 Proxy 也会有规律的迁移,恢复后在一定时间后还会接管其负责的 Proxy,从而实现了会话粘滞,也就实现逻辑上面的数据分片。通过管理链接关系实现了按事业群隔离、按服务灰度等平台能力,最关键的还是解决了 Mesh 体系水平扩展的问题。3.4.3 措施二:纵向分层订阅针对 Istio 独立管理各 Proxy 链接的 I/O 冗余问题,对应的措施是通过分层订阅减少冗余 I/O。Proxy 不直接与存储等系统对接,而是在中间经过一系列的处理,关键点有两个:关键点 1:基于快照缓存 + 索引的机制来减少 ZK watcher 同步。以注册中心为例,常规实现方式下,如果每个 Proxy 关注 100 个节点,1 万个节点就会注册 100 万个 watcher,相同服务的 Proxy 所关注内容是相同的,另外不同服务 Proxy 所关注的也有很多交集,其中包含大量的冗余。分层订阅模式下,Proxy 不与注册中心直接交互,通过中间的快照缓存与分层,确保每个 Pilot 实例中 ZK 相同路径的监听最多只用1个 watcher,获取到 watcher 通知后,Pilot 根据内部的快照缓存 + 索引向所有关注者分发,大大降低了冗余。关键点 2:治理能力层及会话管理层实现了类似于 I/O 多路复用能力,通过并发提升吞吐。结果方面有效应对了网络抖动或批量发版的瞬间风暴压力,压测单 Pilot 实例可以承载 6 万以上的链接,时延 TP99 线
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-11 02:50 , Processed in 0.467029 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表