我正在测试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格式的每个主题写出分区重新分配。有没有办法处理这个问题,而无需手动决定哪个经纪人分区必须去?
答案 0 :(得分:4)
我今天做的事情完全相同,这简直是巧合。我没有得到你可能会喜欢的答案,但我最终达到了我想要的目标。
最终,我所做的是执行kafka-reassign-partitions命令,并使用相同的工具进行重新分配。但无论它生成什么,我只是用旧的失败的经纪人ID替换了新的经纪人ID。出于某种原因,生成的json移动了一切。
这将失败(或者说永远不会完成),因为旧经纪人已经过世了。然后我不得不删除zookeeper中的重新分配操作(znode:admin / reassign_partitions或其他东西)。
然后我重新启动了新经纪人的kafka,它神奇地成为了正在寻找新的替代领导者的分区的领导者。
我会告诉你明天是否一切都在工作,如果我还有工作的话; - )