客户案例 > 案例详情

低成本、高稳定性-满帮集团使用 Eureka 和 ZooKeeper 的上云实践

通过充分理解云计算和深度用云,满帮技术团队得以从底层技术的持续性投入中解放出来,聚焦到提升系统的稳定性和工程效率上,让团队获得更高的投资回报率(ROI)。

客户介绍

满帮是中国领先的数字货运平台之一,由两家公路干线货运平台-运满满和货车帮于 2017 年合并而成,在贵阳、南京、北京、上海等地多中心运营。作为一家“互联网+物流”的科技企业,满帮连接货车司机及货主双端用户,将大数据、云计算、人工智能技术引入物流行业,不但解决了长久以来货运领域运力分散、供需不匹配、信息不透明等问题,还通过重构货运物流链条,实现了线上信息广泛互联、线下资源优化配置、线上线下协同联动,全面提升社会物流效率,成为促进公路物流提质增效、助力实体经济发展的新动力。

业务挑战

满帮集团在业务生产环境中自建微服务网关,负责南北方向流量调度、安全防护以及微服务治理,同时考虑到多活容灾还采用了诸如同机房优先调用、容灾跨机房调用等机制。

满帮的微服务网关作为微服务架构的前端组件,充当了所有微服务流量的入口。客户端的请求会到 ALB(负载均衡),再转发到内部的网关,然后通过网关路由到业务服务模块。因此,网关需要通过服务注册中心来动态发现生产环境中部署的所有微服务实例。当部分服务实例无法提供服务时,网关还能与服务注册中心协同工作,自动将请求转发到健康的服务实例上,实现故障转移。

此外,该微服务架构使用自研框架配合服务注册中心实现服务间调用,同时自建配置中心来实现配置管理和变更推送。满帮集团在其微服务架构的初期阶段,引入了 Eureka 和 ZooKeeper 这两款开源工具,来提供服务注册和配置管理中心的能力。在业务初期,这套架构也很好地支撑了满帮集团前期的业务快速增长。

但随着业务体量逐渐增大,业务模块越来越多,服务注册实例数呈爆发式增长,导致业务面临以下挑战:

  • 自建 Eureka 服务注册中心集群出现稳定性问题

    如果自建 Eureka 集群的服务注册实例到达 2000+ 规模,Eureka 集群节点之间在同步实例注册信息的时候,会出现部分节点负载过重的问题,甚至出现节点故障,导致无法正常提供服务。

  • ZooKeeper 集群出现稳定性问题

    ZooKeeper 集群频繁 GC,导致服务间调用和配置发布出现抖动,影响整体稳定性。

  • 配置数据存在安全风险

    ZooKeeper 默认不开启鉴权和身份认证,导致配置数据存在安全风险。

这些问题给业务的稳定和持久发展带来了很大的挑战。

阿里云的解决方案
业务架构平滑迁移

在上述业务背景下,满帮采用阿里云 MSE Nacos、MSE ZooKeeper 产品来替换现有的 Eureka 和 Zookeeper 集群。那么,MSE 是如何实现低成本且快速的架构升级,以及上云期间业务流量的无损平滑迁移的呢?

MSE Nacos 对开源 Eureka 原生协议完全兼容,内核仍然由 Nacos 驱动,业务适配层与 Eureka InstanceInfo 数据模型和 Nacos 的数据模型(Service和Instance)一一映射。而这一切对于满帮集团已经对接过自建 Eureka 集群的业务方而言,做到了完全透明。这就意味着,业务代码层面无需任何改动,只需要将 Eureka Client 连接的服务端实例 Endpoint 配置修改成 MSE Nacos 的 Endpoint 即可。使用上同样也很灵活,既可以继续使用原生的 Eureka 协议,把 MSE Nacos 实例当成一个 Eureka 集群来用,也可以 Nacos、Eureka 客户端双协议并存。不同协议的服务注册信息之间支持互相转换,从而保证业务微服务调用的连通性。

另外在上云过程中,满帮采用了 MSE-Sync 解决方案,一款基于开源 Nacos-Sync 优化后的迁移配套数据同步工具,支持双向同步、自动拉取服务和一键同步的功能。通过 MSE-Sync,满帮工程师轻松实现了原先自建 Eureka 集群上已有的线上服务注册存量数据一键迁移到新的 MSE Nacos 集群,同时实现了旧集群上新注册的增量数据也会自动同步到新集群,保证了在业务实际切流迁移之前,新旧集群服务注册实例信息始终是完全一致的。待数据同步 check 通过后,替换掉原有的 Eureka Client 的 Endpoint 配置,重新发布升级后就成功迁移至新的 MSE Nacos 集群了。

