一. 前言

主要梳理kafka版本,为后续开始研究kafka做准备.

二. Kafka版本规则

在Kafka 1.0.0之前基本遵循4位版本号,比如Kafka 0.8.2.0、Kafka 0.11.0.3等。
而从1.0.0开始Kafka就告别了4位版本号,遵循 Major.Minor.Patch 的版本规则,其中Major表示大版本,通常是一些重大改变,因此彼此之间功能可能会不兼容;Minor表示小版本,通常是一些新功能的增加;最后Patch表示修订版,主要为修复一些重点Bug而发布的版本。比如Kafka 2.1.1,大版本就是2,小版本是1,Patch版本为1,是为修复Bug发布的第1个版本。

三. Kafka版本演进

0.7.x版本

这是很老的Kafka版本,它只有基本的消息队列功能,连消息副本机制都没有,不建议使用。

0.8.x版本

两个重要特性,一个是Kafka 0.8.0增加了副本机制,另一个是Kafka 0.8.2.0引入了新版本Producer API。0.9.x版本

Kafka 0.9 是一个重大的版本迭代,增加了非常多的新特性,主要体现在三个方面:

安全方面:在0.9.0之前,Kafka安全方面的考虑几乎为0。Kafka 0.9.0 在安全认证、授权管理、数据加密等方面都得到了支持,包括支持Kerberos等。
新版本Consumer API:Kafka 0.9.0 重写并提供了新版消费端API,使用方式也是从连接Zookeeper切到了连接Broker,但是此时新版Consumer API也不太稳定、存在不少Bug,生产使用可能会比较痛苦;而0.9.0版本的Producer API已经比较稳定了,生产使用问题不大。
Kafka Connect:Kafka 0.9.0 引入了新的组件 Kafka Connect ,用于实现Kafka与其他外部系统之间的数据抽取。

0.10.x版本

Kafka 0.10 是一个重要的大版本,因为Kafka 0.10.0.0 引入了 Kafka Streams,使得Kafka不再仅是一个消息引擎,而是往一个分布式流处理平台方向发展。0.10 大版本包含两个小版本:0.10.1 和 0.10.2,它们的主要功能变更都是在 Kafka Streams 组件上。

值得一提的是,自 0.10.2.2 版本起,新版本 Consumer API 已经比较稳定了,而且 Producer API 的性能也得到了提升,因此对于使用 0.10.x 大版本的用户,建议使用或升级到 Kafka 0.10.2.2 版本。

0.11.x版本

Kafka 0.11 是一个里程碑式的大版本,主要有两个大的变更,一是Kafka从这个版本开始支持 Exactly-Once 语义即精准一次语义,主要是实现了Producer端的消息幂等性,以及事务特性,这对于Kafka流式处理具有非常大的意义。

另一个重大变更是Kafka消息格式的重构,Kafka 0.11主要为了实现Producer幂等性与事务特性,重构了投递消息的数据结构。这一点非常值得关注,因为Kafka 0.11之后的消息格式发生了变化,所以我们要特别注意Kafka不同版本间消息格式不兼容的问题。

1.x版本

Kafka 1.x 更多的是Kafka Streams方面的改进,以及Kafka Connect的改进与功能完善等。但仍有两个重要特性,一是Kafka 1.0.0实现了磁盘的故障转移,当Broker的某一块磁盘损坏时数据会自动转移到其他正常的磁盘上,Broker还会正常工作,这在之前版本中则会直接导致Broker宕机,因此Kafka的可用性与可靠性得到了提升;

二是Kafka 1.1.0开始支持副本跨路径迁移,分区副本可以在同一Broker不同磁盘目录间进行移动,这对于磁盘的负载均衡非常有意义。

2.x版本:

Kafka 2.x 更多的也是Kafka Streams、Connect方面的性能提升与功能完善,以及安全方面的增强等
Kafka 2.1.0开始支持ZStandard的压缩方式,提升了消息的压缩比,显著减少了磁盘空间与网络io消耗。

kafka2.8.x版本通过自我管理的仲裁来替代ZooKeeper

2.x 版本特性概览

Kafka 2.0.0

  1. 简化 Kafka Streams 升级过程
  2. 修补多次 Kafka 分区主本迁移时的日志分歧问题
  3. 降低信息格式向下转换时的内存消耗
  4. 加入消费者客户端的领先指标
  5. 加入更多 Kafka 控制器的健康指标
  6. 更全面的数据安全支持
  7. 细粒度前缀通配符访问控制
  8. xxx

Kafka 2.1.0

[新功能]

  1. 重载StreamsBuilder构建方法接受java.util.Properties
新功能
[KAFKA-7027] - 重载StreamsBuilder构建方法接受`java.util.Properties`


改进

[KAFKA-4514] - 为ZStandard压缩添加编解码器
[KAFKA-4932] - 增加UUID Serde
[KAFKA-5886] - 介绍delivery.timeout.ms生成器配置(KIP-91)
[KAFKA-5928] - 重新分配主题分区时,避免对zookeeper冗余请求
[KAFKA-6195] - DNS别名支持安全连接
[KAFKA-6432] - 查找索引可能会导致不必要的页面错误
[KAFKA-6437] - Streams不会警告缺少输入主题,而是挂起
[KAFKA-6591] - 在ACL评估之前,在SimpleAclProvider中移动对超级用户的检查
[KAFKA-6684] - 支持使用字节模式转换为字符串
[KAFKA-6751] - 使max.connections.per.ip.overrides成为动态配置
[KAFKA-6753] - 加速控制器上的事件处理
[KAFKA-6761] - 减少Kafka Streams足迹
[KAFKA-6863] - 如果第一个IP地址失败,Kafka客户端应尝试使用多个DNS解析的IP地址
[KAFKA-6880] - Zombie副本必须fenced
[KAFKA-6884] - ConsumerGroupCommand使用新的AdminClient
[KAFKA-6914] - Kafka Connect - Plugins类应该有一个可以接受父ClassLoader的构造函数
[KAFKA-6923] - 合并ExtendedSerializer/Serializer和ExtendedDeserializer/Deserializer
[KAFKA-6926] - 减少Connect中的NPath异常
[KAFKA-6950] - 添加机制以延迟响应失败的客户端身份验证
[KAFKA-6978] - 使Streams窗口保留时间严格
[KAFKA-6986] - 通过Stream Threads导出Admin Client指标
[KAFKA-6998] - 如果cache-size配置为零字节,则删除缓存包装器存储
[KAFKA-6999] - 记录启用缓存的仓库的读写锁使用情况
[KAFKA-7009] - 在系统测试中警告级别的reflections.org无日志
[KAFKA-7019] - 减少元数据更新和元数据读取操作之间的争用
[KAFKA-7101] - 会话窗口存储应该设置主题策略`compact,cleanup`
[KAFKA-7117] - 允许AclCommand使用AdminClient API
[KAFKA-7126] - 创建主题后,减少大型消费者组的重新平衡次数
[KAFKA-7131] - 更新发布脚本以生成公告电子邮件文本
[KAFKA-7147] - 允许和获取admin客户端属性文件
[KAFKA-7152] - 如果LEO等于leader的LEO,则副本应该是同步的
[KAFKA-7161] - KTable Reduce应检查无效条件
[KAFKA-7169] - 在OAuth身份验证中添加对自定义SASL扩展的支持
[KAFKA-7198] - 增强KafkaStreams启动方法javadoc
[KAFKA-7207] - 使费率和总指标文档保持一致
[KAFKA-7210] - 添加系统测试以进行日志压缩
[KAFKA-7211] - MM应该在commitSync中处理超时
[KAFKA-7215] - 在出错时改进LogCleaner行为
[KAFKA-7222] - KIP-328:添加窗口宽限期(并弃用窗口保留)
[KAFKA-7264] - 初始化的Kafka对Java 11的支持
[KAFKA-7266] - 修复MetricsTest测试片状
[KAFKA-7269] - KStream.merge没有文档
[KAFKA-7277] - 将Streams API迁移到Duration而不是longMs
[KAFKA-7278] - replaceSegments()不应从已经删除的段列表中调用asyncDeleteSegment()
[KAFKA-7285] - 在EOS下的任务暂停期间,流应该对防护更敏感
[KAFKA-7313] - 仅当将来的副本存在时,StopReplicaRequest才会尝试删除该分区的未来副本
[KAFKA-7326] - 让KStream.print()在每条打印行上刷新
[KAFKA-7332] - 尝试生成没有密钥的压缩主题的消息时改进错误消息
[KAFKA-7394] - 允许OffsetsForLeaderEpoch使用主题描述ACL(KIP-320)请求
[KAFKA-7395] - 将fencing添加到复制协议 (KIP-320)
[KAFKA-7396] - KIP-365: Materialized, Serialized, Joined, Consumed and Produced使用隐式Serde
[KAFKA-7399] - Streams-Scala中的FunctionConversions应该是私有的
[KAFKA-7406] - Naming Join 和 Grouping Repartition Topics
[KAFKA-7414] - 在副本获取中,超出范围不应导致broker失败。
[KAFKA-7429] - 使用相同的文件名/密码启用动态密钥/信任库更新
[KAFKA-7430] - 改进Transformer接口JavaDoc
[KAFKA-7437] - 在偏移提交元数据中存储leader epoch
[KAFKA-7441] - 允许同时使用LogCleanerManager.resumeCleaning()
[KAFKA-7454] - 对SslTransportLayer缓冲区使用延迟分配
[KAFKA-7456] - Streams DSL中的Serde继承
[KAFKA-7475] - 打印实际的集群引导程序
[KAFKA-7477] - 改进Streams关闭超时语义
[KAFKA-7559] - ConnectStandaloneFileTest系统测试未通过



