我正在研究灾难恢复功能,我需要确定给定密钥的 Kafka 分区以便重播来自该分区的消息。我读过,如果向卡夫卡提供密钥,它将使用
murmur2(key) % numOfPartitions
但是这似乎不是实施中发生的事情。
这是一张包含 keys 的表格,murmur2(key) % numOfParitions 的结果,以及实际分区 的内容。
钥匙 | 杂音2 % 3 | 实际分区 |
---|---|---|
AF42CC55DFC84DBC881743CEC2733A22 | 1 | 2 |
209BFB14708147319571502816D3D100 | 0 | 0 |
5A8DE05847404D1DA856EF8E35AE3830 | 2 | 1 |
主题有 3 个分区,我正在使用这个在线 murmurhash2 32 位算法:http://murmurhash.shorelabs.com/
注意第 1 个和第 3 个键的差异 - 实际分区与计算的散列分区不匹配。
DefaultPartitioner 是一个分区器,它使用 32 位 murmur2 哈希计算记录的分区(定义了键)或以循环方式选择分区(根据主题的可用分区)。
知道为什么密钥
AF42CC55DFC84DBC881743CEC2733A22
和 5A8DE05847404D1DA856EF8E35AE3830
没有存储在 murmur2 散列分区中吗?
密钥的字节(假设是 StringSerializer,然后是 UTF8 字符串,使用默认的 Kafka 编码)被散列。你用过的在线工具,好像是用ASCII
或者,作为备份解决方案的一部分,您可以将分区号直接存储为数字。那么该路径下的所有数据都是准确的。此外,它会阻止您计算哈希值、确定主题实际有多少个分区,并且能够不依赖于默认行为,因为生产者可以轻松覆盖它。