kafka学习笔记01-docker搭建kafka集群
Docker部署kafka集群
前提: 安装docker和docker-compose
下载镜像
在dockerhub上搜索kafka, 发现并没有官方镜像, star数最多的wurstmeister/kafka, 他的描述信息就是支持多台kafka集群的, 这里我们就使用这个镜像
同时kafka运行是需要依赖于zookeeper的, 所以也需要下载zookeeper镜像, 搜索发现zookpeer有官方镜像, 也有wurstmeister/zookeeper的镜像, 这里为了配合wurstmeister/kafka, 于是下载的镜像还是wurstmeister/zookeeper
docker pull wurstmeister/kafka
docker pull wurstmeister/zookeeper
来到wurstmeister/kafka的GitHub地址:https://github.com/wurstmeister/kafka-docker, 可以查看使用文档, 这里我们也需要将GitHub上这些文件clone下来, 因为后面命令中会使用到
git clone https://github.com/wurstmeister/kafka-docker.git
启动kafka容器
cd进入到本地clone kafka-docker后的文件夹中, 修改docker-compose.yml
文件, 将里面的KAFKA_ADVERTISED_HOST_NAME
的IP改为自己本机的IP
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
build: .
ports:
- "9092"
environment:
DOCKER_API_VERSION: 1.22
KAFKA_ADVERTISED_HOST_NAME: 10.0.72.47
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
volumes:
- /var/run/docker.sock:/var/run/docker.sock
执行命令启动zookeeper和kafka
docker-compose up -d
此时会启动一个zookeeper和kafka容器, 启动kafka时会build当前文件路径下的Dockerfile
我们运行下面的命令再新增两个容器, 总共启动了三个kafka, 启动时会自动给每个kafka broker分配不同的broker_id, 三个容器名依次为:
kafka-docker_kafka_1 kafka-docker_kafka_2 kafka-docker_kafka_3
docker-compose scale kafka=3
容器间的通信
查看docker的network信息, 可以看到名为docker_compose_default
的网络
# docker network ls
28b5cd20af3c docker_compose_default bridge local
查看网络详情, 可以看到网络的网段, 以及网络中的容器情况, 由于是自定义的网络, 所以各个容器间可以直接通过容器名代替ip进行访问
# docker network inspect kafka-docker_default
[
{
"Name": "kafka-docker_default",
"Driver": "bridge",
"Containers": {
"389f0bd818e3822260a6e3e8ad3843077d447ae3557b461ef9128836cc75091a": {
"Name": "kafka-docker_zookeeper_1",
"IPv4Address": "172.20.0.3/16",
},
"6e5489640e5e33b242b235a8fc6c30f8898d9901c851afaa4902dc1628fac9ab": {
"Name": "kafka-docker_kafka_2",
"IPv4Address": "172.20.0.5/16",
},
"d280e45a5c4af777bff5355d0c6d924c7a79ef29915753ec2a0f2ba68b9cbddc": {
"Name": "kafka-docker_kafka_1",
"IPv4Address": "172.20.0.2/16",
},
"f6797c1be92bfc0ad2001626b66697c69b60f729cc28d203c1c07b99e537271e": {
"Name": "kafka-docker_kafka_3",
"IPv4Address": "172.20.0.4/16",
}
},
}
]
执行命令操作kafka
进入kafka容器内部
docker exec -it kafka-docker_kafka_1 bash
kafka安装在容器的/opt/kafka
路径下
bash-5.1# cd opt/kafka
bash-5.1# ls
LICENSE NOTICE bin config libs licenses logs site-docs
查看kafka版本
kafka没有提供直接查看版本信息的命令, 需要进入到kafka的安装目录的libs
路径下, 可以看到很多类似kafka_2.13-2.7.1-javadoc.jar
这样的文件, 可以看出kafka版本, 其中前面的2.13
是其开发语言Scala的版本,2.7.1
是Kafka的版本
创建topic
cd到kafka安装目录/opt/kafka
, 创建名为hello的topic
# bin/kafka-topics.sh --create --topic hello --partitions 2 --replication-factor 3 --bootstrap-server kafka-docker_kafka_1:9092
--partitions
: 必输, 分区数
--replication-factor
: 必输, 副本数
--bootstrap-server
: 必输, kafka服务链接, 由于这里是集群, 所以只需要链接其中一个服务即可, 在之前版本使用的是--zookeeper
参数, 表示数据会存放在zookeeper
服务中, 现在推荐使用--bootstrap-server
, 将数据存放在kafka
服务中
创建topic之后, 进入/kafka/kafka-logs-xxxxx
目录, 可以看到两个partition数据, hello-0和hello-1, 在另外两个容器中也同样有这两个partition文件夹, 因为副本数为3
# cd kafka-logs-dfd7d38517ef/
# ls
cleaner-offset-checkpoint meta.properties
hello-0 recovery-point-offset-checkpoint
hello-1 replication-offset-checkpoint
查看topic列表
# bin/kafka-topics.sh --list --bootstrap-server kafka-docker_kafka_1:9092
查看topic详情
# bin/kafka-topics.sh --describe --topic hello --bootstrap-server kafka-docker_kafka_1:9092
Topic: hello PartitionCount: 2 ReplicationFactor: 3 Configs: segment.bytes=1073741824
Topic: hello Partition: 0 Leader: none Replicas: 1003,1001,1002 Isr: 1003
Topic: hello Partition: 1 Leader: none Replicas: 1002,1003,1001 Isr: 1003
启动生产者
# bin/kafka-console-producer.sh --topic hello --bootstrap-server kafka-docker_kafka_1:9092
>
启动消费者
# bin/kafka-console-consumer.sh --topic hello --bootstrap-server kafka-docker_kafka_1:9092
在生产者的shell中输入消息, 可以在消费者中接收到消息