2019年12月16号,发布Kafka 2.4.0。
以下是Kafka 2.4.0版本中解决JIRA问题的摘要,有关该版本的完整文档,入门指南以及关于该项目的信息,请参考Kafka官方文档,或kafka中文教程。
有关升级的注意事项:在升级你的集群之前,请仔细阅读此版本的升级文档。升级有关不兼容性和破坏性的变更,性能变化以及可能影响Kakfa生产的任何其他变化。
Kafka 2.4.0包含许多重要的新功能。以下是一些重要的摘要:
- 允许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-5609] - 默认情况下,Connect log4j应该记录到文件
[KAFKA-6263] - 组元数据加载持续时间的公开指标
[KAFKA-6883] - KafkaShortnamer应该允许将Kerberos主体名称转换为大写用户名
[KAFKA-6958] - 允许KStreams DSL定义自定义处理器名称
[KAFKA-7018] - 持续使用memberId来重新启动consumer
[KAFKA-7149] - 减少分配数据大小以提高kafka stream的可扩展性
[KAFKA-7190] - 在低流量的情况下,清除分区topic会引起关于UNKNOWN_PRODUCER_ID的WARN语句
[KAFKA-7197] - 支持 Scala 2.13.0
[KAFKA-7245] - 弃用 WindowStore#put(key, value)
[KAFKA-7273] - Converters应有权访问headers。
[KAFKA-7335] - 将clusterId存储在本地以确保broker加入正确的集群
[KAFKA-7548] - 暂停的分区KafkaConsumer不应丢弃已获取的数据。
[KAFKA-7772] - 在Connect worker动态的调整日志级别
[KAFKA-7981] - 增加Replica Fetcher and Log Cleaner计数度量
[KAFKA-8233] - KIP-470: TopologyTestDriver测试输入和输出可用性的改进
[KAFKA-8305] - AdminClient应该支持使用默认分区和复制来创建topic
[KAFKA-8333] - 处理LeaderAndIsr请求时仅加载一次高watermark检查点
[KAFKA-8400] - 如果日志读取失败,则不更新follower副本状态
[KAFKA-8452] - 可能禁用缓冲区优化:删除重复的先前值
[KAFKA-8488] - FetchSessionHandler日志记录在TLAB中创建73mb分配,这可能不是操作
[KAFKA-8501] - 从异常消息中删除key和value
[KAFKA-8513] - 添加适用于Windows平台的kafka-streams-application-reset.bat
[KAFKA-8544] - 删除旧的kafka.admin.AdminClient
[KAFKA-8545] - 删除旧的ZkUtils
[KAFKA-8558] - KIP-479 - StreamJoined重载添加到KStream#Join
[KAFKA-8559] - PartitionStates.partitionStates导致数组增长分配。
[KAFKA-8560] - Kafka协议生成应支持通用结构
[KAFKA-8563] - Minor: 删除networkSend的方法调用。依靠Java vargas boxing/autoboxing
[KAFKA-8594] - 为Kafka 2.3.0添加Kafka Streams兼容性测试
[KAFKA-8595] - 支持JSON中未进行十六进制编码的十进制SerDe
[KAFKA-8601] - Producer 改进: Sticky Partitioner
[KAFKA-8634] - 更新 ZooKeeper到3.5.5
[KAFKA-8644] - Kafka协议生成应允许将字节和数组字段的默认值设置为空
[KAFKA-8669] - 在Kafka Security配置中添加Java安全提供程序
[KAFKA-8676] - 避免停止不必要的连接器和任务
[KAFKA-8696] - 清理Sum/Count/Total指标
[KAFKA-8717] - 从日志读取时使用缓存的hw/lso偏移量元数据
[KAFKA-8725] - 未能获取最脏的日志时改进LogCleaner错误处理
[KAFKA-8730] - 添加API以删除consumer offset(KIP-496)
[KAFKA-8745] - 消息为空时,DumpLogSegments不显示key
[KAFKA-8753] - 添加JMX以获取标记为删除的主题数
[KAFKA-8792] - 默认ZK配置以禁用AdminServer
[KAFKA-8839] - 在debug任务的生命周期中,改进Kafka的日志记录
[KAFKA-8853] - 创建Trogdor的持续连接测试
[KAFKA-8859] - 重构Streams指数的缓存级别
[KAFKA-8880] - 增强Consumer.committed(partition)以允许多个分区
[KAFKA-8884] - 改善ProcessorsNodes中类强制转换异常的流错误
[KAFKA-8927] - 删除配置`partition.grouper`和接口`PartitionGrouper`
[KAFKA-8934] - 介绍实例级指标
[KAFKA-8954] - 在DeleteOffset API中错误地实现了topic存在检查
[KAFKA-8956] - 重构DelayedCreatePartitions#update等待以避免在foreach中修改集合
[KAFKA-8984] - 完善标签字段文档
[KAFKA-8985] - 与LeaderAndIsr,UMR等一起使用flexibleVersions,并提高RequestResponseTest的覆盖率
[KAFKA-9020] - Streams子拓扑应按接收器->源关系排序
[KAFKA-9033] - 将consumer/producer中的默认客户端ID更改为更有意义
[KAFKA-9038] - 允许在重新分配分区时创建分区
[KAFKA-9058] - 外键联接不应要求可查询的存储
Bug
[KAFKA-1714] - gradle-wrapper.jar的更好的引导
[KAFKA-5566] - 片测试QueryableStateIntegrationTest.shouldAllowToQueryAfterThreadDied
[KAFKA-5998] - /.checkpoint.tmp找不到异常
[KAFKA-6290] - Kafka Connect类型转换应支持逻辑类型
[KAFKA-6605] - Flatten SMT无法正确处理为空的字段
[KAFKA-7157] - Connect TimestampConverter SMT不处理空值
[KAFKA-7263] - 容器异常java.lang.IllegalStateException:选择的协调器无效的分配协议:null
[KAFKA-7849] - 添加GlobalKTable时警告
[KAFKA-7921] - 不稳定的KafkaStreamsTest
[KAFKA-7937] - 片测试ResetConsumerGroupOffsetTest.testResetOffsetsNotExistingGroup
[KAFKA-7941] - 由于broker不可用,当获取offset失败时,Connect KafkaBasedLog工作线程终止
[KAFKA-7990] - 片测试KafkaStreamsTest#shouldCleanupOldStateDirs
[KAFKA-7994] - 改进重新平衡和重启的Stream时间
[KAFKA-8024] - UtilsTest.testFormatBytes在德语中失败
[KAFKA-8041] - 片测试 LogDirFailureTest#testIOExceptionDuringLogRoll
[KAFKA-8053] - 当topic不存在时,kafka-topics.sh会给出令人困惑的错误消息
[KAFKA-8078] - 片测试TableTableJoinIntegrationTest#testInnerInner
[KAFKA-8086] - 片测试GroupAuthorizerIntegrationTest#testPatternSubscriptionWithTopicAndGroupRead
[KAFKA-8104] - 消费者重新平衡后无法重新加入群组
[KAFKA-8106] - logValidator进行验证时,减少ByteBuffer的分配和复制。
[KAFKA-8122] - 片测试EosIntegrationTest#shouldNotViolateEosIfOneTaskFailsWithState
[KAFKA-8198] - KStreams测试文档使用不存在的方法“pipe”
[KAFKA-8262] - 片测试MetricsIntegrationTest#testStreamMetric
[KAFKA-8263] - 片测试MetricsIntegrationTest#testStreamMetricOfWindowStore
[KAFKA-8297] - Kafka Streams ConsumerRecordFactory产生有关泛型的困难编译器错误
[KAFKA-8319] - 片测试KafkaStreamsTest.statefulTopologyShouldCreateStateDirectory
[KAFKA-8340] - 从独立的插件路径目录中使用ServiceLoader时失败
[KAFKA-8392] - 当分区leader移到另一个节点时,Kafka Broker泄漏度量指标。
[KAFKA-8412] - 在关闭生产者之前进行刷新时,关闭时仍会引发nullpointer异常
[KAFKA-8427] - 在Windows下清理EmbeddedKafkaCluster时出错
[KAFKA-8442] - 使用--bootstrap-server时,topic命令中的ISR输出不一致
[KAFKA-8448] - 太多的kafka.log.Log日志 (内存泄露)
[KAFKA-8454] - 添加Java的AdminClient接口
[KAFKA-8456] - 片测试StoreUpgradeIntegrationTest#shouldMigratePersistentWindowStoreToTimestampedWindowStoreUsingPapi
[KAFKA-8461] - 片测试UncleanLeaderElectionTest#testUncleanLeaderElectionDisabledByTopicOverride
[KAFKA-8487] - 消费者不应在提交响应处理中在REBALANCE_IN_PROGRESS时复位resetGeneration
[KAFKA-8514] - Kafka客户端不应包含Scala的Java 8兼容性库
[KAFKA-8523] - 遇到逻辑删除事件时,InsertField转换失败
[KAFKA-8526] - 即使存在其他活动目录,broker也可能为新副本选择失败的目录
[KAFKA-8530] - consumer应在OffsetFetch中处理授权错误
[KAFKA-8550] - 连接器验证因使用别名转换器而失败
[KAFKA-8586] - 源任务生产者默默地发送消息失败
[KAFKA-8602] - StreamThread之所以死,是因为还原consumer未订阅任何topic
[KAFKA-8615] - 更改以跟踪分区时间间隔TimestampExtractor
[KAFKA-8620] - StreamThread状态更改中的竞争条件
[KAFKA-8635] - 在事务请求之前查找协调器时不必要的等待
[KAFKA-8637] - WriteBatch对象泄漏堆外内存
[KAFKA-8649] - 从Kafka Streams 2.0.0 -> Kafka Streams 2.1.0时滚动更新报错
[KAFKA-8662] - 如果先前的生产者生产的是未认证的主题,则生产者将失败
[KAFKA-8670] - 如果集群上不存在任何topic,则kafka-topics.sh在描述所有topic时会显示IllegalArgumentException
[KAFKA-8671] - 如果与GlobalKTable关联的topic发生更改,则会发生NullPointerException
[KAFKA-8677] - 片测试GroupEndToEndAuthorizationTest#testNoDescribeProduceOrConsumeWithoutTopicDescribeAcl
[KAFKA-8688] - 由于旧消息格式的数据丢失,升级系统测试失败
[KAFKA-8698] - ListOffsets响应协议文档
[KAFKA-8731] - InMemorySessionStore启动时抛出 NullPointerException
[KAFKA-8736] - 性能:ThreadCache使用size()进行空缓存验证
[KAFKA-8742] - 片测试RepartitionWithMergeOptimizingIntegrationTest#shouldSendCorrectResults_NO_OPTIMIZATION
[KAFKA-8743] - 片测试RepartitionWithMergeOptimizingIntegrationTest#shouldSendCorrectRecords_OPTIMIZED
[KAFKA-8748] - 片测试DescribeLogDirsRequestTest#testDescribeLogDirsRequest
[KAFKA-8755] - 优化的源表的备用任务不会向其状态存储写入任何内容
[KAFKA-8774] - 如果配置值包含其他字符,则Connect REST API会在任务终结点中公开纯文本秘密
[KAFKA-8782] - ReplicationQuotaManagerTest和ClientQuotaManagerTest应该关闭Metrics对象
[KAFKA-8788] - 通过大量分区优化客户端元数据处理
[KAFKA-8791] - RocksDB时间戳存储应以常规模式打开新存储
[KAFKA-8801] - 对一些成功的elect分区来说,electLeaderForPartitions冗余
[KAFKA-8802] - ConcurrentSkipListMap显示缓存和内存中的性能下降
[KAFKA-8804] - 内部Connect REST不安全
[KAFKA-8813] - 创建主题并更改其配置时的竞争条件
[KAFKA-8816] - StreamTask间接更新RecordCollector偏移量
[KAFKA-8817] - 片测试KafkaProducerTest.testCloseIsForcedOnPendingAddOffsetRequest
[KAFKA-8819] - 转换器的插件路径未按预期工作
[KAFKA-8824] - 配置抑制后,InMemoryTimeOrderedKeyValueBuffer会传播空值
[KAFKA-8837] - 几个集成测试错误地使用了verifyNonDaemonThreadsStatus
[KAFKA-8857] - 配置描述不应基于同义词返回isReadOnly=false
[KAFKA-8860] - SslPrincipalMapper应使用空格处理专有名称
[KAFKA-8861] - 修复片 RegexSourceIntegrationTest.testMultipleConsumersCanReadFromPartitionedTopic
[KAFKA-8875] - CreateTopic API应该在复制之前检查topic是否存在
[KAFKA-8878] - 片测试AssignedStreamsTasksTest#shouldCloseCleanlyWithSuspendedTaskAndEOS
[KAFKA-8889] - FetchSessionHandler.handleError的根本原因丢失了
[KAFKA-8891] - 无效的分配协议java.lang.IllegalStateException:选择的协调器无效的分配协议:null
[KAFKA-8892] - 在Kafka Configs帮助命令中显示排序的配置。
[KAFKA-8911] - 隐式TimeWindowedSerde创建带有空内部序列化器的Serde
[KAFKA-8943] - 将SecurityProviderCreator移至公共软件包
[KAFKA-8945] - ConnectorHealth和AbstractState的构造函数中的空检查不正确
[KAFKA-8947] - Connect框架错误地实例化了REST扩展的TaskStates
[KAFKA-8950] - KafkaConsumer停止获取
[KAFKA-8962] - KafkaAdminClient#describeTopics始终通过控制器
[KAFKA-8972] - KafkaConsumer.unsubscribe可能会导致不一致的用户重新平衡回调状态
[KAFKA-8974] - sink连接器无法处理带有空格的主题列表
[KAFKA-8983] - AdminClient deleteRecords不应不必要地使所有分区失效
[KAFKA-8992] - 不要在`RemoveMemberFromGroupResult`暴露错误
[KAFKA-9003] - 片测试RepartitionOptimizingIntegrationTest#shouldSendCorrectRecords_OPTIMIZED
[KAFKA-9014] - SourceTask.poll返回空列表时,由SourceRecordWriteCounter引发AssertionError
[KAFKA-9029] - 片测试CooperativeStickyAssignorTest.testReassignmentWithRandomSubscriptionsAndChanges
[KAFKA-9030] - 文档实例级指标
[KAFKA-9032] - 当foreignValue=null时,使用null调用序列化
[KAFKA-9046] - Connect worker配置需要未记录的“admin”。 为连接器配置DLQ的前缀
[KAFKA-9053] - AssignmentInfo#encode对LATEST_SUPPORTED_VERSION硬编码
[KAFKA-9069] - 片测试AdminClientIntegrationTest.testCreatePartitions
[KAFKA-9073] - 在StreamThread之一遇到java.lang.IllegalStateException之后,kafka流状态陷入了重新平衡状态:No current assignment for partition(没有当前分区分配)
[KAFKA-9078] - 系统测试失败: ConnectRestApiTest
[KAFKA-9079] - 系统测试失败: TransactionsTest
[KAFKA-9080] - 系统测试失败: MessageFormatChangeTest.testCompatibilty
[KAFKA-9084] - AlterPartitionReassignments不应删除所有副本
[KAFKA-9089] - 重新分配应该可以应对意外错误
[KAFKA-9133] - LogCleaner线程死于:发生意外异常时currentLog不能为空
[KAFKA-9140] - 消费者陷入无限期重新加入消费者组的困境
[KAFKA-9150] - DescribeGroup使用成员分配作为元数据
[KAFKA-9156] - LazyTimeIndex和LazyOffsetIndex可能导致并发状态下的niobufferoverflow
[KAFKA-9171] - DelayedFetch完成可能会引发异常,从而导致成功的生产消息失败
[KAFKA-9175] - MirrorMaker 2发出无效的主题分区指标
[KAFKA-9178] - 在最后一个还原任务完成之前,不会清除restorePartitions
[KAFKA-9184] - zombie work重新加入消费者组后,创建了冗余任务并定期重新平衡
[KAFKA-9190] - 服务器保留连接并打开过期的身份验证会话
[KAFKA-9196] - segments滚动后在高水位前进之前暴露的消息
[KAFKA-9198] - StopReplica处理程序应完成等待purgatory操作
[KAFKA-9200] - ListOffsetRequest缺少v5的错误响应
[KAFKA-9203] - kafka-client 2.3.1无法使用lz4压缩主题
[KAFKA-9212] - 发送ListOffsetRequest时继续接收FENCED_LEADER_EPOCH
[KAFKA-9219] - 从Kafka Connect轮询指标时发生NullPointerException
[KAFKA-9231] - 在启用EOS的情况下,流线程可能会因可恢复的错误而死亡
[KAFKA-9244] - 在RHS上更新旧FK引用时不应触发加入结果
[KAFKA-9251] - 用Admin API描述非消费者组时会永远挂起
[KAFKA-9258] - 连接ConnectorStatusMetricsGroup有时是NPE
[KAFKA-9261] - 更新客户端元数据时的NPE
[KAFKA-9265] -kafka.log.Log实例在删除日志时泄漏
任务
[KAFKA-8443] - 允许broker为consumer选择首选的只读副本
[KAFKA-8765] - 删除“不稳定”注释
[KAFKA-9072] - 为Topology Naming (KIP-307)添加Streams Developer Guide
测试
[KAFKA-9000] - 片测试KTableKTableForeignKeyJoinIntegrationTest.doLeftJoinFromRightThenDeleteRightEntity
[KAFKA-9123] - 添加具有大量分区的系统测试
子任务
[KAFKA-4222] - 片测试QueryableStateIntegrationTest.queryOnRebalance
[KAFKA-4600] - 当ConsumerRebalanceListener失败时,消费者继续进行
[KAFKA-8221] - 扩展LeaveGroupRequest进行批处理操作
[KAFKA-8331] - 在KStream上启用静态成员添加系统测试
[KAFKA-8355] - 将静态成员资格添加到范围分配器
[KAFKA-8390] - 用自动协议替换CreateDelegationToken请求/响应
[KAFKA-8471] - 用自动协议替换控制请求/响应
[KAFKA-8492] - 使用增量协议修改ConsumerCoordinator算法(第2部分)
[KAFKA-8493] - 在RebalanceListener中添加PartitionsLost API(第3部分)
[KAFKA-8496] - 添加系统测试的兼容性和升级路径(第6部分)
[KAFKA-8510] - 更新StreamsPartitionAssignor以使用内置的拥有分区来实现粘性(第7部分)
[KAFKA-8539] - 添加 `group.instance.id` 到 Subscription class
[KAFKA-8578] - 添加 Functionality 到 Expose RocksDB Metrics
[KAFKA-8579] - 将RocksDB指标公开到JMX
[KAFKA-8580] - 计算RocksDB指标
[KAFKA-8598] - 用自动协议替换RenewDelegationToken请求/响应
[KAFKA-8599] - 用自动协议替换ExpireDelegationToken请求/响应
[KAFKA-8600] - 用自动协议替换DescribeDelegationToken请求/响应
[KAFKA-8603] - 文件升级路径
[KAFKA-8609] - 添加消费者指标以实现再平衡(第9部分)
[KAFKA-8704] - 添加PartitionAssignor适配器以实现向后兼容性
[KAFKA-8760] - KIP-504: 添加新的Java Authorizer API
[KAFKA-8848] - 更新系统测试以使用新的认证
[KAFKA-8866] - 使Authorizer创建/删除异常的可选
[KAFKA-8886] - 使Authorizer创建/删除异步方法
[KAFKA-8887] - 如果实现异步,则对CreateAcls和DeleteAcls使用purgatory
[KAFKA-8902] - 基础合作 vs 渴望重新平衡
[KAFKA-8932] - 合并KIP-482时,在CreateTopics响应中为TopicConfigErrorCode添加标签
[KAFKA-8942] - 记录RocksDB指标