我有 3 个经纪人,3 个分区。每个代理都是一个分区的领导者和所有分区的 ISR。
假设我已经在端口上运行了代理19092,29092,39092
分别。
19092 - partition 0
29092 - partition 1
39092 - partition 2
半经纪人测试:
我想这样命名!因为它只允许 OUTPUT 而不允许 INPUT
现在,我添加了以下 iptables 规则:
iptables -A INPUT -p tcp --dport 29092 -j DROP
并在生产者中:
bin/kafka-console-producer --broker-list 10.54.8.172:19092 --topic ftest
上述 iptables 规则会阻止 INPUT 访问,但不会限制代理通过 Zookeeper 更新其活动状态。
所以zookeeper不会认为它已经死了,因此不会为分区1进行领导者选举。
但是,由于规则的原因,生产者无法连接到它,因此会抛出错误。
org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for ftest-1: 1778 ms has passed since batch creation plus linger time
我已手动完成此操作,但可能还有其他原因导致 INPUT 访问被阻止(某些恶意软件、DDoS 或其他任何原因)。
在 iptables 规则之前:
Metadata for ftest (from broker 1: 10.54.8.172:19092/1):
3 brokers:
broker 2 at 10.54.8.172:29092
broker 1 at 10.54.8.172:19092
broker 3 at 10.54.8.172:39092
1 topics:
topic "ftest" with 3 partitions:
partition 2, leader 3, replicas: 3,1,2, isrs: 3,1,2
partition 1, leader 2, replicas: 2,3,1, isrs: 2,3,1
partition 0, leader 1, replicas: 1,2,3, isrs: 1,2,3
iptables 规则之后:
Metadata for ftest (from broker 1: 10.54.8.172:19092/1):
3 brokers:
broker 2 at 10.54.8.172:29092
broker 1 at 10.54.8.172:19092
broker 3 at 10.54.8.172:39092
1 topics:
topic "ftest" with 3 partitions:
partition 2, leader 3, replicas: 3,1,2, isrs: 3,1,2
partition 1, leader 2, replicas: 2,3,1, isrs: 2
partition 0, leader 1, replicas: 1,2,3, isrs: 1,2,3
因为,只有一位领导者,而且是dead(从某种意义上说,它无法接收任何消息),不是单点故障?
我认为,理想情况下 Zookeeper 之间必须有 2 种方式的通信
和卡夫卡经纪人。不是吗?卡夫卡允许吗?如果是这样,怎么办?
此外,当 29092 被阻止输入访问时,其 ISR 会缩小
至 1。
可能是因为无法接收任何消息
(心跳)来自其他 2 个经纪人。
如果它可以连接(输出已启用),那么它可以写入它们并且
为了使复制得到确认,它需要 INPUT 访问权限。
所以 INPUT 和 OUTPUT 也应该在这里。
经纪人29092在这里就没什么用了。让系统处于不可恢复的状态!