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中输入消息, 可以在消费者中接收到消息

image-20211001140850601

posted @ 2021-10-14 20:57  Alex-GCX  阅读(522)  评论(0编辑  收藏  举报