企业kafka集群升级

一、前言
主要分享经历的生产环境多版本kafka集群版本升级统一过程中的经验教训和踩过的坑
二、我的kafka集群是否有必要升级?
做任何一件事之前,首先需要考虑和明确的,不是该怎么做,而是是否有必要做。版本升级这样的“大动作”更是如此。社区发布了新版本,我们是否要跟进,需要根据集群当前运行状况、是否需要新特性这两大方面,结合实际情况来判断
企业kafka集群升级
公司生产环境集群情况,属于上图中第三象限:
触发低版本bug的频率较高,严重影响了集群的稳定性;
由于历史原因,多个集群的版本不一致,用户使用的便捷性受到制约;
由于多版本并存,管理员必须关注各版本的变更项,增加了线上问题排查的耗时和复杂度。

虽然讨论的是集群版本升级过程,但依旧要郑重提醒大家:升级有风险,决定需谨慎。版本升级的目的,是为了使集群运行更稳定功能更强大,如果集群当前运行良好而且在可预见的短期内不需要新特性,那么完全不必要升级版本。
三、集群升级之“道”:方案设计
决定需要进行集群升级后,接下来就是方案制定环节。本节将依照“对用户影响尽量小,操作尽量安全高效”的原则,从是否可以停服升级、如何选择版本、怎样分阶段分批次操作等层面展开,和大家一起讨论升级方案制定过程中的一些关键点。
**3.1 停服升级 or 滚动升级
**
首先,如果可以接受停服,优先选择停服升级。这样可以规避滚动升级过程中必须经过的高风险阶段——新旧版本之间的切换和并存。

停服升级的操作过程简单明了:
企业kafka集群升级
如果不可接受较长时间停服,但有备份集群或者有足够的机器资源可以用来搭建备份集群,可以通过主备切换的方式实现对主集群的停服升级:
1、客户端切换broker/zookeeper连接到备份集群;
2、对主集群进行停服升级;
3、(如果需要) 备份集群数据同步至新版本的主集群;
4、客户端连接切回主集群,主集群恢复对外服务。

如果既需要保持服务不中断,又无法提供备份集群,那么滚动升级是唯一的选项,将必须面对新旧版本切换和共存的问题以及由此带来的潜在风险。作者就是从滚动升级这条路走过来的。

官网和Cloudera、Confluent等主流kafka服务提供商都给出了各自版本的滚动升级流程,这是我们制定滚动升级方案的最主要依据。
企业kafka集群升级
3.2 社区版本 or 服务商封装版本

由于历史原因,运维的诸多集群中既有社区版本,也存在不少Cloudera版本(即CDK),这两种版本在日常工作中的使用体验对比详见下表。大家可以结合各自的使用场景进行选择。
企业kafka集群升级
深感CDK版本的问题排查和调优不便,而且已自研可视化管理平台,因此选择了全部升级为社区版本
3.3 直接升级到目标版本 or 升级到中间版本过渡

除依赖zookeeper的0.9.0.0版本客户端由于Bug而无法被0.10.0.x版本的集群兼容以外,Apache kafka官方文档明确给出了其它各低版本向任一高版本直接升级的操作流程。作者操作完成了CDK和社区共计0.8.2.0~2.1.0其间6个不同版本向目标版本2.2.1的直接升级,得益于kafka优秀的版本兼容性。
3.4 集群升级五阶段
作为C/S架构,Kafka集群的完整升级过程,包括集群(broker)侧和客户端(client)侧两方面共五部分。
企业kafka集群升级
在决定上述各部分执行次序前,需要详细了解kafka的版本兼容特性:
0.10.2.0版本之前,broker版本单向向下兼容client版本:broker可以兼容等于或低于其版本的client,反之不兼容;
0.10.2.0版本及后续版本,broker和client版本双向兼容:broker可以兼容0.8.x及以上版本的client,client可以兼容0.10.0及以上版本的broker。
企业kafka集群升级
0.10.2.0及以后broker和client的版本双向兼容,是通过新增的ApiVersions接口进行协调的:client在读写数据前,先向broker发送该类型请求,以获取当前集群所能支持的所有版本。
企业kafka集群升级
为保证客户端读写不受影响,结合上述版本兼容特性,可以得出这五部分的执行次序应该如下:
第一阶段:[broker侧] 代码升级。该阶段只升级broker代码,复制协议和消息格式版本配置保持和低版本一致。
企业kafka集群升级
第二阶段:[broker侧] broker间通信协议/复制协议版本升级。该阶段对配置项 inter.broker.protocol.version 进行升级,消息格式版本配置保持和低版本一致。
(说明:如果此时升级消息格式版本,会导致当前低版本Consumer无法识别高版本格式的消息!)
企业kafka集群升级
第三阶段:[client侧] Consumer版本升级。升级后的高版本Consumer可以兼容集群当前的低版本格式的消息。
企业kafka集群升级
第四阶段:[broker侧] 消息格式版本升级。Consumer版本升级完成后,才可以升级broker消息格式版本,即配置项 log.message.format.version。
企业kafka集群升级
该阶段完成后:
至此,broker侧的升级过程全部完成;
Consumer和集群交互的协议将使用新版本。

第五阶段:[client侧] Producer版本升级。Producer版本在最后进行升级。
企业kafka集群升级
该阶段完成后:
升级后的Producer和集群交互的协议将直接使用新版本;
至此,整个集群包括broker和client均已升级完毕。

3.5 分批次操作

集群升级操作是对集群的重大变更,如果生产环境有不止一个集群,为保证升级期间的服务稳定性,建议根据集群承载业务的重要程度和流量,由小到大循序渐进分批次操作。

所操作的集群批次划分如下,供参考。
企业kafka集群升级
四、集群升级之“术”:执行流程

综合考虑上一节提到的各种因素确定升级方案后,即可将方案细化为可执行的操作步骤实施执行。

作者所在团队制定的执行流程概要如下图所示。
企业kafka集群升级
关键环节集中在:
测试:要对升级操作过程中可能遇到的各种场景进行充分测试,以尽力降低出现意外的概率;
升级流程演练:在测试环境对即将进行升级的集群操作进行全流程演练,主要目的有两点:
以文档的形式固化操作步骤 (包括每一步的执行人、执行的具体操作命令、执行耗时、检查点,和可能的回滚方案),供线上操作使用;
演练执行并确认回滚方案的有效性。
线上升级操作:之前各环节都充分执行完成后,按照既定步骤执行即可。

后续文章将依次对各阶段的执行流程,以及操作过程中遇到的问题,进行详细解析。
五、总结

是否有必要升级集群:取决于集群当前运行是否稳定和对新特性的需求是否迫切。
升级方案设计关键点:
优先选择停服升级的方式,可以规避新旧版本切换和共存过程中的潜在风险;
社区版本和服务商封装版本各有千秋,可根据实际情况进行选择;
kafka支持broker从几乎所有的低版本向各个高版本的直接升级,无需中间版本过渡;
集群的完整升级过程包括broker和client两方面共五部分,需严格按照先后次序分五个阶段依次进行;
建议根据业务和流量对所有集群进行循序渐进分批次升级。
执行流程关键点:要对升级操作进行全流程演练,以固化操作步骤并验证回滚方案的有效性。

上一篇:C和C++中结构体(struct)、联合体(union)、枚举(enum)的区别


下一篇:java socket通讯交互