上篇文章ubuntu使用docker-compose搭建zookeeper集群,部署完了zookeeper集群。现在可以开始部署kafka集群。
部署
kafka.yml
version: '3.7'
networks:
docker_net:
volumes:
kafka1_data:
kafka1_sock:
kafka2_data:
kafka2_sock:
kafka3_data:
kafka3_sock:
services:
kafka1:
image: wurstmeister/kafka
restart: unless-stopped
container_name: kafka1
ports:
- "9093:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ADVERTISED_HOST_NAME: 192.168.30.174 ## 修改:宿主机IP
KAFKA_ADVERTISED_PORT: 9093 ## 修改:宿主机映射port
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.30.174:9093 ## 绑定发布订阅的端口。修改:宿主机IP
KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181,zoo2:2181,zoo3:2183"
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false" ## 关闭自动创建主题
KAFKA_DEFAULT_REPLICATION_FACTOR: 3 ## 主题复制系数
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3 ## 内部主题__consumer_offsets的复制系数
volumes:
- kafka1_sock:/var/run/docker.sock
- kafka1_data:/kafka
networks:
- docker_net
kafka2:
image: wurstmeister/kafka
restart: unless-stopped
container_name: kafka2
ports:
- "9094:9092"
environment:
KAFKA_BROKER_ID: 2
KAFKA_ADVERTISED_HOST_NAME: 192.168.30.174 ## 修改:宿主机IP
KAFKA_ADVERTISED_PORT: 9094 ## 修改:宿主机映射port
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.30.174:9094 ## 修改:宿主机IP
KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181,zoo2:2181,zoo3:2181"
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
KAFKA_DEFAULT_REPLICATION_FACTOR: 3
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
volumes:
- kafka2_sock:/var/run/docker.sock
- kafka2_data:/kafka
networks:
- docker_net
kafka3:
image: wurstmeister/kafka
restart: unless-stopped
container_name: kafka3
ports:
- "9095:9092"
environment:
KAFKA_BROKER_ID: 3
KAFKA_ADVERTISED_HOST_NAME: 192.168.30.174 ## 修改:宿主机IP
KAFKA_ADVERTISED_PORT: 9095 ## 修改:宿主机映射port
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.30.174:9095 ## 修改:宿主机IP
KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181,zoo2:2181,zoo3:2181"
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
KAFKA_DEFAULT_REPLICATION_FACTOR: 3
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
volumes:
- kafka3_sock:/var/run/docker.sock
- kafka3_data:/kafka
networks:
- docker_net
kafka-manager:
image: sheepkiller/kafka-manager:latest
restart: unless-stopped
container_name: kafka-manager
hostname: kafka-manager
ports:
- "9000:9000"
environment:
ZK_HOSTS: zoo1:2181,zoo2:2181,zoo3:2181 ## 修改:宿主机IP
TZ: CST-8
networks:
- docker_net
上面文件里,需要注意的是networks
,kafka的容器需要和zookeeper的容器处于同一个网络,才能互相访问。
执行docker-compose -f kafka.yml up
,启动集群。
执行docker-compose -f kafka.yml ps
,查看集群状态。
同时,这里还部署了一个管理kafka集群的容器kafka-manager
,通过你的主机IP:9000
可以访问web界面,管理集群和查看集群的信息。
使用
执行docker exec -it kafka1 /bin/bash
进入到容器里。
查看主题
$ cd /opt/kafka
$ ./bin/kafka-topics.sh --list --zookeeper zoo1:2181,zoo2:2181,zoo3:2181 # 查看主题列表
__consumer_offsets
创建主题
默认情况下,kafka会在下面几种情况下自动创建主题。
- 当一个生产者开始往主题写入消息
- 当一个消费者开始往主题读取消息
- 当任意一个客户端先主题发送元数据请求
生产环境中,最好通过设置auto.create.topics.enable=False
来关闭自动创建主题。
创建一个3个分区,复制系数是3,最少同步副本数是2的主题。
./bin/kafka-topics.sh --create --zookeeper zoo1:2181,zoo2:2181,zoo3:2181 --replication-factor 3 --partitions 3 min-insync-replicas 2 --topic test
可以看到主题的3个分区,分区首领均匀地分布在每台broker(因为请求都是发往分区首领,这样分布是为了负载均衡),每个分区的副本也均匀地分布在每台broker,例如分区0的副本分布在broker 0, 1, 2,这样如果其中一台broker崩溃后,剩下的broker可以进行分区首领选举,保证可用性。
发送消息
./bin/kafka-console-producer.sh --broker-list kafka1:9092,kafka2:9092,kafka3:9092 --topic test
消费消息
./bin/kafka-console-consumer.sh --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 --topic test --from-beginning