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