使用 MSE 突破原生 Eureka 集群的架构性能瓶颈

满帮集团在与阿里云 MSE 团队合作技术架构升级的时候,提出的核心诉求,就是要解决原先 Eureka 集群间服务注册信息同步压力大的问题。Eureka Server 是传统的对等星型同步 AP 模型,各个 Server 节点角色完全对等,对于每次变更(注册/反注册/心跳续约/服务状态变更等)都会生成相应的同步任务来同步所有实例的数据。这样一来,同步作业量随着集群规模、实例数正相关同步上涨。当集群服务注册规模达到 2000+ 的时候,部分节点 CPU 占用率、负载都很高,甚至还会因假死导致业务抖动,这一点在 Eureka 官方文档也有提及。开源 Eureka 的广播复制模型,不仅会导致它自身的架构脆弱,也影响了集群整体的横向扩展性。

MSE Nacos 在架构选型的时候就考虑到了这个问题,并给出了更好的解决方案,即自研的 AP 模型 Distro 协议。该协议在保留了星型同步模型的基础上,Nacos 对所有服务注册实例数据进行了 Hash 散列、逻辑数据分片,为每一条服务实例数据分配一个集群责任节点,每一个 Server 节点仅负责与自己相关的数据同步和续约逻辑。同时,集群间数据同步的粒度相对于 Eureka 也更小。这样带来的好处是即使在大规模部署、服务实例数据很多的情况下,集群间同步的任务量也能保证相对可控,并且集群规模越大,这样的模式带来的性能提升也愈发明显。

持续迭代优化追求极致性能

MSE Nacos 和 MSE ZooKeeper 在承接了满帮集团的全量微服务注册中心业务后,在升级版本中持续迭代优化,通过大量的性能压测对比测试,不断从各个细节上继续优化服务端性能,从而持续提升业务体验。下面是对升级版本优化过程的介绍:

服务注册高可用、容灾保护

原生 Nacos 提供了高阶功能--推空保护。服务消费者(Consumer)通过注册中心订阅服务提供者(Provider)的实例列表,当注册中心变更或遇到突发情况,或服务提供者与注册中心间的连接因网络、CPU 等其他因素发生抖动时,可能会导致订阅异常,从而使服务消费者获取到的服务提供者实例列表为空。

为解决这个问题,可以在 Nacos 客户端或 MSE Nacos 服务端开启推空保护功能,以提高整个系统的可用性。此外,MSE 把稳定性功能引入到了对 Eureka 的协议支持中,当 MSE Nacos 服务端数据出现异常的时候,Eureka 客户端从服务端拉取数据会默认受到容灾保护,确保业务不会出现拿到不符合预期的服务提供者实例列表,而导致业务故障的问题。

另外,MSE Nacos 和 MSE ZooKeeeper 还提供了多重高可用保障机制,如果业务方有更高的高可靠性和数据安全需求,在创建实例时可以选择不少于 3 节点的方式。当其中某个实例故障的时候,节点间可实现秒级切换,故障节点自动离群。同时 MSE 每个 Region 都包含多个可用区,同一个 Region 内不同可用区之间的网络延迟较小(3 ms 以内),多可用区实例可以将服务节点部署在不同可用区,当可用区 A 出现故障的时候,流量会在短时间内切换到另外的可用区 B。整个过程业务方无感知,应用代码层面无感知、无需变更。实现这一个机制只需配置多节点部署,MSE 就会自动帮你部署到多个可用区进行打散容灾。

支持 Eureka 客户端增量拉取数据

满帮在迁移至 MSE Nacos 之后,原先服务端实例假死无法提供服务的问题得到了很好的解决,但机房的网络带宽仍出现占用过高,服务高峰期还可能出现带宽打满的问题。经分析发现是因为 Eureka 客户端每次从 MSE Nacos 拉取服务注册信息的时候,仅支持全量拉取。这样就出现了定时拉取数千级别的数据量的情况,导致网关层面的 FGC 次数也升高了很多。为解决这个问题,MSE Nacos 上线了针对 Eureka 服务注册信息的增量拉取机制,再加上客户端使用方式的调整,客户端只需要在首次启动后拉取一次全量数据,后续只需要根据增量数据来保持本地数据和服务端数据的一致性,不再需要周期性全量拉取,而正常生产环境中变更增量数据的数据量很小,这样一来可以大幅降低出口带宽的压力。采用了该机制后,带宽从升级前的 40 Mbit/s 降到了 200 kbit/s,带宽打满问题也得到了解决。

充分压测优化服务端性能

MSE 团队后续对 MSE Nacos 集群 For Eureka 的场景进行了更大规模的性能压测,并通过各种性能分析工具排查业务链路上的性能瓶颈点,对原有功能进行了更多的性能优化和底层性能调参:

  • 引入缓存

针对服务端的全量和增量数据注册信息引入了缓存,并基于服务端数据 hash 来判断是否发生变更。在 Eureka 服务端读多写少的场景下,可以大幅减少 CPU 计算生成返回结果的性能开销。

  • 优化字符串数据 IO 传输性能

发现 SpringBoot 原生的 StringHttpMessageConverter 在处理大规模数据返回的时候存在性能瓶颈,提供了 EnhancedStringHttpMessageConverter 来优化字符串数据 IO 传输性能。

  • 支持 chunked

服务端数据返回支持 chunked。

  • 线程池数自适应调整

Tomcat 线程池数根据容器配置自适应调整。

满帮集团在完成了以上版本迭代升级之后,服务端各项参数也取得了不错的优化结果。

服务端 CPU 利用率从 13% 降到了 2%:

注册中心读 RT 从原先 55 ms 降至 3 ms 以内:

服务端 YGC Count 从原先的 10+ 降至 1:

YGC Time 从原先的 125 ms 降至 10 ms 以内:

旁路优化,保障集群高压下的稳定性

满帮在迁移到 MSE ZooKeeper 一段时间后,集群又出现了“Full GC”,导致集群不稳定。经排查发现,ZooKeeper 中 Metrics 的 watch 相关统计指标在计算时对当前节点保存的 watch 数据进行了全量拷贝。由于在满帮的场景下有非常大的 watch 规模,Metrics 计算拷贝 watch 会产生大量的内存碎片,导致集群无法分配出符合条件的内存资源,最终出现 Full GC。

为了解决这个问题,MSE ZooKeeper 针对非重要 Metrics 采取降级的措施,保障这部分 Metrics 不会影响集群稳定性。针对 watch 拷贝的 Metrics,采取动态获取的策略,避免数据拷贝计算带来的内存碎片问题。优化后,集群 Young GC 时间和次数都有了明显下降。

优化之后集群能够平稳承接 200 万 QPS,GC 稳定:

持续参数优化,寻找延时和吞吐量的最佳平衡点

满帮将自建 ZooKeeper 迁移到 MSE ZooKeeper 之后,发现应用发布时,客户端读取 ZooKeeper 中数据延时过大,应用启动读取配置超时,导致应用启动超时。为了解决这个问题,MSE ZooKeeper 进行了针对性的压测分析。在满帮的业务场景下,ZooKeeper 在应用发布时需要承接大量请求,请求产生的对象在现有的配置中导致 Young GC 频繁。MSE 团队经过多轮压测调整集群配置,寻找请求延时和 TPS 最优的交点,在满足延时需求的前提下,探索集群最优性能,在保证请求延时 20 ms、集群日常 10万 QPS 的前提下,CPU 从 20% 降低到 5%,集群负载显著降低。

业务价值

在数字货运行业竞争激烈和技术快速发展的背景下,满帮集团成功地实现了自身技术架构的升级,从自建的 Eureka 注册中心平滑迁移到了更为高效和稳定的 MSE Nacos 平台。这不仅代表了满帮集团在技术创新和业务扩展上的坚定决心,同时也展现了其对未来发展的深远规划。

满帮集团将微服务架构的稳定性和高性能作为其数字化转型的核心。通过采用先进的微服务架构解决方案,满帮集团为未来的业务扩展和技术迭代奠定了坚实的基础。全新的微服务架构产生的业务价值如下:

  • 系统稳定性增强

    新旧集群服务注册实例信息的完全一致性保证了业务切换的无缝过渡,增强了系统的容错能力。

  • 性能显著提高

    占用的带宽从升级前的 40 Mbit/s 降到了 200 kbit/s,在保证请求延时 20 ms、集群日常 10 万 QPS 的前提下,CPU 从 20% 降低到 5%,集群负载显著降低。

显著性能提高和稳定性增强,为满帮提供了强有力的支撑,使得平台能够更加从容地应对日益增长的业务需求,并且有余力以应对未来可能出现的任何挑战。

相关技术解决方案:

MSE实现全链路灰度

使用的阿里云产品
免费试用
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等