2019年6月25号,发布Kafka 2.3.0
。
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.3.0
版本中解决JIRA问题的摘要,有关该版本的完整文档,入门指南以及关于该项目的信息,请参考Kafka官方文档,或kafka中文教程。
有关升级的注意事项:在升级你的集群之前,请仔细阅读此版本的升级文档。升级有关不兼容性和破坏性的变更,性能变化以及可能影响Kakfa生产的任何其他变化。
新功能
[KAFKA-4730] - Streams没有内存窗口存储
[KAFKA-7283] - mmap惰性地索引并跳过恢复点以下的段的健全性检查
[KAFKA-7730] - 限制broker中活动连接的总数
[KAFKA-7904] - KIP-427: 添加AtMinIsr主题分区的类别(新指标和TopicCommand选项)
[KAFKA-7922] - 在描述响应中返回授权操作(KIP-430)
[KAFKA-8265] - 连接客户端配置覆盖策略
[KAFKA-8365] - follower获取的协议和消费者支持
改进
[KAFKA-3816] - 使用MDC在Kafka Connect日志消息中提供更多上下文
[KAFKA-5505] - 连接:不要在任务集变更时重新启动连接器和现有任务
[KAFKA-6161] - 为Serializer,Deserializer和Serde添加默认close()和configure()实现
[KAFKA-6399] - 考虑减少Kafka Streams的“max.poll.interval.ms”默认值
[KAFKA-6455] - 改善DSL级别的时间戳传播
[KAFKA-6474] - 重写测试以使用新的公共TopologyTestDriver
[KAFKA-6521] - 在KTable仓库中存储消息时间戳
[KAFKA-7236] - 添加--under-min-isr选项来描述topic命令
[KAFKA-7243] - 添加单元集成测试以验证Kafka Streams中的指标
[KAFKA-7320] - 在KafkaConsumer中提供禁用自动topic创建的功能
[KAFKA-7321] - 确保及时处理Kafka主题中的删除请求(基于时间的日志压缩)
[KAFKA-7440] - 在消费者获取请求中使用leader epoch
[KAFKA-7466] - 实现KIP-339:创建一个新的IncrementalAlterConfigs API
[KAFKA-7487] - DumpLogSegments报告索引offset的不匹配,这些offset不在消息批次的开头
[KAFKA-7492] - reduce和aggregate的`null`处理解释说明
[KAFKA-7747] - 消费者应在leader变更后检查截断情况
[KAFKA-7811] - 当KafkaConsumer提交offset时,避免不必要的锁获取
[KAFKA-7847] - KIP-421: 自动解决外部配置。
[KAFKA-7864] - AdminZkClient.validateTopicCreate()应验证分区是否从0开始
[KAFKA-7875] - 添加KStream#flatTransformValues
[KAFKA-7918] - Streams存储清理:内联字节存储通用参数
[KAFKA-7930] - StreamsResetter制作“changelog”主题命名假设
[KAFKA-7933] - KTableKTableLeftJoinTest需要一个小时才能完成
[KAFKA-7944] - 添加更自然的抑制测试
[KAFKA-7956] - 如果线程尚未启动,要避免在ShutdownableThread.awaitShutdown中阻塞
[KAFKA-7963] - 将硬编码的Streams度量标准名称字符串提取到集中位置
[KAFKA-7986] - 将日志记录与不同的ZooKeeperClient实例区分开来
[KAFKA-7992] - 添加服务器启动时间度量标准
[KAFKA-8006] - Guard在用户代码中调用init()和close())
[KAFKA-8007] - 内存窗口存储提取时的副本
[KAFKA-8014] - 扩展Connect集成测试以动态添加和删除workers程序
[KAFKA-8029] - 增加内存中仅字节的会话存储实现
[KAFKA-8060] - Kafka协议生成器应允许字符串的null默认值
[KAFKA-8094] - 使用get(key)迭代缓存效率很低
[KAFKA-8126] - 片测试org.apache.kafka.connect.runtime.WorkerTest.testAddRemoveTask
[KAFKA-8131] - 将--version参数添加到命令行帮助输出和文档
[KAFKA-8168] - 添加生成的ApiMessageType类
[KAFKA-8169] - 关于流快速入门文档的错误主题
[KAFKA-8215] - 限制RocksDB的内存使用量
[KAFKA-8231] - 扩展Connect ClusterState接口
[KAFKA-8294] - 批处理StopReplica请求删除分区并添加测试用例
[KAFKA-8309] - KIP-465: 添加Consolidated Connector Endpoint以连接REST API
[KAFKA-8336] - 在broker中启用客户端SSL工厂的动态更新
[KAFKA-8346] - 在处理分区故障时改进副本提取程序行为
[KAFKA-8347] - 选择要处理的下一条消息(按时间戳)
[KAFKA-8348] - kafkaStreams改进的文档
[KAFKA-8428] - 清理LogValidator#validateMessagesAndAssignOffsetsCompressed仅假设单个记录批次
Bug
[KAFKA-3143] - 当所有副本都死了时,ZK中的状态不一致
[KAFKA-3522] - 考虑将版本信息添加到rocksDB存储格式中
[KAFKA-4893] - 异步topic删除与最大topic长度冲突
[KAFKA-5061] - 应该为Connect生产者/消费者设置client.id
[KAFKA-5141] - WorkerTest.testCleanupTasksOnStop由于NPE导致的瞬时故障
[KAFKA-6569] - OffsetIndex和TimeIndex构造中的反射
[KAFKA-6635] - 生产者关闭不等待待处理的交易
[KAFKA-7026] - Sticky assignor可以为多个消费者分配一个分区(KIP-341)
[KAFKA-7455] - JmxTool无法连接到启用SSL的JMX RMI端口
[KAFKA-7652] - Kafka Streams Session存储性能从0.10.2.2降至0.11.0.0
[KAFKA-7703] - 调用“seekToEnd”后,KafkaConsumer.position可能会返回错误的offset
[KAFKA-7763] - 当网络断开10-20秒时,具有transactionId无效的KafkaProducer等待
[KAFKA-7801] - TopicCommand不能改变事务topic分区计数
[KAFKA-7813] - 当--object-name时,JmxTool抛出NPE省略
[KAFKA-7831] - Consumer SubscriptionState缺少同步
[KAFKA-7855] - Kafka Streams Maven Archetype快速入门无法立即使用
[KAFKA-7896] - 添加一些Log4J Kafka属性以生成安全broker
[KAFKA-7912] - 内存中的key-value仓库不支持并发访问
[KAFKA-7921] - 不稳定的KafkaStreamsTest
[KAFKA-7939] - 片测试KafkaAdminClientTest#testCreateTopicsRetryBackoff
[KAFKA-7946] - 片测试DeleteConsumerGroupsTest#testDeleteNonEmptyGroup
[KAFKA-7961] - 通过正在进行的重新平衡处理订阅变更
[KAFKA-7962] - 如果删除topic,则在分配期间抛出NullPointerException
[KAFKA-7965] - 片测试ConsumerBounceTest#testRollingBrokerRestartsWithSmallerMaxGroupSizeConfigDisruptsBigGroup
[KAFKA-7974] - 初始DNS查找失败时,KafkaAdminClient丢失工作线程/进入僵尸状态
[KAFKA-7976] - 片测试DynamicBrokerReconfigurationTest#testUncleanLeaderElectionEnable
[KAFKA-7989] - 片测试RequestQuotaTest#testResponseThrottleTimeWhenBothFetchAndRequestQuotasViolated
[KAFKA-8013] - 从部分正确的缓冲区读取Struct时,避免缓冲区下溢
[KAFKA-8052] - FETCH请求中的间歇性INVALID_FETCH_SESSION_EPOCH错误
[KAFKA-8058] - ConnectRestExtensionContext不会从其ConnectClusterState返回连接器列表
[KAFKA-8062] - 当StreamThread死亡时,不会通知StateListener
[KAFKA-8063] - 片测试WorkerTest#testConverterOverrides
[KAFKA-8091] - 片测试DynamicBrokerReconfigurationTest#testAddRemoveSaslListener
[KAFKA-8098] - 片测试AdminClientIntegrationTest#testConsumerGroups
[KAFKA-8111] - KafkaProducer无法生成数据
[KAFKA-8114] - 片测试DelegationTokenEndToEndAuthorizationTest#testNoGroupAcl
[KAFKA-8121] - ZooKeeperClient会话到期线程可能会在关闭后留下客户端
[KAFKA-8134] - ProducerConfig.LINGER_MS_CONFIG在kafka-clients 2.1中没有记录重大变更
[KAFKA-8142] - 如果消息在header中包含空值,则用NPE的Kafka Streams失败。
[KAFKA-8157] - 设置“segment index bytes”时缺少“key.serializer”异常
[KAFKA-8181] - 关于序列化的Streams文档包括Avro标头,但没有内容
[KAFKA-8187] - 使用备用任务时,状态存储在多次重新分配中的消息丢失
[KAFKA-8190] - 没有文件变更的密钥库更新不会更新SSLContext
[KAFKA-8199] - 废弃后后尝试groupBy时出现ClassCastException
[KAFKA-8204] - Streams可能以错误的顺序刷新状态存储
[KAFKA-8208] - KStreams Core Concepts doc中无序数据的断开链接
[KAFKA-8209] - 核心概念文档中KStreams DSL的错误链接
[KAFKA-8210] - 在Streams DSL文档中缺少KStreams的链接
[KAFKA-8227] - 缺少Streams和Tables的二元性链接部分
[KAFKA-8229] - 当commitRequest为true时,连接Sink Task更新nextCommit
[KAFKA-8232] - 片测试kafka.admin.TopicCommandWithAdminClientTest.testTopicDeletion
[KAFKA-8240] - Source.equals()可能会因NPE而失败
[KAFKA-8241] - 没有truststore的监听,导致密钥库动态更新失败
[KAFKA-8254] -禁止错误地将空topic传递给serdes
[KAFKA-8275] - NetworkClient leastLoadedNode选择应考虑受限制的节点
[KAFKA-8277] - 修复在ConnectHeaders的NPE
[KAFKA-8289] - KTable, Long>无法抑制
[KAFKA-8290] - Streams不关闭任务关闭的Fenced Producer
[KAFKA-8291] - 分支上的系统测试consumer_test.py失败
[KAFKA-8298] - 优化重新分区节点时可能报ConcurrentModificationException
[KAFKA-8304] - 注册REST扩展时,连接易受死锁影响
[KAFKA-8313] - 关闭后KafkaStreams状态未正确更新
[KAFKA-8320] - 连接错误处理来自通用包的RetriableException
[KAFKA-8323] - BloomFilter Rocks对象的内存泄漏
[KAFKA-8324] - 用户构造了RocksObjects泄漏内存
[KAFKA-8332] - 处理JoinGroupRequest时的回归不允许基于优先顺序的确定性协议选择
[KAFKA-8344] - 修复vagrant-up.sh以正确使用AWS
[KAFKA-8351] - 日志清理程序必须处理跨多个段的事务
[KAFKA-8352] - 连接系统测试失败了404
[KAFKA-8363] - 配置提供程序解析已损坏
[KAFKA-8376] - 片测试ClientAuthenticationFailureTest.testTransactionalProducerWithInvalidCredentials test.
[KAFKA-8379] - 片测试KafkaAdminClientTest.testUnreachableBootstrapServer
[KAFKA-8381] - 用于broker间监听器的SSL工厂已失效
[KAFKA-8404] - 转发REST请求时,不会在Connect中传递授权的标头
[KAFKA-8407] - 连接器客户端覆盖在类型为“Class”或“List”的客户端配置上报错
[KAFKA-8415] - 接口ConnectorClientConfigOverridePolicy需要从类加载隔离中排除
[KAFKA-8418] - Connect System测试不等待注册REST资源
[KAFKA-8422] - 客户端不应使用旧版本的OffsetsForLeaderEpoch
[KAFKA-8425] - KIP 421 Bug: 修改不可变源Map导致Java异常
[KAFKA-8426] - KIP 421 Bug: ConfigProvider配置与KIP-297不一致的参数
[KAFKA-8446] - 当消息值为空时,Kafka Streams恢复与NPE崩溃
[KAFKA-8449] - 在增量协作重新平衡下重新启动重新配置任务
[KAFKA-8463] - 修复leader离开时,修复多余的任务重新分配
[KAFKA-8473] - 调整Connect系统测试以进行增量协作重新平衡,并使其能够进行预期和增量协作重新平衡
[KAFKA-8475] - 暂时恢复SslFactory.sslContext()帮助器
[KAFKA-8483] - 生产者在UNKNOWN_PRODUCER_ID错误后可能重新排序消息
[KAFKA-8484] - ProducerId重置可能引起IllegalStateException
任务
[KAFKA-7766] - 改善Jenkins构建的失败快速行为
[KAFKA-8155] - 更新2.2.0和2.1.1版本的Streams系统测试
[KAFKA-8308] - 更新jetty以获取安全漏洞CVE-2019-10241
希望
[KAFKA-7950] - Kafka工具GetOffsetShell -time描述
测试
[KAFKA-8118] - 确保测试关闭ZooKeeper客户端,因为它们可能会影响后续测试
子任务
[KAFKA-7832] - 在CreateTopics中使用自动RPC生成
[KAFKA-7862] - 修改JoinGroup逻辑以合并group.instance.id更改
[KAFKA-7972] - 用自动协议替换SaslHandshake请求/响应
[KAFKA-7997] - 用自动协议替换SaslAuthenticate请求/响应
[KAFKA-8090] - 使用自动协议替换ControlledShutdown请求/响应
[KAFKA-8220] - 避免通过重新平衡超时来踢出成员
[KAFKA-8225] - 处理冲突的静态成员ID
[KAFKA-8284] - 在KStream上启用静态成员身份
[KAFKA-8285] - 在JVM上为KStream处理thread-id随机切换
[KAFKA-8373] - 将group.instance.id字段添加到Sync/Heartbeat/OffsetCommit协议中
[KAFKA-8386] - 当组不可用时,使用COORDINATOR_NOT_AVAILABLE替换UNKNOWN_MEMBER_ID