记录一下Docker部署单节点Kafka与部署可视化界面KafkaMap容器
目录
6、-e ALLOW_PLAINTEXT_LISTENER=yes
7、-e KAFKA_CFG_PROCESS_ROLES=broker,controller
9、-e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
10、 -e KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
11、 -e KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
12、-e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://10.10.10.10:9092
13、-e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka-server:9093
14、-e KAFKA_CLUSTER_ID=$(uuidgen)
15、 -e KAFKA_HEAP_OPTS="-Xms512m -Xmx512m"
16、 -v /home/username/kafka-data:/bitnami/kafka/data
一、Kafka早已经弃用了ZooKeeper
这个是Kafka的官网:Apache Kafka
Kafka 是从 2.8 版本开始引入 KRaft 作为实验性特性的。在 3.3 版本时 KRaft 可用于生产环境。到 3.5 版本 Zookeeper 模式被标记为弃用。Kafka 4.0 版本则彻底移除 Zookeeper。
KRaft是有Raft协议演变而来,它的性能和稳定性比ZooKeeper更高,降低了维护成本。并且,ZooKeeper的运行需要JAVA环境的支持,主要是JDK。
当前,还有大量的博文,记录使用ZooKeeper作为Kafka的数据存储,这非常离谱,Kafka3.3版本发布于2022年9月,即:2022年9月Kafka已经第一次可以在生成环境移除ZooKeeper。就像JAVA一样,当前已经来到了JAVA22,你还在说新项目要使用JAVA8,这简直是。。。 无言以对
二、Docker部署单机版Kafka
直接粘贴Docker命令:
注意:复制命令以后,你要修改一下 -v 目录挂载的本地位置,即:/home/username/kafka-data username改为自己的用户名。容器名字可以不用改,这个测试环境可以随意。
这里我使用的是 bitnami公司提供的镜像。不同来源的镜像,在参数设定上可能略有差异,这些参数设定的名称都是各个镜像打包人自己定义的,会被设定进容器的配置文件中去。比如说下面的 第13 配置项(环境变量):
docker run -d --name kafka-server \
--network kafka-stand \
--restart unless-stopped \
-p 9092:9092 \
-p 9093:9093 \
-e ALLOW_PLAINTEXT_LISTENER=yes \
-e KAFKA_CFG_PROCESS_ROLES=broker,controller \
-e KAFKA_CFG_NODE_ID=1 \
-e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT \
-e KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER \
-e KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \
-e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://10.213.22.207:9092 \
-e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka-server:9093 \
-e KAFKA_CLUSTER_ID=$(uuidgen) \
-e KAFKA_HEAP_OPTS="-Xms512m -Xmx512m" \
-v /home/username/kafka-data:/bitnami/kafka/data \
bitnami/kafka:3.8.0
完全复制命令即可。Docker这种将命令分为多行,每一行的结尾都有 \ ,并且它前面还有一个空格,它的后面不能有空格,否则执行命令报错!!
下面逐行解释命令:
-p表示端口映射,-e表示设置Kafka环境变量。
1、--name kafka-server
表示容器的名称是 kafak-server,可以按照具体情况做更改
2、--network kafka-stand
表示该Kafka容器处于名字叫做 kafka-stand网络下。Docker 中的 “网络” 是一种虚拟网络环境,用于实现容器之间、容器与主机之间的网络通信隔离与管理。处于同一网络的容器可以通过容器名(或别名)直接通信,无需依赖主机的 IP 地址。例如,若容器名 A 和容器名 B 都加入了my-network网络,则 A 可以直接通过 ping B
或访问 B:端口
与 B 通信,无需手动配置端口映射或 IP 地址。不同网络中的容器默认无法通信,实现了网络层面的隔离。默认网络模式是:容器连接到 Docker 默认的桥接网络。
3、--restart unless-stopped
表示容器意外停止后,自动重启,不包含使用docker stop命令手动停止容器。比较常用的一个配置。
还有以下其它三种重启策略(即使容器已经运行起来了,我们也可以停止容器-》更新停止后的重启方式进行修改这一策略):
假如你的Linux关机,然后重启以后,你使用docker ps查看运行起来的容器,如果有一些容器没有自动跑起来,需要手动使用 docker run <容器名称> 来启动容器,它很有可能就是没有配置 --restart unless-stopped 这一个配置项。
4、-p 9092:9092
表示将Linux主机的9092端口与kafka-server容器的9092端口做映射。前者表示宿主机端口,后者表示容器接口。(容器其实就是一个阉割版的Linux) 9092端口是Kafka开放给消息的默认端口。在项目中的消费者和生产者,都需要配置 kafka的IP+9092端口。
如下图所示:(红色部分表示宿主机IP地址,因为已经做了端口映射,9092其实指的是宿主机映射容器9092的对应端口)
5、-p 9093:9093
同上。9093端口通常用于内部 broker 间通信(或安全连接)
6、-e ALLOW_PLAINTEXT_LISTENER=yes
指允许监听器明文传输。我们这里是测试搭建单机版Kafka,非生产环境,并且使用的是轻量级Bitnami公司提供的镜像,因此使用明文。生产环境,为了保证消息不被窃听,会使用SSL作为加密认证方式。 kafka镜像的来源主要有三个公司,适用于不同的场景需求,详细可以阅读下面的博客:
docker镜像wurstmeister/kafka、confluentinc/cp-kafka 和 bitnami/kafka_bitnami wurstmeister kafka-CSDN博客
7、-e KAFKA_CFG_PROCESS_ROLES=broker,controller
这一配置主要与 Kafka 2.8.0 及以上版本引入的KRaft 模式(无 ZooKeeper 模式)相关。
8、-e KAFKA_CFG_NODE_ID=1
主要用于 KRaft 模式(无 ZooKeeper 模式) 中标识当前节点的唯一 ID。这个 ID 在整个 Kafka 集群中必须唯一,用于标识节点身份。此ID必须设置,一经设置不建议更改。核心作用可以概括如下:
9、-e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
上面这个是KRaft模式中必须的配置。用于定义监听器(listener)与安全协议的映射关系。
首先是Kafka中监听器的概念:
此配置的核心作用如下:
这个配置与下面的 10 是必须对应的,因为下面的 10号配置,定义了监听器的名称。
10、 -e KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
用于指定Kafka控制器使用的监听器名称。这个名称需要在上面的 配置9 中使用到。
11、 -e KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
定义Kafka服务监听的网络端口,协议,及对应的监听器名称。
配置值的格式是:<监听器名称>://<绑定地址>:<端口>
有多个配置值的,使用英文逗号分隔。上面的两个配置值省略了绑定地址,9092端口那个说明:“绑定当前容器的所有网络接口”(即允许来自容器外部的连接)。项目的消费者和生产者都需要使用9092端口作为消息的发送和拉取。
9093端口的配置:绑定容器所有网络接口,监听 9093 端口(专门用于内部控制器通信的端口,与客户端端口分开)。
做一个总结:
9092端口其实应该设置IP地址的,在生产环境中,不能让任意的项目都可以向该Kafka发消息及拉取消息。
12、-e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://10.10.10.10:9092
这个是必须配置的,否则客户端无法生产消息到Kafka,消费者无法拉取到消息。
用于告知客户端(消息的消费者和生产者)如何正确的连接到Kafka服务,解决容器内外网络地址不一致的问题。
直译为中文:Kafka配置的广告监听器。
后面的配置值格式是: <客户端监听器名称>://<Kafka容器实际可访问的IP地址,通常是宿主机IP>:<客户端监听器监听的端口>
这里使用到了客户端监听器的名称,与 上面的 配置9,配置10,配置11 是对应的,都使用到了监听器的名称和各自对应的端口。
13、-e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka-server:9093
用于指定集群在KRaft模式下的 控制器仲裁投票者列表。
是Kafka集群在KRaft模式下的必须配置,否则集群无法启动。ZooKeeper模式下绝对不能有此配置。
具体解释该配置值的格式与意义:
这里的 kafka-server就是我们在 配置项1 配置的容器名。
下面解释一下控制器仲裁组以及控制器的作用:
14、-e KAFKA_CLUSTER_ID=$(uuidgen)
设定Kafka集群的唯一ID。 $(uuidgen)表示使用UUID产生一个全球唯一ID。
在KRaft模式下必须配置,同一个集群下的多个节点,该配置的集群ID必须保持一致。
作用如下:
15、 -e KAFKA_HEAP_OPTS="-Xms512m -Xmx512m"
Kafka是由JAVA开发的程序,依赖于JAVA环境。
上面的配置中包含两个参数,分别表示:堆内存的初始大小和最大大小,都是512兆字节。
下面是AI给出的Kafka对JAVA堆内存大小的配置经验:
16、 -v /home/username/kafka-data:/bitnami/kafka/data
这个是进行宿主机文件夹和容器文件夹进行映射的命令。
强烈建议:所有的容器都要直接进行文件夹映射,尽量不使用数据卷挂载。
前者是宿主机目录路径,后者是容器内部路径。
(1)、要保证前者的宿主机目录存在,并且容器有写入读取权限。
(2)、后者的容器数据存储目录,在不同的镜像下可能不同。这需要具体查一下。
17、 bitnami/kafka:3.8.0
这个就是容器的来源,名字和版本
三、Docker部署单机版kafak-map可视化UI
开源地址:kafka-map: 一个美观简洁且强大的kafka web管理工具。
也是JAVA开发的程序。
这是一个两年前国人开发的一个开源项目。可以可视化查看Kafka集群的主题,分区等。
下面是官方提供的Docker容器安装方式:
然后直接访问 http://宿主机IP地址:8080 即可。
注意输入 admin用户名和 密码admin,这个是在docker 命令里面配置好的。
登录成功以后,需要配置一下可视化界面显示的Kafka地址,官方给出了如下步骤(因为这是一个单独的容器,没有加入到Kafka网络,不可能说启动容器以后,自动就监控所在网络中的Kafka集群):
这个可视化界面有个缺点:它上面的数字是可以点击的,根本就不像是一个功能按钮!!
如下所示,图中划红线的数字,是可以点击进去查看具体的主题名字的: