KafKa从0.8.2.1升级到0.9.0.1变化方案与步骤

Posted by Yancy on 2018-02-04

🍊我这里是采用,群集升级,全部更新停止老版本zk和kafka更新服务。

9.0.0有潜在的中断更改风险(在升级之前需要知道),并且与之前版本的broker之间的协议改变。这意味着此次升级可能和客户端旧版本不兼容。因此在升级客户端之前,先升级kafka集群。如果你使用MirrorMaker下游集群,则同样应首先升级。

滚动升级

1
2
3
升级所有broker的server.properties,并在其中添加
inter.broker.protocol.version = 0.8.2.X
每次升级一个broker:关闭broker,替换新版本,然后重新启动。

群集升级

一旦整个群集升级,通过编辑inter.broker.protocol.version并将其设置为0.9.0.0来转换所有协议。
逐个重新启动broker,使新协议版本生效。
注意 :如果你可接受停机,你可以简单地将所有broker关闭,更新版本并重启启动,协议将默认从新版本开始。
注意 :变换协议版本和重启启动可以在broker升级完成后的任何时间去做,不必马上做。

0.9.0.0潜在的中断变化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Java 1.6不再支持,需要Jdk1.7版本以上。
Scala 2.9不再支持。
默认情况下,1000以上的Broker ID为自动分配。如果你的集群高于该阈值,需相应地增加
reserved.broker.max.id配置。
replica.lag.max.messages配置已经移除。分区leader在决定哪些副本处于同步时将不再考虑落后的消息的数。
配置参数replica.lag.time.max.ms现在不仅指自上次从副本获取请求后经过的时间,还指自副本上次被捕获以来的时间。 副本仍然从leader获取消息,但超过replica.lag.time.max.ms配置的最新消息将被认为不同步的。
压缩的topic不再接受没有key的消息,如果出现,生产者将抛出异常。 在0.8.x中,没有key的消息将导致日志压缩线程退出(并停止所有压缩的topic)。
MirrorMaker不再支持多个目标集群。 它只接受一个--consumer.config。 要镜像多个源集群,每个源集群至少需要一个MirrorMaker实例,每个源集群都有自己的消费者配置。
在org.apache.kafka.clients.tools。包下的Tools已移至org.apache.kafka.tools。。 所有包含的脚本仍将照常工作,只有直接导入这些类的自定义代码将受到影响。
在kafka-run-class.sh中更改了默认的Kafka JVM性能选项(KAFKA_JVM_PERFORMANCE_OPTS)。
kafka-topics.sh脚本(kafka.admin.TopicCommand)现在退出,失败时出现非零退出代码。
kafka-topics.sh脚本(kafka.admin.TopicCommand)现在将在topic名称由于使用“.”或“_”而导致风险度量标准冲突时打印警告。以及冲突的情况下的错误。
kafka-console-producer.sh脚本(kafka.tools.ConsoleProducer)将默认使用新的Java Producer,用户必须指定“old-producer”才能使用旧生产者。
默认情况下,所有命令行工具都会将所有日志消息打印到stderr而不是stdout。

0.9.0.1中的显著变化

1
2
3
4
5
6
可以通过将broker.id.generation.enable设置为false来禁用新的broker ID生成功能。
默认情况下,配置参数log.cleaner.enable为true。 这意味着topic会清理。
policy = compact现在将被默认压缩,并且128MB的堆(通过log.cleaner.dedupe.buffer.size)分配给清洗进程。你可能需要根据你对压缩topic的使用情况,查看log.cleaner.dedupe.buffer.size和其他log.cleaner配置值。
默认情况下,新消费者的配置参数fetch.min.bytes的默认值为1。

0.9.0.0弃用的

1
2
3
4
5
6
7
kafka-topics.sh脚本的变更topic配置已弃用(kafka.admin.ConfigCommand),以后将使用kafka-configs.sh(kafka.admin.ConfigCommand) 。
kafka-consumer-offset-checker.sh(kafka.tools.ConsumerOffsetChecker)已弃用,以后将使用kafka-consumer-groups.sh (kafka.admin.ConsumerGroupCommand)
kafka.tools.ProducerPerformance已弃用。以后将使用org.apache.kafka.tools.ProducerPerformance(kafka-producer-perf-test.sh也将使用新类)
生产者的block.on.buffer.full已弃用,并将在以后的版本中移除。目前其默认已经更为false。KafkaProducer将不再抛出BufferExhaustedException,而是使用max.block.ms来中止,之后将抛出TimeoutException。如果block.on.buffer.full属性明确地设置为true,它将设置max.block.ms为Long.MAX_VALUE和metadata.fetch.timeout.ms将不执行。

