近日,在 Apache RocketMQ 开发者社区的线下活动上,谐云科技首席架构师魏欢以《RocketMQ Operator In Kubernetes》为主题做了精彩分享,并和大家一起探讨关于 Apache RocketMQ 的未来改进计划。
概要
首先,什么是RocketMQ Operator?
其次,RocketMQ Operator 有什么用?
然后,从开发的角度,我们如何设计和实现一个 Operator?
最后,分享一个 RocketMQ Operator 的使用指南
以下为演讲实录
大家好,我是魏欢,来自杭州谐云科技,今天很荣幸能跟 RocketMQ 开发者社区的同学们分享关于 Kubernetes 场景下 RocketMQ 集群容器化运维的一些个人思路,以及前阵子我写的一个运维工具,也就是今天要讲的 Topic:RocketMQ Operator。
大规模数据中心场景下,有状态的中间件集群的运维
首先我想举个例子,假设在大规模的DC场景下,关于RocketMQ集群的一个部署场景。下图表明了属于多个DC中的一个DC X,以及属于该DC X的一个NameServer集群Y和Broker集群Y。其中NameServer集群包含M个实例,Broker集群包含N个Master实例,每个Broker Master实例又会和N个Broker Slave实例交互。
有状态中间件集群运维的难点
那么,假如我们身处这种场景,我们一般怎么运维?例如:如何能够秒级部署一个新的RocketMQ集群? 如何在业务无感知的情况下快速地增加或减少RocketMQ集群的NameServer或者Broker的实例数量? RocketMQ集群运行的过程中,假如其中一个或多个实例掉了,如何快速地恢复或者切换?如何更新RocketMQ集群版本? 以及如何去管理多个数据中心多个RocketMQ集群等等。
什么是RocketMQ Operator
回到主题,什么是RocketMQ Operator?我给它起的口号是:“Create,operate and scale self-healing RocketMQ clusters on Kubernetes.”它是一个Go程序,跑在kubernetes集群内,能够帮助我们自动化地去运维每个RocketMQ集群的状态。
RocketMQ Operator的部署形态
下图是RocketMQ Operator的部署形态:
简单来说:RocketMQ Operator通过自定义RocketMQ集群的资源对象,扩展和实现了一套基于Kubernetes的API,然后它会主动去观察和维护每个RocketMQ集群的状态。
申明式编程核心思想
那么作为一个程序,Operator具体是如何设计和工作的呢? 这里简单介绍一下“申明式编程”的设计思想。“申明式编程”的设计思想是跟复杂的“命令式编程”的设计思想对应的。“申明式编程”的思路非常简单,可以用一段伪码表示。
简单来讲,程序主体是一个循环,它会不断地干三件事:
第一,观察和列出待观察对象的当前状态
第二,理解我们希望待观察对象达到的一个状态
第三,做一些改变工作,促使两者状态达到一致。
举例:Kubernetes源码中对于申明式编程的运用
假如我们去看 Kubernetes 的源码,我们会发现“申明式编程”的思想贯穿了整个 kube-controller-manager 核心组件的代码设计。下图显示的是目前 kubernetes 最新的1.13版本(前几天刚刚 release),大家可以看到 kube-controller-manager 源码中写着大量的这些controller,比如endpointController、replicationController、podGCController、以及namespaceController、deploymentController、daemonsetController等等等等,包括了所有我们能够在Kubernetes中进行操作的资源对象。而Kubernetes的kube-controller-manager就是这些controller的一个集合,它会在初始化的时候启动每个controller的Go Routine,每个Go Routine只负责观察和维护各自关心的资源对象,保证最终的运行状态跟我们理想的一致。
RocketMQ Operator设计思想
因此,Operator的核心设计思想也是类似,针对每一种我们需要关心的Kubernetes资源对象,原生的也好,自定义的资源对象(CRD)也罢,使用“申明式编程”的思路实现它就好。可以看到这是目前 RocketMQ Operator 写的几个Controller。
另外,这是一个关于Broker集群定义的结构体。这里我们可以看到,我定义了Broker容器的启动镜像、依赖的NameServer集群的IP地址、Broker是否是全主模式、以及其他一些为了实现Broker集群容器化运行而定义的属性等等。
RocketMQ Operator使用指南
下面是一个简单的使用指南。
首先是对于Kubernetes集群的版本要求,建议1.9以上。
接下来,使用kubectl创建Namespace、RBAC、CRD等资源对象。然后,拉起一个NameServer集群。
然后,部署Operator程序。并且,拉起一个Broker集群,起Broker集群的时候,可以按需设置Broker集群的几种工作模式。这边可以看到一个2 master 2 slave broker集群的资源对象的配置参数。
然后是一些验证工作,这边可以看到集群中每个Broker节点的一些关键配置,并且通过集群内部客户端进行一些验证。
最后,RocketMQ Operator这个项目还不成熟,感兴趣的同学可以关注微信公众号“谐云科技”一起探讨,共同参与建设哦~
关于 Apache RocketMQ
Apache RocketMQ 作为阿里巴巴捐献给 Apache 基金会的顶级中间件项目,目前社区活跃,并且轻松支撑着每年阿里巴巴“双11”活动万亿级别的消息流量洪峰,新版本的 RocketMQ 更是支持分布式事务一致性、消息轨迹、多语言客户端等特性,特别适合在需要“低延时、高吞吐、高并发、高可用、分布式事务强一致性”的金融和互联网场景中使用。更多关于 RocketMQ 的介绍,请访问 https://rocketmq.apache.org