一、Kafka-0.10.2.0滚动升级方案
二、Kafka-0.10.2.0兼容性
Kafka broker
0.10.2.0版本的brokers支持0.8.x或更高版本的客户端。
Kafka客户端
从0.10.2.0版本开始,Kafka的Java客户端(producer和consumer)实现了与部分老版本的broker(0.10.x)通信的兼容性。
0.10.2.0版本的客户端可以与0.10.0或更高版本的broker通信。但是,如果broker的版本低于0.10.0,必须先升级所有Kafka集群中的brokers的版本,才可以继续升级客户端的版本。
三、0.8.2.1向0.10.2.0滚动升级手册
1. 安装配置Kafka-0.8.2.1
https://shiyueqi.github.io/2017/04/27/Kafka-0.8.2.1安装配置/
2. 安装Kafka-0.10.2.0
下载地址:http://apache.claz.org/kafka/0.10.2.0/
Kafka-0.10.2.0安装方法与0.8.2.1相同。安装完成后如下图
- kafka_2.10-0.8.2.1:Kafka伪集群,待升级。模拟生产环境正在运行的Kafka集群。broker.id=0
- kafka_2.10-0.8.2.1_2:Kafka伪集群,待升级。模拟生产环境正在运行的Kafka集群。broker.id=1
- kafka_2.12-0.10.2.0:最新版本Kafka集群,准备启用。broker.id=0
- kafka_2.12-0.10.2.0_2:最新版本Kafka集群,准备启用。broker.id=1
- kafka-logs:Kafka日志文件目录。
- zookeeper-3.4.9:Zookeeper伪集群,无需操作
- zookeeper-3.4.9_2:Zookeeper伪集群,无需操作
3. 配置Kafka-0.10.2.0
0.8.2.1核心配置
broker.id=0
host.name=172.18.55.21
port=9092
log.dirs=/home/yqshi/kafka/kafka-logs/kafka_2.10-0.8.2.1
zookeeper.connect=172.18.55.21:2181,172.18.55.21:2182
0.10.2.0核心配置
broker.id=0
listeners=PLAINTEXT://172.18.55.21:9092
host.name=172.18.55.21
port=9092
log.dirs=/home/yqshi/kafka/kafka-logs/kafka_2.10-0.8.2.1
zookeeper.connect=172.18.55.21:2181,172.18.55.21:2182
inter.broker.protocol.version=0.8.2.1
log.message.format.version=0.8.2.1
至此,完成了broker.id=0的Kafka-0.10.2.0配置。重复上述配置完成第二台以及其他实例的配置。
注意事项:
- 新版本与旧版本的log.dirs指定相同的路径,否则会导致信息丢失
- 新版本于旧版本broker.id保持一致。
- 需要在新版本的server.properties中,写入以下信息,这两个参数很重要!
- inter.broker.protocol.version=旧版本号
- log.message.format.version=旧版本号
4. 逐台关掉Kafka-0.8.2.1实例
在关闭broker实例的时候,查阅了一些资料,在这里提一下。
0.8.1.x版本
在Kafka-0.8.1.x版本中,Kafka源码中/kafka/admin/目录下有ShutdownBroker这个类,可以通过这个类实现优雅下线(graceful shutdown)。因此可以通过kafka安装目录下的/bin/kafka-run-class.sh脚本,来运行指定的类的方法,实现优雅停机。
sh kafka-run-class.sh kafka.admin.ShutdownBroker --zookeeper 172.18.055.21:2181,172.18.55.21:2182 --broker 1 --num.retries 3 --retry.interval.ms 600
0.8.2+版本
kafka.admin.ShutdownBroker这个类被移除了,因此不能通过上述方法实现停机。
在Kafka-0.8.2+版本中,可以直接运行kill pid,但不要kill -9 pid。 kafka.controller.KafkaController.scala类中,实现了优雅shutdown。
5.启动Kafka-0.10.2.0实例
关闭一台Kafka-0.8.2.1实例,则立刻启动一台对应的broker.id的Kafka-0.10.2.0实例。
sh kafka-server-start.sh ../config/server.properties &
重复4-5步骤,将Kafka集群所有的实例,代码都升级为最新的0.10.2.0
6. 更新协议版本
一旦集群所有节点都升级了,下面就可以逐步升级protocol版本-通过inter.broker.protocol.version这个配置选项,设置为0.10.2.0.
即更新Kafka-0.10.2.0实例的/config/server.properties文件,
inter.broker.protocol.version=0.10.2.0
重启当前实例,使新协议生效。
重复第6步操作,将集群所有的Kafka实例的协议版本均升级为0.10.2.0,并完成重启操作。
7. 更新consumer客户端代码
将所有consumer的依赖版本升级为0.10.2.0.然后重新编译、打包、重启consumer客户端应用。
8. 更新日志格式版本
更新每台broker的log.message.format.version。
log.message.format.version=0.10.2.0
逐台重启broker实例
9. 注意事项
如果可以接受宕机,可以在停掉所有brokers之后再更新代码,然后重启brokers。启动后将默认采用新协议。
设定版本协议以及重启可以在所有brokers都升级之后任何时间进行。而不需要在升级之后立刻重启。
由于Kafka-0.10.2.0的broker是与0.8+版本的客户端API兼容,因此在完成第5步broker的更新操作后,即使当前的配置如下
inter.broker.protocol.version=0.8.2.1 log.message.format.version=0.8.2.1
均为旧值,但是不影响现有业务的调用。
在Kafka broker kill之后,会触发Kafka partation的leader重新选举。在这样一段的时间窗口内,producer发送的消息会发送失败。
同时,consumer也无法消费到发送失败的消息。
但是我怀疑是不是我关闭Kafka进程的姿势不对。。。。
四、参考文献
http://kafka.apache.org/0102/documentation.html#upgrade
https://shiyueqi.github.io/2017/04/21/Kafka-0.10.2.0滚动升级方案/
五、版权声明
转载请注明出处: https://shiyueqi.github.io/2017/04/27/Kafka-0.10.2.0滚动升级手册/
Author: Yueqi Shi
Date: 2017-04-27 15:17:00 AM