你想知道的RocketMQ Operator干货都在这里!

近日,在 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
K8S中文社区微信公众号

评论 抢沙发

登录后评论

立即登录