【发布时间】:2017-01-16 23:54:14
【问题描述】:
如何从 Kafka 集群中永久删除代理?
场景:
我有一个由 3 个代理组成的稳定集群。 我临时添加了成功加入集群的第四个代理。控制器返回的元数据表明该代理是集群的一部分。
但是,我从来没有在这个代理上重新平衡分区,所以这个代理 #4 从来没有真正使用过。
我后来决定从集群中删除这个未使用的代理。我成功关闭了代理,Zookeeper /broker/ids 不再列出代理 #4。
但是,当我们的应用程序代码连接到任何 Kafka 代理并获取元数据时,我们会得到一个代理列表,其中包括这个已删除的代理。
我如何向集群表明该代理已从集群中永久删除,而不仅仅是暂时停机?
此外,导致这种情况的幕后原因是什么?
我猜当我连接到代理并请求元数据时,代理会检查其本地缓存中的控制器 ID,联系代理并询问所有代理的列表。然后控制器检查它的缓存代理列表并返回已知在任何时间点属于集群的所有代理的列表。
我猜会发生这种情况,因为无法确定死去的代理是被永久删除还是只是暂时停机。所以我想我们只需要向控制器表明它需要将其已知集群代理列表重置为zookeeper中已知的实时代理。但是,如果我的心智模型中的某些内容不正确,我不会感到惊讶。
这是针对 Kafka 0.8.2 的。我计划很快升级到 0.10,所以如果 0.10 以不同的方式处理这个问题,我也很想知道这一点。
【问题讨论】:
-
/broker/ids 不再列出代理 #4。它不应该发生,因为 #4 已经从 /broker/ids 注销,我在 0.9 中从未发现此问题
-
您是否尝试在关闭 #4 代理后重新启动所有消费者?
-
是的,我们的消费者代码也缓存了宕机代理,所以我们确保重新启动它们。但即使是新的开始,他们仍然会从代理那里获得过时的元数据。
标签: apache-kafka