kafka集群宕机一台后无法消费

发表于: 2019-11-20   最后更新时间: 2019-11-20  
  1. 我有五个kafka节点,有一个节点宕掉了,生产者和可以正常的生产,但通过9092无法消费到数据。
  2. __consumer_offsets副本数是3


您需要解锁本帖隐藏内容请: 点击这里
本帖隐藏的内容




上一条: kafka AdminClient频繁报Timed out waiting to send the call
下一条: 如何实时监控kafka队列是否有新数据

  • 看看该topic的分区有没有副本,贴一下运行情况。

    ## 查询集群描述
    bin/kafka-topics.sh --describe --zookeeper
    
    • 因为是线上环境无法贴图的,对应的topic都没有副本且宕机的kafka通过jps查看是有对应进程,但已经不提供服务了
      对应错误,kafka内存设置为

      -Xmx16G -Xms4G
      java.lang.OutOfMemoryError: Java heap space
      [2019-11-12 00:07:05,095] INFO Client session timed out, have not heard from server in 6417ms for sessionid 0x56ccc6b94d50008, closing socket connection and attempting reconnect (org.apache.zookeeper.ClientCnxn)
      [2019-11-12 00:07:04,035] ERROR Error while accepting connection (kafka.network.Acceptor)
      java.lang.OutOfMemoryError: Java heap space
      
        • 物理机256内存且只跑了一个kafka。
          想问一下,我的印象里,kafka集群内挂掉一台还是可以正常消费数据的,现在是只要挂掉一台就没办法消费了,有什么解决的方法吗?

            • 继续调大jvm,另外,你得看下系统日志,是否有相关kill内存溢出的日志。
              kafka的耐用性是靠分区保障的,挂掉一台,如果__consumer_offset__确认没问题,并且该topic的分区在别的机器也有副本并选成leader,是不会有问题的。 其实你得提供给我描述信息,生产你可以提供伪码。

                • 我模拟了一下挂掉一台以后的情况,消息可以正常写入,旧的消费者也可以消费,但新的消费者无论在 消费的ip列表里写不写宕机的那台ip都无法通过9092消费了

                  Topic:mytest    PartitionCount:3    ReplicationFactor:1    Configs:
                      Topic: mytest    Partition: 0    Leader: 2    Replicas: 2    Isr: 2
                      Topic: mytest    Partition: 1    Leader: 3    Replicas: 3    Isr: 3
                      Topic: mytest    Partition: 2    Leader: -1    Replicas: 1    Isr: 1
                  Topic:__consumer_offsets    PartitionCount:50    ReplicationFactor:3    Configs:segment.bytes=104857600,cleanup.policy=compact,compression.type=producer
                      Topic: __consumer_offsets    Partition: 0    Leader: 3    Replicas: 3,2,1    Isr: 2,3
                      Topic: __consumer_offsets    Partition: 1    Leader: 3    Replicas: 1,3,2    Isr: 2,3
                      Topic: __consumer_offsets    Partition: 2    Leader: 2    Replicas: 2,1,3    Isr: 2,3
                      Topic: __consumer_offsets    Partition: 3    Leader: 3    Replicas: 3,1,2    Isr: 2,3
                      Topic: __consumer_offsets    Partition: 4    Leader: 2    Replicas: 1,2,3    Isr: 2,3
                      Topic: __consumer_offsets    Partition: 5    Leader: 2    Replicas: 2,3,1    Isr: 2,3
                      Topic: __consumer_offsets    Partition: 6    Leader: 3    Replicas: 3,2,1    Isr: 2,3
                  

                  consumer_offsets之后的信息与现在的类似

                    • 为什么不加副本呢?而且还是生产。
                      kafka有个保护策略,一半以上服务不可用,就会停止了。
                      文章在哪我没时间帮你找,晚会我找找。

                        • 嗯,还有一个问题,比如我三个分区没有副本宕掉一个节点,在新的消费者加入时,不应该在消费的时候就不去加入宕掉那个分区吗?
                          [Consumer clientId=consumer-1, groupId=test2] Setting newly assigned partitions [mytest-0, mytest-1, mytest-2]
                          不应该只是加入正常提供服务的那两个分区

                            • 我大概找了找又试了一下,我用四台机器作为集群,挂一台还是没办法消费,他还是会使消费者加入所有的分区,导致无法消费