Kafka 分区偏移量分布不均匀
Kafka partition offsets are unevenly distributed by significant amount
在负载测试之后,我在我们的一个测试环境中遇到了一个场景,其中我们的 kafka 分区的偏移量分布不均匀。如果相差几百,我认为这是正常的,但这似乎有所不同。
在 10 个分区中,我看到分区的分布如下:
-------------------------
|partition | offset|
-------------------------
|0 | 100000+|
-------------------------
|1 | ~200|
-------------------------
|2 - 10 | ~50|
-------------------------
...
负载测试生成了唯一键并将它们分配给生成的事件。根据 kafka 文档,只要键不相同,它们就应该随机选择一个分区。第一个分区的偏移量如此之高对我来说似乎很奇怪,想知道是否有人知道为什么会发生这种情况?
在正常情况下似乎不会发生这种程度,只有在执行负载测试时才会发生。
[编辑]:只有生产者配置与 SSL 设置相关。其他一切都是默认的。 key
是在负载测试期间使用 uuid/v4
生成的。
{
host: process.env.KAFKA_URL,
requestTimeout: 1000,
ssl: true,
sslOptions: config.sslOptions
}
According to the kafka docs, as long as the keys are not identical they should randomly pick a partition.
DefaultPartitioner
class 的逻辑更像是
hash(key) % numberOfPartitions
如 code 所写。
看起来您的密钥大部分属于分区 0
并且可能值得 re-considering 创建密钥 and/or 选择另一个分区程序策略。
如果你真的想选择分区 round-robin 你可以使用 null
键。
分区选择有两个依赖项:
- 如果生产者为每条消息记录提供相同的密钥,哈希会得到相同的哈希值,但不能保证如果你提供两个不同的密钥,那么它永远不会给你相同的哈希值.
- 默认分区程序使用键的哈希值和主题上的分区总数来确定分区号。如果您增加分区号,那么如果您提供相同的密钥,默认分区程序将 return 均匀分配不同的号码。它在这里解释:https://jaceklaskowski.gitbooks.io/apache-kafka/content/kafka-producer-internals-DefaultPartitioner.html
还有 -> https://www.learningjournal.guru/courses/kafka/kafka-foundation-training/custom-partitioner/
在负载测试之后,我在我们的一个测试环境中遇到了一个场景,其中我们的 kafka 分区的偏移量分布不均匀。如果相差几百,我认为这是正常的,但这似乎有所不同。
在 10 个分区中,我看到分区的分布如下:
-------------------------
|partition | offset|
-------------------------
|0 | 100000+|
-------------------------
|1 | ~200|
-------------------------
|2 - 10 | ~50|
-------------------------
...
负载测试生成了唯一键并将它们分配给生成的事件。根据 kafka 文档,只要键不相同,它们就应该随机选择一个分区。第一个分区的偏移量如此之高对我来说似乎很奇怪,想知道是否有人知道为什么会发生这种情况?
在正常情况下似乎不会发生这种程度,只有在执行负载测试时才会发生。
[编辑]:只有生产者配置与 SSL 设置相关。其他一切都是默认的。 key
是在负载测试期间使用 uuid/v4
生成的。
{
host: process.env.KAFKA_URL,
requestTimeout: 1000,
ssl: true,
sslOptions: config.sslOptions
}
According to the kafka docs, as long as the keys are not identical they should randomly pick a partition.
DefaultPartitioner
class 的逻辑更像是
hash(key) % numberOfPartitions
如 code 所写。
看起来您的密钥大部分属于分区 0
并且可能值得 re-considering 创建密钥 and/or 选择另一个分区程序策略。
如果你真的想选择分区 round-robin 你可以使用 null
键。
分区选择有两个依赖项:
- 如果生产者为每条消息记录提供相同的密钥,哈希会得到相同的哈希值,但不能保证如果你提供两个不同的密钥,那么它永远不会给你相同的哈希值.
- 默认分区程序使用键的哈希值和主题上的分区总数来确定分区号。如果您增加分区号,那么如果您提供相同的密钥,默认分区程序将 return 均匀分配不同的号码。它在这里解释:https://jaceklaskowski.gitbooks.io/apache-kafka/content/kafka-producer-internals-DefaultPartitioner.html
还有 -> https://www.learningjournal.guru/courses/kafka/kafka-foundation-training/custom-partitioner/