[转帖]解释docker单机部署kraft模式kafka集群时,尝试各种方式的网络broker全部不通而启动失败的原因,并提示常见bug关注点
现象:
controller节点与其他两个broker的通信失败。公网ip,宿主机ip,服务名,各种网络方式,都无法成功。
两点提示:
1.bug原因:因为单机内存不够用,设置了较低的 KAFKA_HEAP_OPTS 参数值128M,导致broker通信失败!
2.kafka容器启动中,增加 BITNAMI_DEBUG=true 参数,可通过 docker logs 命令查看更为细节的日志信息!
以下为 执行 docker-compose up -d 时,会成功的 docker-compose.yml文件内容:
version: "2.12"
services:
kafkas1:
image: 'bitnami/kafka:3.2.3'
container_name: kafkas1
user: root
ports:
- '9092:9092'
- '9093:9093'
environment:
- KAFKA_ENABLE_KRAFT=yes
- KAFKA_CFG_PROCESS_ROLES=broker,controller
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafkas1:9092
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT
- KAFKA_NODE_ID=1
- KAFKA_CFG_BROKER_ID=1
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafkas1:9093,2@kafkas2:9095,3@kafkas3:9097
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_HEAP_OPTS=-Xmx256m -Xms256m
- KAFKA_KRAFT_CLUSTER_ID=7es-47FeQpCKpLfsN1uPxQ
- BITNAMI_DEBUG=true
volumes:
- /usr/local/kafka/kafka1/data:/bitnami/kafka
networks:
- kafka_standalone_net
kafkas2:
image: 'bitnami/kafka:3.2.3'
container_name: kafkas2
user: root
ports:
- '9094:9094'
- '9095:9095'
environment:
- KAFKA_ENABLE_KRAFT=yes
- KAFKA_CFG_PROCESS_ROLES=broker,controller
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9094,CONTROLLER://:9095
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafkas2:9094
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT
- KAFKA_NODE_ID=2
- KAFKA_CFG_BROKER_ID=2
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafkas1:9093,2@kafkas2:9095,3@kafkas3:9097
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_HEAP_OPTS=-Xmx256m -Xms256m
- KAFKA_KRAFT_CLUSTER_ID=7es-47FeQpCKpLfsN1uPxQ
- BITNAMI_DEBUG=true
volumes:
- /usr/local/kafka/kafka2/data:/bitnami/kafka
networks:
- kafka_standalone_net
kafkas3:
image: 'bitnami/kafka:3.2.3'
container_name: kafkas3
user: root
ports:
- '9096:9096'
- '9097:9097'
environment:
- KAFKA_ENABLE_KRAFT=yes
- KAFKA_CFG_PROCESS_ROLES=broker,controller
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9096,CONTROLLER://:9097
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafkas3:9096
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT
- KAFKA_NODE_ID=3
- KAFKA_CFG_BROKER_ID=3
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafkas1:9093,2@kafkas2:9095,3@kafkas3:9097
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_HEAP_OPTS=-Xmx256m -Xms256m
- KAFKA_KRAFT_CLUSTER_ID=7es-47FeQpCKpLfsN1uPxQ
- BITNAMI_DEBUG=true
volumes:
- /usr/local/kafka/kafka3/data:/bitnami/kafka
networks:
- kafka_standalone_net
networks:
kafka_standalone_net:
driver: bridge
topic,producer,consumer,测试相关命令:
# 随便进入一个容器节点
docker exec -it kafkas1 /bin/bash
# 创建topic,1个partition,1个replication
/opt/bitnami/kafka/bin/kafka-topics.sh --bootstrap-server kafkas1:9092 --create --topic firsttopic --partitions 1 --replication-factor 1
# 查看已存在topic列表
/opt/bitnami/kafka/bin/kafka-topics.sh --bootstrap-server kafkas1:9092 --list
# 创建producer
/opt/bitnami/kafka/bin/kafka-console-producer.sh --bootstrap-server kafkas1:9092 --topic firsttopic
# 再起一个窗口,随便连接一个容器节点,创建consumer
docker exec -it kafkas1 /bin/bash
/opt/bitnami/kafka/bin/kafka-console-consumer.sh --bootstrap-server kafkas1:9092 --topic firsttopic
### 上面所有的 kafkas1,都可以随便替换为 kafkas2,kafkas3,任意节点都一样。
### 当然,端口要对应上
如上内容,其他都不变,只把 KAFKA_HEAP_OPTS 参数值的 256m 改为 128m,就会失败。
我是因为测试服务器内存实在太小,才会特意设置这个参数,算是遇到了奇葩坑。
官网没看到相关描述,整个文档搜索 heap ,就没有相关的,应该是没说明。
个人猜测,是因为内存不足,导致controller和broker通信时,网络IO链条上的某个部位内存分配函数调用失败,无法工作了。
另外,我的测试服务器是2G内存,基本算是只有docker和kafka了,设置完256m以后,创建一个topic时,partition、replication都设置了1,要不然,后面再创建producer时,又内存不足失败了。
其他常见关注点:
- KAFKA_ENABLE_KRAFT=yes参数,代表kraft模式,也就是弃用zookeeper
- 一个节点,可以为broker,可以为controller,也可以同时broker和controller
- listeners是描述本节点监听哪里(包括监听客户端的,和其他broker和controller的),advertised.listeners是告诉controller节点客户端访问我哪里
- controller.listener.names是说明controller相关通信用哪个名字的协议,inter.broker.listener.name是说明broker相关通信用哪个名字的协议。都在内网就用plaintext,都在公网就可以用ssl之类的,用来规划各个点之间通信安全的。
- KAFKA_KRAFT_CLUSTER_ID=7es-47FeQpCKpLfsN1uPxQ 是节点之间作为同一集群的标记,具体内容无所谓,你也可以用我的。
顺便想问一下:
为什么上面的docker-compose.yml中,9093,9095,9097,端口不暴露出去,也可以启动成功,正常使用???以我的理解,不应该呀!懂的教教我
[转帖]解释docker单机部署kraft模式kafka集群时,尝试各种方式的网络broker全部不通而启动失败的原因,并提示常见bug关注点的更多相关文章
- 单机简单搭建一个kafka集群(没有进行内核参数和JVM的调优)
1.JDK安装 在我的部署单节点kafka的博客里有相关的方法.(https://www.cnblogs.com/ToBeExpert/p/9789486.html )zookeeper和kafka的 ...
- Docker快速搭建Zookeeper和kafka集群
使用Docker快速搭建Zookeeper和kafka集群 镜像选择 Zookeeper和Kafka集群分别运行在不同的容器中zookeeper官方镜像,版本3.4kafka采用wurstmeiste ...
- 使用Docker快速搭建Zookeeper和kafka集群
使用Docker快速搭建Zookeeper和kafka集群 镜像选择 Zookeeper和Kafka集群分别运行在不同的容器中zookeeper官方镜像,版本3.4kafka采用wurstmeiste ...
- Docker Compose部署 nginx代理Tomcat集群
一.简介 使用Docker镜像部署Nginx代理的多个Tomcat集群: 使用Dockerfile构建nginx镜像 使用Dockerfile构建tomcat镜像 mysql镜像使用docker hu ...
- [原创]在Docker上部署mongodb分片副本集群。
一.安装docker. 请参考:http://www.cnblogs.com/hehexiaoxia/p/6150584.html 二.编写dockerfile. 1.在根目录下创建mongod的do ...
- docker下部署kafka集群(多个broker+多个zookeeper)
网上关于kafka集群的搭建,基本是单个broker和单个zookeeper,测试研究的意义不大.于是折腾了下,终于把正宗的Kafka集群搭建出来了,在折腾中遇到了很多坑,后续有时间再专门整理份搭建问 ...
- (六) Docker 部署 Redis 高可用集群 (sentinel 哨兵模式)
参考并感谢 官方文档 https://hub.docker.com/_/redis GitHub https://github.com/antirez/redis happyJared https:/ ...
- Docker部署zookeeper集群和kafka集群,实现互联
本文介绍在单机上通过docker部署zookeeper集群和kafka集群的可操作方案. 0.准备工作 创建zk目录,在该目录下创建生成zookeeper集群和kafka集群的yml文件,以及用于在该 ...
- docker 应用-4(swarm模式搭建集群)
swam模式 使用docker的swarm模式,可以很方便的搭建docker engine集群.docker engine是docker 容器的运行时环境,可以在docker engine上build ...
- kafka集群部署以及单机部署
kafka单机部署 一.环境准备 当前环境:centos7.3一台软件版本:kafka_2.12部署目录:/usr/local/kafka启动端口:9092配置文件:/usr/local/kafk ...
随机推荐
- 全网最全的华为ensp数通设备命令全集
[命令] display history-command [视图]所有视图 [参数]无 [描述] display history-command 命令用来显示当 前用户曾键入的最后 10 条命令.用户 ...
- 划重点!DWS开发的五大要点
摘要:高效使用数据库是一个合格的开发工程师的必备技能,如何使用DWS进行高效开发,提升应用效率,技术干货来喽~~~ 高效使用数据库是一个合格的开发工程师的必备技能,如何使用DWS进行高效开发,提升应用 ...
- 即使不会node.js,拖拽就可完成数据的可视化展示
摘要:node-red是一款基于Node.js的开源可视化界面开发工具,不需要掌握node.js而通过拖拽即可完成数据的可视化展示. 1.首先看一下node-red对数据的渲染效果 你可能认为,必须熟 ...
- OpenMetric与时序数据库模型之主流TSDB分析
摘要:为大家带来当下时序数据模型的主流TSDB分析及云厂商在时序数据模型方面的最新动态. 本文分享自华为云社区<[万字干货]OpenMetric与时序数据库存储模型分析(下)>,作者:敏捷 ...
- 10年经验总结,华为fellow教你如何成为一名优秀的架构师?
摘要:华为云首席架构师分享成为架构师必备的一些特质和能力. 本文分享自华为云社区<10年经验总结,华为fellow教你如何成为一名优秀的架构师?>,作者: 技术火炬手 . 在<云享人 ...
- 火山引擎 DataTester 应用故事:一个 A/B 测试,将产品 DAU 提升了数十万
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 疫情让线下的需求大量转移到线上,催生出了远程办公.网络授课.线上健身等新的生态现象.如何更好地为用户服务,提升 ...
- 聊一聊为什么我要整合Microsoft.Extensions.DependencyInjection和Castle.Core
前言 如果用到动态代理,大家可能会有几种选择,排到前列的是Autofac+Castle.AspectCore和DoraInterception, 我将从我当时研究的经历,以及我遇到的场景,为大家展示下 ...
- AI 0基础学习,数学名词解析
AI学习过程中,常见的名词解析 中位数 将数据从小到大排序,奇数列,取中间值,偶数列,中间两个值的平均,可做为销售指标 众数 一组数据中,数值出现最多的那个.反映哪款产品,销量最好 平均数 比赛中,去 ...
- MySQL 数据分组后取第一条数据
SQL SERVER数据分组后取第一条数据--PARTITION BY -- 不加 distinct(a.id) order by 会有问题 导致获取出来的数据不对 SELECT id,title,d ...
- Axure 公告通知
1.一个浅黄色的底图 (710X30) ; 2.一个喇叭小图标(Volume up) ; 3.一个动态面板. 动态面板中设置statel.state2和state3三种面板状态,这三种状态中分别放三个 ...