升级准备步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
(0)
wget http://mirror.bit.edu.cn/apache/kafka/0.9.0.1/kafka_2.10-0.9.0.1.tgz
tar -xvf kafka_2.10-0.9.0.1.tgz
[jollybi@kafka1 tools]$ ll
total 88100
drwxr-xr-x 7 jollybi jollybi 4096 Jul 14 13:07 kafka_2.10-0.8.2.1
-rw-rw-r-- 1 jollybi jollybi 16162559 Jul 14 11:40 kafka_2.10-0.8.2.1.tgz
drwxr-xr-x 6 jollybi jollybi 4096 Feb 12 2016 kafka_2.10-0.9.0.1
-rw-rw-r-- 1 jollybi jollybi 35725063 Jun 20 20:11 kafka_2.10-0.9.0.1.tgz
drwxr-xr-x 12 jollybi jollybi 4096 Sep 25 16:41 zookeeper-3.4.5
-rw-rw-r-- 1 jollybi jollybi 38307840 Jul 14 11:40 zookeeper-3.4.5.tar
[jollybi@kafka1 tools]$ mkdir -p /data/tools/kafka_2.10-0.9.0.1/kafka-logs
[jollybi@kafka1 tools]$ mkdir -p /data/tools/kafka_2.10-0.9.0.1/logs
###修改配置:
(1)
[jollybi@kafka1 tools]$ vim kafka_2.10-0.9.0.1/config/zookeeper.properties
第一步修改:
# the directory where the snapshot is stored.
dataDir=dataDir=/data/jollybi/tools/zookeeper-3.4.5/tmp
# the port at which the clients will connect
clientPort=2281
# disable the per-ip limit on the number of connections since this is a non-production config
maxClientCnxns=0
dataDir,clientPort的意义不需要说明了,对于maxClientCnxns选项,如果不设置或者设置为0,则每个ip连接zookeeper时的连接数没有限制。
需要注意的是,设置maxClientCnxns的值时需要把kafka server的连接数考虑进去,因为启动kafka server时,kafka server也会连接zookeeper的。
(2)
[jollybi@kafka1 tools]$ vim kafka_2.10-0.9.0.1/config/consumer.properties
zookeeper.connect=10.155.90.153:2281,10.155.90.155:2281,10.155.90.138:2281
其他参数根据不同集群环境调整
(3)
[jollybi@kafka1 tools]$ vim kafka_2.10-0.9.0.1/config/producer.properties (修改内网IP)
metadata.broker.list=10.155.90.153:9292,10.155.90.155:9292,10.155.90.138:9292
producer.type=sync
compression.codec=none
serializer.class=kafka.serializer.DefaultEncoder
其他参数根据不同集群环境调整
(4)
[jollybi@kafka1 config]$ cat server.properties | grep -Pv "^#|^$"
broker.id=1
auto.leader.rebalance.enable = true
listeners=PLAINTEXT://10.155.90.153:9292
port=9292
host.name=10.155.90.153
zookeeper.connect=10.155.90.153:2281,10.155.90.155:2281,10.155.90.138:2281
zookeeper.connection.timeout.ms=6000
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/data/tools/kafka_2.10-0.9.0.1/kafka-logs
log.cleaner.enable=true
delete.topic.enable=true
num.partitions=1
num.recovery.threads.per.data.dir=1
log.retention.hours=96
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
备注:listeners一定要配置成为IP地址;如果配置为localhost或服务器的hostname,在使用java发送数据时就会抛出异 常:org.apache.kafka.common.errors.TimeoutException: Batch Expired 。因为在没有配置advertised.host.name 的情况下,Kafka并没有像官方文档宣称的那样改为广播我们配置的hostname,而是广播了主机配置的hostname。远端的客户端并没有配置 hosts,所以自然是连接不上这个hostname的

kafka与zk内存日志优化

我个人博客有写优化文档
Bigdata-Zookeeper集群日志配置详解和清理自定义启动内存
Kafka性能优化–JVM参数配置优化
Kafka日志存储解析与实践数据存储优化

升级步骤方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(0) mongodb 能存储时间戳4个小时的数据,在4个小时之内升级不会有风险。
(1) mongotail 先停止生产写入数据到kafka
(2) kafka 消费组继续消费 topic分区查看消费为零。
(3) zk需要升级3.4.6版本对应kafka0.9.1版本,如果zk不需要升级,升级之前要先将ZooKeeper中原版本的kafka生成的znode删除,包括:consumers, controller, brokers, controller_epoch等。否则启动kafka会报错。
(4) 重启新版本zk集群,查看集群服务选举是否正常。
(5) 重启新版本kafka集群,重启没有报错,查看版本没问题就行。
(6) zk上面查看命令
./zkCli.sh -server 10.155.90.153:2281,10.155.90.155:2281,10.155.90.138:2281
[zk: 10.155.90.153:2281,10.155.90.155:2281,10.155.90.138:2281(CONNECTED) 0] ls /
controller_epoch controller brokers zookeeper kafka-manager admin isr_change_notification consumers config
[zk: 10.155.90.153:2281,10.155.90.155:2281,10.155.90.138:2281(CONNECTED) 0] ls /brokers/ids
[1, 2, 3]
集群三个brokers id正常
(7)修改监控指标。 完成升级
(8) 另外,新版本的一些命令与原版本的有些相同,增删改查命令。

