kafka 版本演进

1,769 阅读5分钟

在学习 kafka 的过程中发现很多教程讲的知识都随着 kafka 版本演进而过时了,因此对 kafka 版本演进做一个梳理

原文

0.8.x

  1. 0.8.0Kafka 成为 Apache 顶级项目后的第一个版本, 为 Topic 引入 Replication 机制

  2. 0.8.2.0 ,Kafka 引入了新版 Producer API ,但尚不稳定,bug 较多

  3. 更新了消息的数据结构,把数据偏移量从物理偏移改为逻辑偏移量,在压缩处理偏移量时,会略微加重 cpu 的负担

0.9.x (2015 年底发布)

  1. 添加了安全认证、授权管理、数据加密等方面的支持

  2. 使用 java 重写了 Consumer API, 连接方式从 Zookeeper 切到了 Broker,但尚不稳定,bug 较多

  3. 新增 Kafka Connect 组件用于实现高性能数据抽取

  4. 新版 producer API 开始稳定

  5. kafka-topics.sh 脚本弃用,推荐使用 kafka-configs.sh

  6. kafka-consumer-offset-checker.sh 弃用,推荐 kafka-consumer-groups.sh

  7. 不再支持 java1.6 和 scala2.9

  8. 增加配额限制,既多租户控制

0.10.0.x

  1. 引入 Kafka Streams, 正式升级成分布式流处理平台

  2. 消息格式发生变动,增加了时间戳,此版本升级可能会引起消息格式转换,然后由于转换可能会导致 kafka 的 0 拷贝机制失效,表现为生产环境的性能下降。故该版本升级需要谨慎操作,确保客户端和服务端版本号一致.

变动前格式:

image.png

变动后格式,在 record 中新增了 timestamp 字段:

image.png

  1. 新增 kafka streams 客户端,此客户端仅适用于服务端版本 0.10.x 及以上集群

0.10.1.x

  1. 日志保留时间判断,从日志段的最后修改时间改为日志段中消息的最大时间戳

  2. 日志滚动时,从基于日志段的创建时间改为基于新消息中的时间戳做判断

3.Kafka Streams 升级到 0.10.1.x, 向下不兼容

  1. 新版 consumer api 支持从后台线程维持心跳,可防止 consumer 阻塞导致的下线及 reblance

  2. 新增支持在分区上按照时间戳搜索 offset

0.11.x (2017 年 6 月)

  1. 提供幂等性 Producer API,幂等性用于支持生产者单次会话中在同一个分区上实现 exactly once 语义

  2. 提供事务支持,但存在少量 bug

  3. 重构了 kafka 的消息格式。新的消息格式,在消息批量发送时更加节约空间,消息体 value 越大越节约时间,主要思想是对时间字段和数字字段采用了新的记录方法,当数字不是特别大的时候,原来用 int 标识的字段,只占用 1-2 个字节即可。消息位移改为起始的逻辑位移 + 本批消息的相对位移等各种手段,有效的降低消息大小

消息的发送格式 image.png

消息的压缩格式

image.png

  • inner message : 生产者的原始批量消息
  • wrapper message : broker 中存储的消息

wrapper message 中的 offsetinner message 中的最大 offset, 为 partion 的绝对位移 (非磁盘物理地址,逻辑位移), 并保存为相对位移,从 0 开始

  1. 默认禁用 unclean leader 选举 (leader 崩溃时从非 isr 的普通副本中选举 leader), 既默认必须从 isr 副本中选举新的 leader, 可配置 unclean.leader.election.enable=true 支持 unclean leader

  2. 生产者配置 block.on.buffer.fullmetadata.fetch.timeout.ms 并 timeout.ms 被删除

  3. 当使用消息压缩功能时,提高默认压缩块的大小。

1.0.x

  1. 默认开启主题删除功能。若是不想开启则 delete.topic.enable=false

  2. 实现了磁盘故障转移。当 Broker 的某一块磁盘损坏时数据会自动转移到其他正常的磁盘上,Broker 还会正常工作,这在之前版本中则会直接导致 Broker 宕机,因此 Kafka 的可用性与可靠性得到了提升;开始支持副本跨路径迁移,分区副本可以在同一 Broker 不同磁盘目录间进行移动,这对于磁盘的负载均衡非常有意义

3.kafka-consumer-offset-checker.sh 被删除。使用 kafka-consumer-groups.sh 获取消费者群组的详细信息

  1. 增强 kafka stream

1.1.x

  1. kafka 默认日志组件依赖修改,用户可以选择 slf4jlogback

  2. 增强 kafka stream

  3. 增强 kafka connect, 支持消息头

2.0.0

1.offset 默认保留时间从 1 天改为 7 天

  1. 不再支持 java7, 最低支持到 java8.

  2. 安全相关修改

  3. 客户端 scala 相关一些不再支持或已被删除,更推荐 java 相关的客户端

  4. Connect 组件默认 json 转换器

2.1.x

开始支持 ZStandard 的压缩方式,提升消息压缩比,显著减少磁盘空间和网络 io 消耗

2.2.x

  1. Kafka Streams 2.2.1 需要 0.11 或更高的消息格式,并且不适用于较旧的消息格式

  2. 从此版本开始必须显式设置消费者组 id, 否则将无法订阅主题和提交 offset,建议组 id 不要使用空字符串

  3. kafka-topics.sh 可以直接连接 --bootstrap-server, 旧的 --zookeeper 选项仍然可用.

2.3.x

  1. kafka connect 引入新的基于增量协作式的重新平衡协议

  2. consumer 引入静态成员,以减少滚动升级期间的 reblance

  3. Kafka Streams 2.3.0 需要 0.11 或更高的消息格式,并且不适用于较早的消息格式

2.4.x

1.zookeeper 依赖升级到 3.5.7

  1. 该 bin/kafka-preferred-replica-election.sh 命令行工具已被弃用。已由代替 bin/kafka-leader-election.sh

  2. 生产者 默认分区策略改为粘性分区策略,这意味着具有空键且没有分配分区的特定主题的记录将被发送到同一分区,直到准备好发送批次为止。创建新批次时,将选择一个新分区。这样可以减少产生的延迟,但是在极端情况下,可能会导致记录在分区之间的分布不均。通常,用户不会受到影响,但是这种差异在测试和其他情况下会在很短的时间内生成记录可能会很明显。

  3. 优化 consumer 重平衡相关特性.

2.5.x-2.7.x

简化 kafka 事务的扩展实现,改进 exactly once 语音

2.8.x

提供不依赖 Zookeeper 的方式,运行 kafka