1. 程式人生 > 其它 >kafka學習筆記01-docker搭建kafka叢集

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