kafka多节点,kill掉broker0后无法正常消费

峩錠☉不棄ル 发表于: 2017-04-08   最后更新时间: 2017-04-10 13:50:32   5,872 游览

请问一下,我在windows下建立了三个broker伪节点,id分别为0,1,2,配置大致是这样的

broker.id=0
listeners = PLAINTEXT://192.168.8.107:9092
port=9092

producer是根据上面的例子来写的,只是把另外的两个地址和端口也配置进来了

props.put("bootstrap.servers", "192.168.8.107:9092,192.168.8.107:9093,192.168.8.107:9094");

我的问题是:分别启动三个broker,生产和消费是正常的,当把broker0 kill掉之后也提示broker1或2被选为leader了,但是消费不到数据

发表于 2017-04-08
添加评论

你topic的分区副本数必须大于2。才不会丢。

好的,谢谢你

高嵩 -> 半兽人 7年前

等于2应该也是可以的

半兽人 -> 高嵩 7年前

是的,是大于等于2

For a topic with replication factor N, we will tolerate up to N-1 server failures without losing any records committed to the log.

所以针对这种情况。分区副本数应该 >=2

您好,

我的疑问:

       kafka集群的情况下,【1 ≤ broker存活数 ≤ broker 个数】的时候 ,

发送是否还会维持正常?  消费必须 【broker存活数 == broker 个数】的时候才有效?!



场景:

   在同一个服务器上起了三个kafka服务 192.168.100.238:9092,192.168.100.238:9093,192.168.100.238:9094。同时启动了其中一个kafka自带的zk,三个kafka都共用这个zk。(kafka版本 kafka_2.12-0.11.0.3)

假如三个broker 服务都起来的情况下,发送、消费信息都是正常的。

但是如果将其中的一个或者两个kafka停掉之后,有以下情况:



1. 如果主题只有一个分区,并且指定发送到该分区的时候,能发送成功,只不过是间歇性出现:

java.net.ConnectException: Connection refused: no further information

 at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)

 at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:712)

 at org.apache.kafka.common.network.PlaintextTransportLayer.finishConnect(PlaintextTransportLayer.java:50)

 at org.apache.kafka.common.network.KafkaChannel.finishConnect(KafkaChannel.java:95)

 at org.apache.kafka.common.network.Selector.pollSelectionKeys(Selector.java:370)

 at org.apache.kafka.common.network.Selector.poll(Selector.java:334)

 at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:433)

 at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:224)

 at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:162)

 at java.lang.Thread.run(Thread.java:745)



============================================================================

2. 如果主题有多个分区的时候 ,好像也能发。也是出现上面的异常。





而消费者 是一直报错。但是使用kafka的bin下的消费者 sh kafka-console-consumer.sh --zookeeper localhost:2181 --topic QQQQQQ_topic5 --from-beginning &

却能消费正常。

并不是所有都能消费,只是其中是leader的可以消费。生产也是一样,生产也是一样。

1. 如何查看当前哪个broker是 leader?(没能搜索到相关的命令,只记得zk查看状态的时候能看到为 leader 还是 follower)。
2. 按楼主的说法,其中的一个 broker 被kill掉了,那么剩下的就会重新选举。此时不就有 leader了吗?那么报异常是因为没有命中 leader,而是刚好落在了被kill 掉的 broker上?(如果这样的话,我是否能推测为,它内部是不能识别down掉的那些broker)

1、bin/kafka-topics.sh --describe --zookeeper
2、准确的说是有副本的分区,会参选leader。

bin/kafka-topics.sh --describe --zookeeper   localhost:2181
您给的这个,展示的是 topic 的分区情况:
Topic:QQQQQQ_topic      PartitionCount:3        ReplicationFactor:1     Configs:
        Topic: QQQQQQ_topic     Partition: 0    Leader: 0       Replicas: 0     Isr: 0
        Topic: QQQQQQ_topic     Partition: 1    Leader: 1       Replicas: 1     Isr: 1
        Topic: QQQQQQ_topic     Partition: 2    Leader: 2       Replicas: 2     Isr: 2


其实我想问的是 192.168.100.238:9092,192.168.100.238:9093,192.168.100.238:9094 这三个 broker ,跟 Leader 0 1 2有没有能查看哪个对应哪个?!

另外,按这样看,三个分区,坐落在三个不同的 Leader 。就更加疑惑了:Leader 会随时变?

leader 0 1 2 是对应配置文件中的broker.id的
你现在的topic只有1个副本,也就是说挂了,就挂了。
一个topic下有多个分区,分区分布在不同的机器上,有不同的leader来管理,这样保障高可用和高性能。
直白点讲,就是你发送90条消息,这90条平均分布在3台集群中。

(昨天发的一个提问:顺序消费和分区的并存问题,没找到了)。



分区数在server.properties 中默认是 1 。在java程序中能否更新主题的分区数?还是只能通过命令行增加?



另外,replication-factor 设定副本,也是只能通过命令行?在配置文件中是否能配置?



如果都只能通过命令行的话,那算不算预设了?在要用某个主题的时候,先预设分区、备份。(或者在程序调用创建后,这个时候使用的是默认值,再通过命令行调整)

你的答案

查看kafka相关的其他问题或提一个您自己的问题