今年双十一大促中,消息中间件 RocketMQ 发生了以下几个方面的变化:
- 云原生化实践 。完成运维层面的云原生化改造,实现 Kubernetes 化 。
- 性能优化 。消息过滤优化交易集群性能提升 30% 。
- 全新的消费模型 。对于延迟敏感业务提供新的消费模式,降低因发布、重启等场景下导致的消费延迟 。
消息中间件早在 2016 年,通过内部团队提供的中间件部署平台实现了容器化和自动化发布,整体的运维比 2016 年前已经有了很大的提高,但是作为一个有状态的服务,在运维层面仍然存在较多的问题 。
中间件部署平台帮我们完成了资源的申请,容器的创建、初始化、镜像安装等一系列的基础工作,但是因为中间件各个产品都有自己不同的部署逻辑,所以在应用的发布上,就是各应用自己的定制化了 。中间件部署平台的开发也不完全了解集团内 RocketMQ 的部署过程是怎样的 。
因此在 2016 年的时候,部署平台需要我们去亲自实现消息中间件的应用发布代码 。虽然部署平台大大提升了我们的运维效率,甚至还能实现一键发布,但是这样的方案也有不少的问题 。比较明显的就是,当我们的发布逻辑有变化的时候,还需要去修改部署平台对应的代码,需要部署平台升级来支持我们,用最近比较流行的一个说法,就是相当不云原生 。
同样在故障机替换、集群缩容等操作中,存在部分人工参与的工作,如切流,堆积数据的确认等 。我们尝试过在部署平台中集成更多消息中间件自己的运维逻辑,不过在其他团队的工程里写自己的业务代码,确实也是一个不太友好的实现方案,因此我们希望通过 Kubernetes 来实现消息中间件自己的 operator。我们同样希望利用云化后云盘的多副本能力来降低我们的机器成本并降低主备运维的复杂程度 。
经过一段时间的跟进与探讨,最终再次由内部团队承担了建设云原生应用运维平台的任务,并依托于中间件部署平台的经验,借助云原生技术栈,实现对有状态应用自动化运维的突破 。
实现
文章插图
整体的实现方案如上图所示,通过自定义的 CRD 对消息中间件的业务模型进行抽象,将原有的在中间件部署平台的业务发布部署逻辑下沉到消息中间件自己的 operator 中,托管在内部 Kubernetes 平台上 。该平台负责所有的容器生产、初始化以及集团内一切线上环境的基线部署,屏蔽掉 IaaS 层的所有细节 。
Operator 承担了所有的新建集群、扩容、缩容、迁移的全部逻辑,包括每个 pod 对应的 brokerName 自动生成、配置文件,根据集群不同功能而配置的各种开关,元数据的同步复制等等 。同时之前一些人工的相关操作,比如切流时候的流量观察,下线前的堆积数据观察等也全部集成到了 operator 中 。当我们有需求重新修改各种运维逻辑的时候,也再也不用去依赖通用的具体实现,修改自己的 operator 即可 。
最后线上的实际部署情况去掉了图中的所有的 replica 备机 。在 Kubernetes 的理念中,一个集群中每个实例的状态是一致的,没有依赖关系,而如果按照消息中间件原有的主备成对部署的方案,主备之间是有严格的对应关系,并且在上下线发布过程中有严格的顺序要求,这种部署模式在 Kubernetes 的体系下是并不提倡的 。若依然采用以上老的架构方式,会导致实例控制的复杂性和不可控性,同时我们也希望能更多的遵循 Kubernetes 的运维理念 。
云化后的 ECS 使用的是高速云盘,底层将对数据做了多备份,因此数据的可用性得到了保障 。并且高速云盘在性能上完全满足 MQ 同步刷盘,因此,此时就可以把之前的异步刷盘改为同步,保证消息写入时的不丢失问题 。云原生模式下,所有的实例环境均是一致性的,依托容器技术和 Kubernetes 的技术,可实现任何实例挂掉(包含宕机引起的挂掉),都能自动自愈,快速恢复 。
解决了数据的可靠性和服务的可用性后,整个云原生化后的架构可以变得更加简单,只有 broker 的概念,再无主备之分 。
大促验证
推荐阅读
- Zero-Copy 还不懂零拷贝?怎么称得上高级程序员
- 电脑常见问题与故障有哪些
- 图解Kubernetes故障排查指南
- 零距离感受台湾茶文化,广西六堡茶顺利出口马来西亚
- 遭遇勒索软件袭击,如何快速遏制病毒扩散,并找到“零号患者”?
- 从零开始入门K8S| 从Spring Cloud到Kubernetes的微服务迁移实践
- 零基础学会广域网远程启动家中电脑
- 汽车故障灯红色扳手怎么消除?
- 魔芋|春天减肥,这一盘要多吃,低脂零卡,饱腹不怕胖,做法简单还便宜
- 线上故障如何快速排查?来看这套技巧大全