开始升级步骤操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
(1)启动zk与kafka
# /data/tools/zookeeper-3.4.6/bin/zkServer.sh start
# /data/tools/kafka_2.10-0.9.0.1/bin/kafka-server-start.sh /data/tools/ kafka_2.10-0.9.0.1/config/server.properties &
(2)新建topic
#./bin/kafka-topics.sh --create --zookeeper 10.155.90.153:2281,10.155.90.155:2281,10.155.90.138:2281 --replication-factor 3 --partitions 12 --topic mongotail_lz4_imp
#./bin/kafka-topics.sh --create --zookeeper 10.155.90.153:2281,10.155.90.155:2281,10.155.90.138:2281 --replication-factor 3 --partitions 12 --topic mongotail_lz4
(3) 查看集群topic分区情况
#./bin/kafka-topics.sh --describe --zookeeper 10.155.90.153:2281,10.155.90.155:2281,10.155.90.138:2281 --topic mongotail_lz4
(4) 更新所有开源监控(KafkaOffsetMonitor)
vim /home/jollybi/./monitor/monitor.sh
#!/bin/bash
java -Xms512M -Xmx512M -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m -cp KafkaOffsetMonitor-assembly-0.2.0_modify.jar com.quantifind.kafka.offsetapp.OffsetGetterWeb --zk 10.155.90.153:2281,10.155.90.155:2281,10.155.90.138:2281 --port 8086 --refresh 10.seconds --retain 7.days >/tmp/stdout.log 2>&1 &
zk地址修改成内网地址 这里的数据存储7天。
重启服务:
./monitor/monitor.sh &
(5)更新开源监控(kafka-manager)
vim kafka-manager-1.3.3.8/conf/application.conf
kafka-manager.zkhosts="10.155.90.153:2281,10.155.90.155:2281,10.155.90.138:2281"
zk地址修改成内网地址.
重启服务:
./kafka-manager-1.3.3.8/bin/kafka-manager -Dconfig.file=kafka-manager-1.3.3.8/conf/application.conf -Dhttp.port=8080 &
(6)更新开源监控(zabbix)自己写的监控脚本
[jollybi@kafka1 ~]$ /data/tools/kafka_2.10-0.9.0.1/bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --zookeepe 10.155.90.153:2281,10.155.90.155:2281,10.155.90.138:2281 --group group_ml --topic mongotail_lz4
[2017-10-31 14:05:24,390] WARN WARNING: ConsumerOffsetChecker is deprecated and will be dropped in releases following 0.9.0. Use ConsumerGroupCommand instead. (kafka.tools.ConsumerOffsetChecker$)
Group Topic Pid Offset logSize Lag Owner
group_ml mongotail_lz4 0 1205186 1205257 71 group_ml_Graphsql-test.jollychic.com-1509421110787-1daec53a-0
group_ml mongotail_lz4 1 1206860 1206915 55 group_ml_Graphsql-test.jollychic.com-1509421110787-1daec53a-0
....
运行会出现WARN警告,0.9版本更新过了,
注意:在0.9.0.0,kafka.tools.ConsumerOffsetChecker已经不支持了。你应该使用kafka.admin.ConsumerGroupCommand(或bin/kafka-consumer-groups.sh脚本)来管理消费者组,包括用新消费者API创建的消费者。
这里使用kafka.admin.ConsumerGroupCommand 提示命令不对,现在在研究使用。
监控脚本 输出会有提示直接过滤掉即可。
function wlj_event_lag {
echo "`sh /etc/zabbix/kafka_topic_monitor.sh 2>/dev/null | sed -n '3p'`"
}

🎉 kafka升级,调配内网访问地址,内存,日志输出类型调优,监控更新配置。
🎉 参考官网文档 Apache Kafka 从 0.8.0, 0.8.1.X 或 0.8.2.X 升级到 0.9.0.0

Communicative learning:

🐧 Linux shell_ senior operation and maintenance faction: QQ group 459096184 circle (system operation and maintenance - application operation and maintenance - automation operation and maintenance - virtualization technology research, welcome to join)
🐧 BigData-Exchange School:QQ group 521621407 circles (big data Yun Wei) (Hadoop developer) (big data research enthusiasts) welcome to join

Bidata have internal WeChat exchange group, learn from each other, join QQ group has links.