背景
kafka是一个分布式消息订阅系统,我司一直用它来做日志中转队列,配合ELK,一直表现很出色.当然,基本每次和它打交道的时候都是遇到队列堆积的情况,基本一年一次,去年是双十一,今年也是.之所以要记录一下,是因为同样的错误一年遇到一次,每次都要重新学习一遍,好记性不如赖笔头.kafka安装
首先说明一下背景,kafka是通过容器运行的.类似docker run -dt \ --restart=always \ --name=kafka1 \ -h kafka1 \ -p 9092:9092 \ -p 9999:9999 \ -v /data:/kafka \ -v /opt/kafka/logs:/opt/kafka/logs \ -e KAFKA_ZOOKEEPER_CONNECT=xx.xx.xx.xx:2181\ -e KAFKA_BROKER_ID=1 \ -e KAFKA_HEAP_OPTS="-Xmx20G -Xms20G" \ -e JMX_PORT=9999 \ wurstmeister/kafka:1.0.0
问题一
JVM报错误无法分配内存:Cannot allocate memorybash-4.3# kafka-topics.shJava HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000002c0000000, 21474836480, 0) failed; error='Cannot allocate memory' (errno=12)## There is insufficient memory for the Java Runtime Environment to continue.# Native memory allocation (mmap) failed to map 21474836480 bytes for committing reserved memory.# An error report file with more information is saved as:# //hs_err_pid3290.log
这个问题的原因是因为设置了环境变量KAFKA_HEAP_OPTS="-Xmx20G -Xms20G".估计每次运行java命令都会按这个配置尝试分配20G内存吧,因为kafka主进程运行已经用去了20G,自然不可能再分配出来这么多了.
解决办法也很简单,直接去掉这个设置就好了bash-4.3# unset KAFKA_HEAP_OPTS
JMX报错
一波刚平,一波又起.再次运行命令还是报错bash-4.3# kafka-topics.shError: JMX connector server communication error: service:jmx:rmi://kafka1:9999
JMX是Java Management Extensions,它是一个Java平台的管理和监控接口。用来监控kafka运行情况的.基于前面的经验,这个问题大概率也是环境变量引起的.解决
unset JMX_PORT
然后就可以愉快的玩耍了考虑到近期会有大量ELK相关的文章出没,建了一个交流群,欢迎感兴趣的小伙伴加入交流
长按下图可以关注哟~