我有3个经纪人,3个分区。每个代理是一个分区的领导者,而isr是所有分区的领导者。假设我在港口经营经纪人 19092,29092,39092
分别。
19092 - partition 0
29092 - partition 1
39092 - partition 2
半经纪人测试:
我想这样命名!因为它只允许输出,不允许输入
现在,我添加了以下iptables规则:
iptables -A INPUT -p tcp --dport 29092 -j DROP
在制作人中:
bin/kafka-console-producer --broker-list 10.54.8.172:19092 --topic ftest
上面的iptables规则阻止输入访问,但并不限制代理使用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
这一点,我已经手动完成了,但可能还有其他原因导致输入访问被阻止(一些恶意软件、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
既然只有一个领导人,而且他已经死了(从某种意义上说,他无法接收任何信息),那不是一个单一的失败点吗?
我认为,Zookeeper和Kafka经纪人之间最好有双向沟通。不是吗?Kafka允许吗?如果是,怎么做?
此外,当29092被阻止输入访问时,它的isr缩小到1。
这可能是因为它无法从其他两个代理接收任何消息(心跳)。
如果它可以连接(输出被启用),那么它就可以对它们进行写操作,为了使复制得到确认,它需要输入访问权限。
所以输入和输出都应该在这里。
经纪人29092在这里简直一无是处。使系统处于不可恢复状态!
1条答案
按热度按时间ecbunoof1#
理解kafka如何利用zookeeper原语来维护和组织集群状态可能是最好的答案。
在Kafka,领导选举是由一个中间人作为控制者精心策划的。只有一个控制器,它是使用zookeeper在代理中选择的。
现在,每个代理在zookeeper中将自己注册为一个“临时节点”。因此,启动zk会话的代理通过使用周期性心跳(zk术语中的滴答声)来维护成员身份。如果代理未能在超时时间间隔内勾选,zookeeper将删除该节点,并且kafka控制器(通过zk watches)将收到该事件的通知。如果失败的代理是分区的负责人,则会触发新的负责人选举。控制器处理领导人选举并通知所有经纪人。
所以是的,Kafka和zk之间有双向沟通——但就分区领导人选举而言,这不是每个经纪人和zk之间的直接双向沟通。中间人是控制者。
在您的测试中,由于控制器从未收到broker 2失败的通知,因此broker仍然是分区1的领导者。
从现在开始,我推测
已阻止输入的broker 2无法接收元数据更新,因此它通过将isr收缩到自身来保护自己。这可能也有帮助。