请问一下,我在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了,但是消费不到数据
你topic的分区副本数必须大于2。才不会丢。
好的,谢谢你
等于2应该也是可以的
是的,是大于等于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 设定副本,也是只能通过命令行?在配置文件中是否能配置?
如果都只能通过命令行的话,那算不算预设了?在要用某个主题的时候,先预设分区、备份。(或者在程序调用创建后,这个时候使用的是默认值,再通过命令行调整)
你的答案