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

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

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

## 查询集群描述
bin/kafka-topics.sh --describe --zookeeper
林开心 -> 半兽人 5年前

因为是线上环境无法贴图的,对应的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
半兽人 -> 林开心 5年前

这个是内存溢出了,看样子你的物理机没有足够的内存支撑16G

林开心 -> 半兽人 5年前

物理机256内存且只跑了一个kafka。
想问一下,我的印象里,kafka集群内挂掉一台还是可以正常消费数据的,现在是只要挂掉一台就没办法消费了,有什么解决的方法吗?

半兽人 -> 林开心 5年前

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

林开心 -> 半兽人 5年前

我模拟了一下挂掉一台以后的情况,消息可以正常写入,旧的消费者也可以消费,但新的消费者无论在 消费的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之后的信息与现在的类似

半兽人 -> 林开心 5年前

mytest,没有副本呀。

林开心 -> 半兽人 5年前

是的,线上的也没有副本,他不应该从分区0和分区1读取消息吗?

半兽人 -> 林开心 5年前

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

林开心 -> 半兽人 5年前

我们单个topic数据量小的也得二十多万,长json格式做副本会占用太多资源吧

半兽人 -> 林开心 5年前

主备是最少配置了,也是性能和耐用性都相对最好的了。

林开心 -> 半兽人 5年前

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

半兽人 -> 林开心 5年前

超过半数了,kafka专栏里有篇文章解释过。文章太多了 得扒一扒。

林开心 -> 半兽人 5年前

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

你的答案

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