Kafka-0.10.2.0滚动升级手册

一、Kafka-0.10.2.0滚动升级方案

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_zookeeper_list

  • 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. 注意事项

  1. 如果可以接受宕机,可以在停掉所有brokers之后再更新代码,然后重启brokers。启动后将默认采用新协议。

  2. 设定版本协议以及重启可以在所有brokers都升级之后任何时间进行。而不需要在升级之后立刻重启。

  3. 由于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
    

    均为旧值,但是不影响现有业务的调用。

  4. 在Kafka broker kill之后,会触发Kafka partation的leader重新选举。在这样一段的时间窗口内,producer发送的消息会发送失败。

    滚动升级producer异常

    同时,consumer也无法消费到发送失败的消息。

    滚动升级consumer未消费异常msg

    但是我怀疑是不是我关闭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