MNS 1.0 精准量化运行状况的困难在于,一方面 MNS 的发布 / 订阅机制重度依赖 ZK,受限于 ZK 的自身实现和链路上众多不同组件的异构性,及时获取完整链路的推送行为数据很困难 。另一方面,由于节点数众多,全量采集服务发现数据,对公司的监控上报系统以及采集之后的计算也是很大的负担 。
在 MNS 2.0 中,我们首先在架构上显著弱化了 ZK 的地位,它基本上只作为一致性通知组件 。我们自研的 MNS-Control 可以充分 diy 埋点场景,保证了主要推送行为抓取的可控性 。其次,我们采用了分级采样计算,在全面梳理了公司现有的服务节点数比例后,将典型的服务列表数划分为几个档次,比如 1000 个节点的服务为一档,100 个又为一档,并创建相应的非业务哨兵服务,然后在不同机房选取适量的采样机器定期注册 + 拉取来评估整体的运行情况 。这样既做到了上报量的精简,又兼顾了上报数据的有效性 。详细操作流程,如下图所示:

文章插图
图 17 MNS 2.0 SLA 采集
- 控制层周期性修改采样服务中的服务数据,触发服务发现的数据推送流程 。
- 参与指标统计的机器节点,本地代理进程获取到注册信息推送后,上报送达时间到运维平台并由其写入存储层 。
- 控制层对数据库中的数据进行聚合计算,最后上报监控系统展示指标数据 。此外,通过与监控团队合作,解决全量部署的 Agent 埋点监控问题 。
- 单进程多端口改造 :业务使用这种方式去区分不同的调用端口,从而造成端口资源的浪费,而且调用下游还要感知部署信息,这种机器属性粒度细节的暴露在云原生时代是不太恰当的 。我们协助业务将调用行为改成单端口多接口的形式,在协议内部去区分调用逻辑 。
- 大服务列表的拆分 :随着业务的发展,单个服务的节点数呈爆发式增长,甚至出现了一个服务有接近 7W 的节点数的情况,对发布、监控、服务治理等底层设施产生很大的压力 。我们通过和业务的沟通,发现大列表产生的原因主要有两点:1. 单机性能不够,只能以实例抗;2. 服务内容不够聚焦 。换句话说,因为服务还不够“微”,所以导致逻辑越来越庞大,有需求的调用方和自身实例相应增加,代码风险也在增大 。因此,我们和业务一起梳理分析架构和调用,将核心共用模块与业务逻辑群分拆出来,减少冗余调用,最终使一些大服务节点数量从数万降低到数千,实现了数量级的下降 。
- 上下游均衡部署 :这个比较容易理解,结合调用端与服务端比例、服务方机器性能以及调用失败率等信息,可以作为服务业务在各机房间均衡调整机器数量的参考 。另一方面,我们也在减少基于就近调用策略的粒度,目前只保留了“同 IDC”和“同城”两种,去掉了之前的“同中心策略”,减轻业务服务部署的心智负担 。后期,随着机房数量的降低和同地域机房间延时的可控,同城路由可能是最终的方案 。

文章插图
图 18 MNS 2.0 数据赋能
五、未来展望未来,美团命名服务主要会朝两个方向发展:
- 进一步收集、挖掘服务数据的价值,打造服务数据平台,赋能业务升级 。从单纯实现业务注册发现路由等需求,到通过数据反向推动业务架构流程改造升级,这也是美团核心价值观“以客户为中心”的一种体现 。
- 深度结合 Service Mesh 等云原生基础设施的演进 。云原生理念及相关设施架构的快速发展,必然会造成传统服务治理组件架构上流程的变动,深度拥抱云原生,并享受基础功能下沉带来的“红利”,是命名服务一个比较确定的方向 。
推荐阅读
- 一文带你彻底理解Linux的各种终端类型及概念
- 电力负荷怎么计算?几分钟带你了解清楚,好东西,赶紧收藏
- 最新百度信息流产品手册,带你全面了解百度产品
- 三分钟带你了解香槟产区另一面,谈香槟,你也是行家
- 没有人比我更懂电流,今天带你重新认识电流
- 一篇文章带你了解CSS基础知识和基本用法
- 一篇文章带你FFmpeg到流媒体服务器开发
- 带你去看民生银行大数据体系架构设计
- Redis如何清除过期key? 一篇文章带你走近源码!
- 哪些人能申领失业保险金?去哪里申请?带你了解
