概要
Kafkaに魅せられて、とりあえず手元のマシンで動かしてみましょうか、、、と、インフラしか知らないSEがMacBookProを新たに購入し、Qiita等にアップされている諸先輩方の記事を参考にさせていただき、動作確認したまでの手順を7回に分け記載しています。
なお、Kafkaの概要につきましたは、こちらの記事 を参照ください。
今回の目指すべく Kafka の全体構成は下図のようになります。
これを目指し、第1回は zookeeper と broker と Producer/Comsumer を稼働させるための cli をDockerコンテナで稼働させてみます。
なお、Dockerについてはこの書籍を参考にさせていただきました。
実行環境
macOS Big Sur 11.1
Docker version 20.10.2, build 2291f61
Python 3.8.3
ネットワークの定義
まずは、本件のために使用するネットワークを定義します。
もちろん全コンテナは1セグメントで稼働させます。
$ docker network create iot_network
7a00a485b89f83d664fef537f21e7df16ba34f14dc2731bc8686d2b0c55c1fe3
docker-composeファイル
zookeeper と broker と cli コンテナを定義した docker-compose.yml は以下となります。
使用するネットワーク(上記で作成したもの)も定義しています。
version: "3"
services:
zookeeper:
image: confluentinc/cp-zookeeper:5.5.1
hostname: zookeeper
container_name: zookeeper
ports:
- "32181:32181"
environment:
ZOOKEEPER_CLIENT_PORT: 32181
ZOOKEEPER_TICK_TIME: 2000
broker:
image: confluentinc/cp-kafka:5.5.1
hostname: broker
container_name: broker
depends_on:
- zookeeper
ports:
- "9092:9092"
- "29092:29092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: "zookeeper:32181"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:29092,PLAINTEXT_HOST://localhost:9092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
CONFLUENT_SUPPORT_METRICS_ENABLE: "false"
cli:
image: confluentinc/cp-kafka:5.5.1
hostname: cli
container_name: cli
depends_on:
- broker
entrypoint: /bin/sh
tty: true
networks:
default:
external:
name: iot_network
コンテナの作成と確認
定義したコンテナをビルドして起動させます。
$ docker-compose up -d
前略
Creating zookeeper ... done
Creating broker ... done
Creating cli ... done
起動しているコンテナを確認します。
$ docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------------------------------
broker /etc/confluent/docker/run Up 0.0.0.0:29092->29092/tcp, 0.0.0.0:9092->9092/tcp
cli /bin/sh Up 9092/tcp
zookeeper /etc/confluent/docker/run Up 2181/tcp, 2888/tcp, 0.0.0.0:32181->32181/tcp, 3888/tcp
ネットワーク情報の確認
各コンテナにアサインされたネットワーク情報についても確認します。
各コンテナ間の通信はコンテナ名で実施されるため、IPアドレスを意識する必要はありません。
$ docker network inspect iot_network
[
{
"Name": "iot_network",
"Id": "7a00a485b89f83d664fef537f21e7df16ba34f14dc2731bc8686d2b0c55c1fe3",
"Created": "2021-02-03T15:58:22.6410234Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.21.0.0/16",
"Gateway": "172.21.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"192c2091a0cbad678edfd6165b8392be9e6e17b7b4eb74179303c366d6efa301": {
"Name": "broker",
"EndpointID": "ace1688ef02c686264325019143afef994078e53501586ebf7859c4a5b8b4ef9",
"MacAddress": "02:42:ac:15:00:03",
"IPv4Address": "172.21.0.3/16",
"IPv6Address": ""
},
"79634a9c332300d558235170e19f9ede4528d4566c95eceaf0adc31b1ab9e441": {
"Name": "zookeeper",
"EndpointID": "fcdcd02386f9f972d6a93e8d7b2820f3df8039f0749ff2c9981ca3e7754322f0",
"MacAddress": "02:42:ac:15:00:02",
"IPv4Address": "172.21.0.2/16",
"IPv6Address": ""
},
"dd58a95c5904c456e728e9fd881b50e89b1138a23424378cedde87d86c95bba0": {
"Name": "cli",
"EndpointID": "690e00daf32594623a0068a86fbbe5be90a53f42f1901606d59f035ff6c43b1c",
"MacAddress": "02:42:ac:15:00:04",
"IPv4Address": "172.21.0.4/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
これで、Kafka基本コンポーネントをローカルのDocker環境で稼働させることを確認しました。
次回について
次回(第2回)は Producerからメッセージを送り、Consumerでそのメッセージの受け取りを確認します。
第1回:Kafka基本コンポーネントをローカルのDocker環境で稼働させる
第2回:Kafkaの Producerから送信されたメッセージが Broker を経由して Consumer で受け取れることの確認
第3回:Producer上のPythonプログラムで生成したデータを Broker を経由して Consumer で受け取れることの確認
第4回:Producer上での生成データが topic-01 を経由して KSQL(topic01_stream1 → topic01_stream2) でストリーミング抽出処理されたことの確認
第5回:Producer上での生成データが topic-01 → Ksql → topic-11 を経由して Consumer 上のPythonプログラムで受け取れることの確認
第6回:Producer上での生成データが topic-01 → Ksql → topic-11 を経由して Consumer 上のPythonプログラムによってS3に書き込めることの確認
第7回:2つのProducerコンテナ上で生成したそれぞれのデータが topic-01 → Ksql → topic-11 を経由して Consumer 上のPythonプログラムで受け取れることの確認
参考情報
以下の情報を参考にさせていただきました。感謝申し上げます。
Kafka の Docker のチュートリアル
Kafka からKSQLまで Dockerで簡単環境構築