kafka-docker容器单机和集群的安装与使用
开发环境快速完成开发测试工作,也是为了快速体验和熟悉kafka工具单机版本选择高版本的大版本号,同时不依赖于zk部署,简化部署方案和使用方式。
单机
开发环境快速完成开发测试工作,也是为了快速体验和熟悉kafka工具
单机版本选择高版本的大版本号,同时不依赖于zk部署,简化部署方案和使用方式
docker-run
官方的版本apahce/kafka通过环境变量传递配置参数的,不支持配置文件server.propertiest映射进容器的方式。
使用apache官方的配置,网上bitman和第三方的一些包配置不一样。所以以下为apache/kafka的配置为准
docker pull commandcenter/apache/kafka:3.8.0
docker run -d -p 9092:9092 -p 9093:9093 \
--network=bridge \
--name=kafka \
-e "KAFKA_NODE_ID=1" \
-e "KAFKA_PROCESS_ROLES=broker,controller" \
-e "KAFKA_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093" \
-e "KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.4.158:9092" \
-e "KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER" \
-e "KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT" \
-e "KAFKA_CONTROLLER_QUORUM_VOTERS=1@127.0.0.1:9093" \
-e "KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1" \
-e "KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=1" \
-e "KAFKA_TRANSACTION_STATE_LOG_MIN_ISR=1" \
-e "KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS=0" \
-e "KAFKA_NUM_PARTITIONS=2" \
commandcenter/apache/kafka:3.8.0
注意:之前测试中,使用的教程非apache官方,不能解决暴露广播IP的问题,造成能订阅上,但收不到消息,详见其他人也遇到的坑:
https://cloud.tencent.com/developer/article/2428511
https://stackoverflow.com/questions/79182575/issues-trying-to-consume-kafka-messages-on-kubernetes-using-kraft
docker-compose
services:
kafka:
image: commandcenter/apache/kafka:3.8.0
container_name: kafka
network_mode: bridge
ports:
- 9092:9092
- 9093:9093
environment:
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.4.158:9092
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@127.0.0.1:9093
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_NUM_PARTITIONS: 2
伪集群部署
为了快速完成开发测试工作,同时服务器机器不足时,使用伪集群方式
在3.0+版本中,基于raft协议的集群元数据管理方式,已经成熟,此处推荐使用kraft协议部署,简化部署方案
以前旧的依赖Zookeeper的方案在此不再提供、研究、维护
在同一台机器部署,端口不一样
docker-compose
services:
kafka1:
image: commandcenter/apache/kafka:3.8.0
container_name: kafka1
network_mode: bridge
ports:
- 19092:9092
- 19093:9093
environment:
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.4.158:19092
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@192.168.4.158:19093,2@192.168.4.158:29093,3@192.168.4.158:39093
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_NUM_PARTITIONS: 2
kafka2:
image: commandcenter/apache/kafka:3.8.0
container_name: kafka2
network_mode: bridge
ports:
- 29092:9092
- 29093:9093
environment:
KAFKA_NODE_ID: 2
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.4.158:29092
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@192.168.4.158:19093,2@192.168.4.158:29093,3@192.168.4.158:39093
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_NUM_PARTITIONS: 2
kafka3:
image: commandcenter/apache/kafka:3.8.0
container_name: kafka3
network_mode: bridge
ports:
- 39092:9092
- 39093:9093
environment:
KAFKA_NODE_ID: 3
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.4.158:39092
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@192.168.4.158:19093,2@192.168.4.158:29093,3@192.168.4.158:39093
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_NUM_PARTITIONS: 2
集群
生产环境中,机器足够,也需要一定的性能和稳定性。选择推荐使用完整集群方案
在3.0+版本中,基于raft协议的集群元数据管理方式,已经成熟,此处推荐使用kraft协议部署,简化部署方案
以前旧的依赖Zookeeper的方案在此不再提供、研究、维护
三台服务器,每个节点都承担broker,controller角色
docker-compose
services:
kafka1:
image: commandcenter/apache/kafka:3.8.0
container_name: kafka1
network_mode: bridge
ports:
- 9092:9092
- 9093:9093
environment:
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.4.227:9092
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@192.168.4.227:9093,2@192.168.4.232:9093,3@192.168.4.233:9093
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_NUM_PARTITIONS: 2
services:
kafka2:
image: commandcenter/apache/kafka:3.8.0
container_name: kafka2
network_mode: bridge
ports:
- 9092:9092
- 9093:9093
environment:
KAFKA_NODE_ID: 2
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.4.232:9092
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@192.168.4.227:9093,2@192.168.4.232:9093,3@192.168.4.233:9093
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_NUM_PARTITIONS: 2
services:
kafka3:
image: commandcenter/apache/kafka:3.8.0
container_name: kafka3
network_mode: bridge
ports:
- 9092:9092
- 9093:9093
environment:
KAFKA_NODE_ID: 3
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.4.233:9092
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@192.168.4.227:9093,2@192.168.4.232:9093,3@192.168.4.233:9093
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_NUM_PARTITIONS: 2
管理kafka
Console管理
可进入kafka容器
docker exec -it kafka bash
cd /opt/kafka
myip='10.115.24.156'
bin/kafka-topics.sh --create --topic quickstart-events --bootstrap-server ${myip}:9092
bin/kafka-topics.sh --describe --topic quickstart-events --bootstrap-server ${myip}:9092
bin/kafka-console-producer.sh --topic quickstart-events --bootstrap-server ${myip}:9092
>输入任意字符
bin/kafka-console-consumer.sh --topic quickstart-events --from-beginning --bootstrap-server ${myip}:9092
>如果有显示上步骤的字符,说明安装成功
UI管理
使用开源UI工具管理,kafka-console-ui可视化管理,减少维护成本
安装
- 容器化安装部署-docker-run方式
docker pull commandcenter/apache/kafka-console-ui:v1.0.10
docker run -d -p 7766:7766 --name=kafka.ui commandcenter/apache/kafka-console-ui:v1.0.10
- 容器化安装部署-docker-compose方式
services:
kafkaui:
image: 'commandcenter/apache/kafka-console-ui:v1.0.10'
network_mode: 'bridge'
ports:
- '7766:7766'
container_name: 'kafka.ui'
restart: 'always'
logging:
driver: 'json-file'
options:
max-size: '500M'
max-file: '10'
访问:http://xxx:7766,默认不开户密码,如需开启密码,修改配置
管理kafka单节点或集群
运维–>切换集群—>集群切换–>添加集群信息
集群名称: 156
集群地址: 10.115.24.156:9092
属性:
request.timeout.ms=60000
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="icc_channel_2024";
添加topic
Topic–>新增
Topic名称: iccchannel
分区: 2 个分区(根据性能需求,至少给两个分区)
副本: 1个副本(如果集群,有几个节点就写几个)
属性: 无,默认
发送消息
发送消息–>在线发送
接入监控工具
同时提供exporter监控工具,并接入到grafana显示。
现场根据情况选择exporter还是使用ui管理工具,来完成基本的现场运维工作。
其他操作
增加sapi用户认证
vi config/kraft/jaas.conf
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
user_admin="icc_channel_2024";
};
vi config/kraft/server.properties
# 修改listeners和advertised
listeners=PLAINTEXT://192.168.56.103:9092,CONTROLLER://192.168.56.103:9093,SASL_PLAINTEXT://192.168.56.103:19092
advertised.listeners=PLAINTEXT://192.168.56.103:9092,SASL_PLAINTEXT://192.168.56.103:19092
# 添加mechanisms配置
sasl.enabled.mechanisms=PLAIN
执行下面这条命令启动节点:
KAFKA_OPTS=-Djava.security.auth.login.config=/usr/kafka/kafka_2.12-3.8.0/config/kraft/jaas.conf bin/kafka-server-start.sh -daemon /usr/kafka/kafka_2.12-3.8.0/config/kraft/server.properties
防火墙规则注意
在配置过程中,一定不要忘记防火墙规则,由其是容器化后的,因为使用端口映射,要特别注意
内外网隔离使用
内网是内部公司使用,外网用于对接第三方
kakfa创建容器的环境变量修改前:
KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://10.11.24.15:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
修改后:
# 端口不能一样
KAFKA_LISTENERS: INSIDE://:19092,OUTSIDE://:9092,CONTROLLER://:9093
KAFKA_ADVERTISED_LISTENERS: INSIDE://10.11.24.15:19092,OUTSIDE://39.13.24.23:9092
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME=INSIDE
解释:
listeners这里设置了2个监听器,监听了所有IP的两个端口,19092为内网kafka使用端口,9092为外部访问端口
10.11.24.15是内网服务器IP地址,39.13.24.23为公网IP地址,端口已也添加了映射:39.13.24.23->10.11.24.15,这样我们当我们通过kafka客户端连接kafka时,kafka获取kafka元数据信息,这时候kafka客户端得到的就是advertised.listeners的信息,因为这里OUTSIDE配置的外网IP,当客户端通过39.13.24.23访问kafka时,请求就会被之前配置的映射进行转发,被转发到内网ip,从而完成对kafka的访问。
listener.security.protocol.map为监听器名称和安全协议之间的映射关系集合,PLAINTEXT表示明文
inter.broker.listener.name用于broker之间通信的listener名称,如果未设置,则listener名称由 security.inter.broker.protocol 定义(security.inter.broker.protocol默认值是PLAINTEXT)
配置使用持久化存储
/////
参考文档
https://hub.docker.com/r/apache/kafka
https://kafka.apache.org/quickstart
https://github.com/apache/kafka
https://github.com/xxd763795151/kafka-console-ui
更多推荐
所有评论(0)