其他略...
详情参考:  https://www.orchome.com/1377

Kafka 2.2.0

[KAFKA-4217] - KStream.transform相当于flatMap
[KAFKA-4453] - 添加请求优先级
[KAFKA-4850] - RocksDb无法使用Bloom Filters
[KAFKA-5692] - 重构PreferredReplicaLeaderElectionCommand以使用AdminClient
[KAFKA-5994] - 提高broker用户ACL错误配置的透明度
[KAFKA-6431] - 在Purgatory中锁定争用
[KAFKA-6567] - KStreamWindowReduce可以被KStreamWindowAggregate取代
[KAFKA-6774] - 改进使用者中的默认groupId行为
[KAFKA-6928] - StreamsPartitionAssignor在InternalTopicManager中进行双重重试
[KAFKA-7024] - 应在打开DB之前创建Rocksdb状态目录
[KAFKA-7054] - Kafka描述命令应抛出的主题不存在异常
[KAFKA-7096] - 消费者应该删除未分配的主题分区的数据
[KAFKA-7131] - 更新发布脚本以生成公告电子邮件文本
[KAFKA-7235] - 使用brokerZkNodeVersion可防止broker处理过时的控制器请求
[KAFKA-7266] - 修复MetricsTest测试片状
[KAFKA-7352] - KIP-368: 允许SASL连接定期重新进行身份验证
[KAFKA-7367] - 除非需要,否则Streams不应创建状态存储目录
[KAFKA-7389] - 升级spotBugs以支持Java 11
[KAFKA-7391] - 向Producer和AdminClient引入close(Duration),而不是close(long,TimeUnit)
[KAFKA-7402] - Kafka Streams应该在适当的时候实现AutoCloseable
[KAFKA-7413] - 用网站中的fllower替换slave术语
[KAFKA-7418] - 为所有可用的Kafka CLI命令添加'--help'选项(KIP-374)
[KAFKA-7420] - 对于常规任务,全球商店应该被保密为只读
[KAFKA-7433] - 在TopicCommand中引入broker选项以使用AdminClient
[KAFKA-7446] - 更好的错误消息来解释TimeWindow的上限
[KAFKA-7461] - 连接值转换器应具有逻辑类型的覆盖范围
[KAFKA-7478] - 减少OAuthBearerLoginModule详细程度
[KAFKA-7510] - KStreams RecordCollectorImpl在出错时将数据泄漏到日志中
[KAFKA-7524] - 推荐使用Scala 2.12并将其用于开发
[KAFKA-7528] - 标准化Min/Avg/Max Kafka指标的默认值
[KAFKA-7537] - 如果分区状态没有变化,则仅在发送给现有broker的UpdateMetadataRequest中包含实时broker
[KAFKA-7567] - 清除内部元数据用法以确保一致性和可扩展性
[KAFKA-7568] - 在ListOffsets响应中返回leader epoch
[KAFKA-7584] - 如果将max.in.flight.request.per.connect指定为String,StreamsConfig将抛出ClassCastException
[KAFKA-7610] - 检测初始JoinGroup中的消费者故障
[KAFKA-7641] - 添加`consumer.group.max.size`以限制broker上的消费者元数据大小
[KAFKA-7671] - KStream/GlobalKTable连接不应重置重新分区标志
[KAFKA-7673] - 升级RocksDB以包含对WinEnvIO::GetSectorSize的修复
[KAFKA-7687] - Print batch level information in DumpLogSegments when deep iterating
[KAFKA-7719] - 提高SocketServer处理器的公平性
[KAFKA-7734] - 度量标签应使用LinkedHashMap来保证顺序
[KAFKA-7738] - 跟踪客户端元数据中的分区领导者epochs
[KAFKA-7758] - When Naming a Repartition Topic with Aggregations Reuse Repartition Graph Node for Multiple Operations
[KAFKA-7762] - KafkaConsumer在javadocs中使用旧API
[KAFKA-7798] - 从KafkaStreams threadMetadata暴露嵌入式客户端上下文
[KAFKA-7804] - 更新KIP-377的文档
[KAFKA-7829] - Javadoc应该显示Kafka 1.1.0或更高版本中支持AdminClient.alterReplicaLogDirs()
[KAFKA-7834] - 在系统测试服务中扩展收集的日志以包括heap dumps
[KAFKA-7837] - maybeShrinkIsr可能不会立即反映OfflinePartitions
[KAFKA-7838] - 改进Partition.maybeShrinkIsr()中的日志记录
[KAFKA-7880] - Kafka Connect应标准化工作线程名称
[KAFKA-7916] - Streams存储清理:统一包装
[KAFKA-8040] - Streams需要在initTransactions中处理超时


Kafka 2.3.0

Kafka Connect REST API的一些改进。
Kafka Connect现在支持增量协作重新平衡。
Kafka Streams现在支持内存session存储和window存储。
AdminClient现在允许用户确定他们有权对topic执行哪些操作。
新的broker启动时间指标。
JMXTool现在可以连接到安全的RMI端口。
增加了新的AlterConfigs API。旧的AlterConfigs API已被弃用。
追踪最小ISR计数下的分区。
消费者现在可以选择不自动topic创建,即使在broker上启用它也是一样。
Kafka组件现在可以使用外部配置存储(KIP-421)。
我们在遇到错误时实现了改进的副本拉取程序行为。

  • 主要特性讲解
    KIP-351和KIP-427:改进了对 lost replicas 的分区监控
    为了保证 Kafka 的数据安全,Kafka 在不同的 Broker 上创建了几个副本。除非分区具有最小数量的同步副本,否则 Kafka 将不允许继续写入,这被称为“最小ISR”。

Kafka 已经有指标可以显示分区数量少于同步副本的最小数量。在此版本中,KIP-427 添加了其他指标,显示具有最小同步副本数的分区。通过监视这些指标,用户可以看到哪些分区的副本将不足,从而影响写。

此外,KIP-351 将 –under-min-isr 标签添加到 kafka-topics 命令里面。这使用户可以轻松查看哪些主题的副本数量少于最小 ISR 数量。

KIP-354:添加最大日志压缩延迟
对于一阶近似(first-order approximation),压缩主题中的键的先前值在写入最新密钥之后的某个时间被压缩,只有最新值可用,而以前的值不可用。但是,始终可以设置密钥在压缩之前保持的最短时间,因此我们不会太快丢失旧值。现在,使用 KIP-354,可以设置旧值将保持的最大时间量。新参数 max.log.compation.time.ms 指定旧值可能存在于压缩主题中的时间长度,这可用于遵守GDPR等数据保留规定。

KIP-402:提高 SocketServer 处理器的公平性
以前,Kafka 会优先考虑在处理现有连接时打开新的 TCP 连接。如果客户端尝试在短时间内创建许多新连接,则可能会出现问题。KIP-402 将现有连接优先用于新连接,从而提高了 broker 对连接风暴的恢复能力。这个KIP 还为每个 broker 添加了 max.connections 参数。

KIP-461:改进 Replica Fetcher 中的故障处理
为了使副本保持最新,每个 broker 都维护一个 Replica Fetcher 线程池。池中的每个线程负责为一些跟随者分区获取副本。以前,如果其中一个分区失败,整个线程将失败,从而导致可能数百个分区的副本不足。使用此KIP,如果给定副本提取程序线程管理的单个分区失败,则该线程将继续处理其余分区。

KAFKA-7283:减少 broker 在启动时扫描日志文件所花费的时间
当 broker 在不正常关闭后启动时,它会检查日志以确保它们没有被破坏。此 JIRA 优化该过程,以便 Kafka 仅检查尚未显式刷新到磁盘的日志段。现在,日志恢复所需的时间不再与日志数成比例。相反,它与未刷新的日志段的数量成比例。Zhanxiang Huang 在 JIRA 上讨论的一些基准测试显示,broker 的启动时间缩短了50%。


Kafka 2.4.0

2019年12月16号,发布Kafka 2.4.0。

允许consumer从最近的副本中拉取。

允许consumer从最近的副本中拉取。
支持对消费者重新平衡协议进行渐进式合作重新平衡。
MirrorMaker 2.0 (MM2), 新的多集群,跨数据中心复制引擎。
新的Java认证接口。
支持KTable中的非key连接。
副本重新分配的Administrative API

  • 新功能
