代理失败后Kafka 0.10.0.1分区重新分配

时间:2016-09-20 05:27:05

标签: apache-kafka yahoo-kafka-manager

我正在测试kafka的分区重新分配,作为启动生产系统的先驱。我有几个主题,每个主题有9个分区,复制因子为3.我已经杀死了其中一个代理来模拟失败情况并验证某些主题被复制(通过雅虎的分支进行验证)修改了kafka manager以允许添加版本0.10.0.1群集。

然后我开始了一个具有不同身份的新经纪人。我现在想将分区分发给这个新的代理。我尝试使用kafka管理器重新分配分区功能,但这不起作用(可能是由于未正确修改的分支)。

我看到kafka附带了一个public class RandomQueue<Item> implements Iterable<Item> { Item[] items; int N; int first; int last; public RandomQueue() { items = (Item[]) new Object[2]; N = 0; first = last = 0; } public static void main(String[] args) { RandomQueue<Integer> rd = new RandomQueue<>(); } public boolean isEmpty() { return N == 0; } public String toString() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < N; i++) { sb.append(items[(first + i) % items.length]).append(" "); } return sb.toString(); } private void resize(int length) { Item[] temp = (Item[]) new Object[length]; for (int i = 0; i < N; i++) { temp[i] = items[(first + i) % items.length]; } items = temp; first = 0; last = N; } public void enqueue(Item item) { if (N == items.length) resize(items.length * 2); items[last++] = item; if (last == items.length) last = 0; N++; } public Item dequeue() { if (isEmpty()) throw new NoSuchElementException("Queue is empty"); Item first = items[first]; items[first] = null; N--; if (first == items.length) first = 0; else first++; if (N > 0 && N == items.length / 4) resize(items.length / 2); return first; } } 脚本,但文档说我必须手动为json格式的每个主题写出分区重新分配。有没有办法处理这个问题,而无需手动决定哪个经纪人分区必须去?

1 个答案:

答案 0 :(得分:4)

我今天做的事情完全相同,这简直是巧合。我没有得到你可能会喜欢的答案,但我最终达到了我想要的目标。

最终,我所做的是执行kafka-reassign-partitions命令,并使用相同的工具进行重新分配。但无论它生成什么,我只是用旧的失败的经纪人ID替换了新的经纪人ID。出于某种原因,生成的json移动了一切。

这将失败(或者说永远不会完成),因为旧经纪人已经过世了。然后我不得不删除zookeeper中的重新分配操作(znode:admin / reassign_partitions或其他东西)。

然后我重新启动了新经纪人的kafka,它神奇地成为了正在寻找新的替代领导者的分区的领导者。

我会告诉你明天是否一切都在工作,如果我还有工作的话; - )