本文由作者授权网易云发布,未经许可,请勿转载。
作者:李海燕,网易杭州研究院云计算技术部工程师
上文链接:【解构云原生】RocketMQ高可用方案调研及On K8S设计展望(上)
四、RocketMQ-On-K8S展望
4.1 Why on k8s
分布式中间件生命周期管理(部署和运维)十分复杂,作为使用方需要的是可以一键创建、删除和自动运维的集群。K8S针对分布式有状态中间件提供了Operator模式,中间件提供者开发Operator,业务侧直接使用k8S应用市场通过声明式yaml资源定义文件即可创建和管理中间件集群。
传统RocketMQ集群面临的问题
- 资源利用不均衡,不能依据RocketMQ的使用率动态的对集群进行扩容、缩容操作,导致集群资源使用不是很均衡
- 手动运维风险,集群资源规格变更和版本升级需要人工运维,没有流程的规范和沉淀,这些操作也存在风险. 除了风险, 还会留下大量不规范的环境. 需要一套能够覆盖服务生命全周期的自动化框架,能够清楚的看到目前RocketMQ集群的全景(音乐通过ansible解决了自动部署的问题)
- 需要自研巡查、告警和控制台等组件,基础生态较差(开源控制台功能较少)
基于K8S交付RocketMQ集群核心优势
- 提高资源利用率:能够实现合理利用资源,实现资源共享,实现集群混部,并且能做到资源隔离,互相不影响;
- 提高可用率,降低运维成本:高可用保障,部署合理性保障,覆盖自动化运维全部能力,包括:部署、自动扩容、自动缩容、异常自动恢复、不能动态切换宿主机等能力;运维成本降低20%
- 完善监控报警功能:完善的监控告警能力,资源监控、容器监控、Broker监控、消息监控等能力,完善的告警阈值规则判断能力,能够定义规则,并将告警及时发送给相关责任人
- 提供完善的操作界面:集成到轻舟平台,提供完善的API、CLI及管控页面,能够方便运维人员监控、管理集群
传统的手动部署和规格变更严重依赖开发部署人员,很容易出错,流程也很长,基于K8S交付中间件是一种全新的面向终态模式的软件交付方式,解耦业务和中间件提供者,提高效率,节约成本
参考:面向 Kubernetes 编程:Kubernetes是下一代操作系统
4.2 How on k8s
RocketMQ-On-K8s需要能进行集群生命周期管理、故障自动运维、监控报警和物理集群迁移等功能,整体架构如下图:
![v2-aabfa9d0256d0b37b420015cfee45360_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=c946adc7-732f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-aabfa9d0256d0b37b420015cfee45360_b.jpg)
以Master/Slave+failover组件高可用方案为例进行讨论,RocketMQ 集群部署需要有nameserver、broker和failover组件组成,且有部署顺序要求,类似kafka和zk的依赖关系。
![v2-9099f8dc8b1af1abfe55fd0fc324a36b_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=c946adc7-732f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-9099f8dc8b1af1abfe55fd0fc324a36b_b.jpg)
- prometheus:提供基础的监控,以及相关事件报警(operator产生的相关异常事件:包含本身以及实例)
相关资源
- nameServer:提供名称服务,无状态节点,指定副本个数即可,存储路由和commitLogOffset信息
- Broker:提供消息存储和转发服务,有状态,部署时指定配置文件(ConfigMap)
- HAController:维护Broker全局状态,根据QOS要求进行Broker主从切换
- httpSite:存储nameServer地址,供客户端和broker等组件通过http协议获取最新的nameServer地址
管控面高可用
为了满足Operator的高可用要求,可采用Deployment 3副本来部署Operator,Operator通过ETCD来进行选主。
![v2-9c873bb81e09393e065a2011397afa6e_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=c946adc7-732f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-9c873bb81e09393e065a2011397afa6e_b.jpg)
由于Operator本身不进行数据存储,属于无状态节点,所以Operator本身的高可用相对而言较弱,最低保障是Operator挂掉好重新启动能正常处理现有的事件。
数据面高可用
- 单机房:引入HAController组件实现Broker的自动failOver
- 多机房:暂不做讨论
访问架构
![v2-5366a2929c5f5559a5802267445868d3_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=c946adc7-732f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-5366a2929c5f5559a5802267445868d3_b.jpg)
Operator核心逻辑(broker为例)
Broker集群按照业务区分,不同的业务clusterName不同。一个clusterName下多个group,一个group下broker分主从节点。
用户需要在Broker的CR中指定nameServer http site地址以及其他Spec比如group个数,group下replicas等。
broker_controller的的Reconcile()逻辑流程图如下:
![v2-da07fe78af90cf988517e4db7079060d_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=c946adc7-732f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-da07fe78af90cf988517e4db7079060d_b.jpg)
注意:
- broker组件代码docker镜像化管理
- spec中定义broker主从节点个数,复制模式等
- 准备brokerAliveTest.sh和brokerStart.sh等脚本供k8s使用
水平扩容:
- 同一个broker集群增加新的主备节点相当于增加分片,同一个broker cluster增加节点就是水平扩容
垂直扩容:
- 因为有主备,垂直扩容是先停slave,扩容完再操作master即可
- failover组件完成主从切换,可以直接kill到master,等主从切换,也可以通过运维命令主动设置主从关系
五、总结
基于K8S交付是软件行业新趋势,网易杭州研究院云计算技术部基于网易轻舟中间件提供稳定高效的K8S及中间件服务,助力各产品线降低软件开发成本,提高资源利用率。
本文重点是RocketMQ高可用方案调研,后续云计算技术部中间件组将采用与音乐、严选共建方式推出rocketmq-operator实现RocketMQ全自动生命周期管理,实现集团内RocketMQ标准化。在此也感谢调研过程中网易云音乐相关同事的大力支持和答疑。
相关阅读推荐:
- 【解构云原生】管控代码减少80%,网易PaaS On Kubernetes实践
- 【解构云原生】基于Filebeat的日志采集服务设计与实践
- 【杭研大咖说】张小刚:PaaS on Kubernetes即将大规模应用
- 【解构云原生】进击的Serverless
- 微服务实践:我们离Service Mesh还有多远
- 网易云:云原生时代的指标监控利器-Prometheus
利益相关:网易轻舟中间件(基于 Kubernetes Operator 构建,提供数据库、缓存、消息等企业级互联网中间件)。