[KAFKA-3333] - 支持“ Always Round-Robin”分区的备用分区程序
[KAFKA-3705] - 在KTable中支持非key连接
[KAFKA-7471] - 多消费组组管理(描述,重置,删除)
[KAFKA-7500] - MirrorMaker 2.0 (KIP-382)
[KAFKA-7800] - 扩展Admin API以支持动态日志级别
[KAFKA-8286] - KIP-460 Admin Leader 选举 RPC
[KAFKA-8447] - 测量连接器上任务数量的新指标
[KAFKA-8874] - KIP-517: 添加消费者指标以观察用户poll行为
[KAFKA-8885] - Kafka协议应支持可选的标记字段
[KAFKA-8907] - 在CreateTopics响应中返回topic配置
[KAFKA-8952] - 发现jackson-databind-2.9.9的漏洞


Kafka 2.5.0

2020年4月15号,Kafka 2.5.0发布。

支持 TLS 1.3(目前默认 1.2 版本)
Kafka Streams引入Co-groups
Kafka Consumer增量平衡机制(Incremental rebalance)
新指标可提供更好的运营监控
升级Zookeeper为3.5.7
不再支持Scala 2.11

  • 新功能

[KAFKA-6049] - Kafka Streams: 在DSL中增加Cogroup
[KAFKA-6144] - 允许从同步备用服务器提供交互式查询
[KAFKA-7251] - 支持 TLS 1.3
[KAFKA-8843] - Zookeeper迁移工具对TLS的支持
[KAFKA-9352] - topic分区对任务的不均衡分配
[KAFKA-9445] - 允许从单个分区中获取密钥,而不是遍历实例上的所有存储
[KAFKA-9487] - 跟进:KAFKA-9445(允许从单个分区获取密钥); 解决代码审查意见


Kafka 2.6.0

2020年8月3日,Kafka 2.6.0发布

默认情况下,已为Java11或更高版本启用TLS v1.3
性能显着提高,尤其是当broker具有大量分区时
顺利扩展Kafka Streams应用程序
Kafka Streams支持更改时发出
新指标可提供更好的运营洞察力
配置为进行连接时,Kafka Connect可以自动为源连接器创建topic
改进了Kafka Connect中接收器连接器的错误报告选项
-Kafka Connect中的新过滤器和条件SMT
client.dns.lookup配置的默认值现在是use_all_dns_ips
Zookeeper升级到3.5.8

  • 新功能
[KAFKA-6145] - 在迁移任务之前预热新的KS实例-可能会进行两阶段重新平衡
[KAFKA-8611] - 添加KStream#repartition操作
[KAFKA-8890] - KIP- 519:使SSL上下文/引擎配置可扩展
[KAFKA-9320] - 默认情况下启用TLSv1.3,并禁用某些较旧的协议
[KAFKA-9673] - 有条件地应用SMT
[KAFKA-9753] - 向流指标添加任务级活动进程比率
[KAFKA-9756] - 重构主循环以一次处理一个任务的多个记录


Kafka 2.7.0

TCP连接超时可配置和改善初始元数据的获取。
增强broker范围和每个listener的连接创建比率(KIP-612,第1部分)
限流创建topic、创建分区和删除topic操作。
将TRACE级别的端到端延迟指标添加到Streams。
添加broker端SCRAM配置API
支持PEM格式的SSL证书和私钥。
将RocksDB内存消耗添加到RocksDB指标中。
添加对聚合的滑动窗口支持

  • 新功能
[KAFKA-9893] -可配置的TCP连接超时和改进初始元数据的获取。
[KAFKA-9915] - 节流创建主题、创建分区和删除主题的操作。
[KAFKA-10054] - 在Streams中增加TRACE级别的端到端延迟指标。
[KAFKA-10259] - KIP-554:添加broker端SCRAM配置API。
[KAFKA-10338] - 支持SSL证书和私钥的PEM格式。


Kafka 2.8.0

抢先体验,kafka通过自我管理的仲裁来替代ZooKeeper(很快,Apache Kafka将不再需要ZooKeeper。)
增加集群描述API
在SASL_SSL监听器上支持彼此TLS认证
JSON请求/响应的debug日志
限制broker连接创建率
Topic识别
在Connect REST API中公开任务配置
更新 Streams FSM 以澄清ERROR状态的含义
扩展 StreamJoined 以允许更多的存储配置
更方便的TopologyTestDriver构造
引入 Kafka-Streams 专用的未捕获异常处理程序
启动和关闭Streams线程的API
改进 TimeWindowedDeserializer 和 TimeWindowedSerde 处理窗口大小
改善Kafka流中的超时和重试情况