Skip to content

atsuyaide/kafka-training

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Docker を活用して複数マシンに Kafka クラスターを構築する方法

概要

全体像

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 されています.

Kafka クラスターを作成

Apache Kafka を動作させるには Apache Zookeeper と接続する必要があります. まず, Zookeeper クラスターを構成した後, 各ホストで Kafka を起動してクラスターを構成します.

また, 以降の作業は複数のターミナルでの作業をおすすめします. 必要に応じて tmux や Windows ターミナルの split 機能を活用してください.

Zookeeper クラスターの構成

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の各コンテナでも実行してください.

Kafak を起動

Kafka を broker-1, 2, 3で起動し, クラスターを構成します. 起動時に Zookeeper クラスターに接続しますが, Kafka も起動順序について特に指定はありません. ここでも ID 順に起動していきます.

Kafka を起動します.

docker compose -f ./src/compose.kafka.yml up -d

この作業をbroker-1, 2, 3の各コンテナでも実行してください.

各種 UI の起動

UI 起動用のコンテナに入ります.

docker exec -it kafka-ui sh

利用したい UI ツールを起動してくだい.

docker compose -f ./src/compose.topics-ui.yml up -d

localhost:8000にアクセスすると UI が表示されます.

Kafka Topics UIのトップ画面

docker compose -f ./src/compose.redpanda-console.yml up -d

localhost:8080にアクセスすると UI が表示されます.

Redpanda Consoleのトップ画面

docker compose -f ./src/compose.ui.yml up -d

localhost:8888アクセスすると UI が表示されます.

Kafka UIのトップ画面

CMAK(Kafka Manager の後継)

docker compose -f ./src/compose.cmak.yml up -d

localhost:9000にアクセスすると UI が表示されます.

CMAKのトップ画面

NOTE クラスターの追加は手動またはAPIで実行する必要がある. 起動時に指定するZK_HOSTSは CMAK を監視するための Zookeeper であって, Kafka クラスターではないため.

docker compose -f ./src/compose.kafdrop.yml up -d

localhost:9090にアクセスすると UI が表示されます.

Kafdropのトップ画面

クライアントからデータを流す

kafka-pythonを使って実際にメッセージを流してみます.

Pythonクライアントを使ったデモ

左がプロデューサー, 右がコンシューマーです. プロデューサーが送信した文字列をコンシューマーが即時受け取れていることを確認できます.

Producer

プロデューサー側のコンテナに入ります.

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 クラスターにメッセージを送信できます.

Consumer

コンシューマー側のコンテナに入ります.

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 ツールのコンシューマ一覧に表示されるようになります.

Kafka UIのConsumers画面

この画像は--group-id sample-groupとした場合です.

最後に

全てのコンテナを落として終了です.

docker compose down

お疲れ様でした!!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages