Docker を利用して上記の構成で
- Kafka クラスター
- Kafka UI ツール
- Kafka クライアント(Python)
を構築します.
検証した環境は以下です.
- OS: Ubuntu 22.04 on WSL2(Windows10)
- Docker: 20.10.23
- Docker Compose: v2.15.1
コンテナを複数立ち上げ, 複数のサーバーが同一ネットワークにいる環境を仮想的に作成します.
docker compose up -d
各コンテナの IP アドレスを確認します. 下記のコマンドで実行中のコンテナの IP アドレスを表示できます.
docker ps -q | xargs -n 1 docker inspect --format '{{ .Name }} {{range .NetworkSettings.Networks}} {{.IPAddress}}{{end}}' | sed 's#^/##' | sort -k 2
私の実行環境では以下の IP アドレスが割り振らます.
ほかのコンテナを既に起動していたり, docker0
の設定変更をしている場合は IP が異なるはずです.
$ docker ps -q | xargs -n 1 docker inspect --format '{{ .Name }} {{range .NetworkSettings.Networks}} {{.IPAddress}}{{end}}' | sed 's#^/##' | sort -k 2
broker-1 172.19.0.2
broker-2 172.19.0.3
broker-3 172.19.0.4
kafka-ui 172.19.0.5
producer 172.19.0.6
consumer 172.19.0.7
broker-1
, 2
, 3
の IP アドレスをkafka
, client
ディレクトリ配下の.env
ファイルに反映します.
.env
ファイルのテンプレートとして.env.template
が用意されているので, 同じディレクトリにコピーしてファイルを編集してください.
私の環境ではそれぞれの.env
ファイルを次のように編集しました.
BROKER1=172.19.0.2
BROKER2=172.19.0.3
BROKER3=172.19.0.4
これで準備完了です. 現時点で以下のディレクトリとファイル構成になっているはずです.
$ tree -a ./kafka
kafka
├── broker-1
│ ├── .env
│ ├── .env.template
│ ├── compose.kafka.yml
│ └── compose.zookeeper.yml
├── broker-2
│ ├── .env
│ ├── .env.template
│ ├── compose.kafka.yml
│ └── compose.zookeeper.yml
├── broker-3
│ ├── .env
│ ├── .env.template
│ ├── compose.kafka.yml
│ └── compose.zookeeper.yml
└── ui
├── .env
├── .env.template
├── compose.cmak.yml
...
└── compose.ui.yml
$ tree -a ./kafka
├── consumer
│ ├── .env
│ ├── .env.template
│ ├── main.py
│ └── requirements.txt
└── producer
├── .env
├── .env.template
├── main.py
└── requirements.txt
各フォルダは後ほど起動するコンテナにそれぞれ volume されています.
Apache Kafka を動作させるには Apache Zookeeper と接続する必要があります. まず, Zookeeper クラスターを構成した後, 各ホストで Kafka を起動してクラスターを構成します.
また, 以降の作業は複数のターミナルでの作業をおすすめします. 必要に応じて tmux や Windows ターミナルの split 機能を活用してください.
Zookeeper を broker-1
, 2
, 3
で起動し, クラスターを構成します.
起動順序は特に指定はありませんが, ここでは ID 順に起動していきます.
コンテナに入ります.
docker exec -it broker-1 sh
Zookeeper を起動します.
docker compose -f ./src/compose.zookeeper.yml up -d
この作業をbroker-1
, 2
, 3
の各コンテナでも実行してください.
Kafka を broker-1
, 2
, 3
で起動し, クラスターを構成します.
起動時に Zookeeper クラスターに接続しますが, Kafka も起動順序について特に指定はありません.
ここでも ID 順に起動していきます.
Kafka を起動します.
docker compose -f ./src/compose.kafka.yml up -d
この作業をbroker-1
, 2
, 3
の各コンテナでも実行してください.
UI 起動用のコンテナに入ります.
docker exec -it kafka-ui sh
利用したい UI ツールを起動してくだい.
docker compose -f ./src/compose.topics-ui.yml up -d
localhost:8000
にアクセスすると UI が表示されます.
docker compose -f ./src/compose.redpanda-console.yml up -d
localhost:8080
にアクセスすると UI が表示されます.
docker compose -f ./src/compose.ui.yml up -d
localhost:8888
アクセスすると UI が表示されます.
CMAK(Kafka Manager の後継)
docker compose -f ./src/compose.cmak.yml up -d
localhost:9000
にアクセスすると UI が表示されます.
NOTE クラスターの追加は手動またはAPIで実行する必要がある. 起動時に指定する
ZK_HOSTS
は CMAK を監視するための Zookeeper であって, Kafka クラスターではないため.
docker compose -f ./src/compose.kafdrop.yml up -d
localhost:9090
にアクセスすると UI が表示されます.
kafka-pythonを使って実際にメッセージを流してみます.
左がプロデューサー, 右がコンシューマーです. プロデューサーが送信した文字列をコンシューマーが即時受け取れていることを確認できます.
プロデューサー側のコンテナに入ります.
docker exec -it producer sh
ライブラリをインストールします.
pip install -r /src/requirements.txt
Producer を起動します. --bootstrap-servers
の部分は自身の情報で実行してください.
python /src/main.py --topic sample-topic --bootstrap-servers 172.19.0.2:9092,172.19.0.3:9092,172.19.0.4:9092
文字列を入力し, Enter で Kafka クラスターにメッセージを送信できます.
コンシューマー側のコンテナに入ります.
docker exec -it consumer sh
ライブラリをインストールします.
pip install -r /src/requirements.txt
Producer を起動します. --bootstrap-servers
の部分は自身の情報で実行してください.
python /src/main.py --topic sample-topic --bootstrap-servers 172.19.0.2:9092,172.19.0.3:9092,172.19.0.4:9092
待ち受け状態で到着したメッセージ標準出力されます.
各種 UI の起動のセクションで起動したツールで, 到着したメッセージを確認できます.
また, --group-id
でコンシューマーグループ ID を指定できます.
指定して実行すると UI ツールのコンシューマ一覧に表示されるようになります.
この画像は--group-id sample-group
とした場合です.
全てのコンテナを落として終了です.
docker compose down
お疲れ様でした!!