前のセクション[KafkaAdvanced Series 002] Docker環境でのKafkaのインストールと起動およびメッセージ送信では、DockerにKafkaをインストールして起動する方法を示し、Kafkaメッセージの送受信プロセスを正常にテストしました。
実際の実稼働環境では、Kafkaはクラスターにデプロイされます。一般的なアーキテクチャーは次のとおりです。
Kafkaクラスターは複数のブローカーで構成されており、各ブローカーはKafkaインスタンスに対応しています。Zookeeperは、Kafkaクラスターのリーダー選出と、コンシューマーグループが変更された場合のリブランス操作を管理する責任があります。
この記事では、Docker環境でZookeeper + Kafkaクラスターを構築する方法について説明します。
この記事を通して、あなたは学びます:
- Dockerを使用してKafkaクラスターを構築する方法。
- Docker-composeを使用して、ワンクリックでKakfaシングルノードおよびクラスターサービスを構築する方法。
docker-compose down -v
docker-composeでトピックの初期化を作成するときに、複数のパーティションの問題を解決するために使用します。
1つは、カフカクラスターの構築です。
1.最初にZookeeperを実行します(ZKクラスターはこの記事では構築されていません):
docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper
2.それぞれ3つのKafkaノードを作成し、それらをZKに登録します。
異なるKafkaノードはポート番号を変更するだけで済みます。
Kafka0:
docker run -d --name kafka0 -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.0.104:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.0.104:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka
Kafka1:
docker run -d --name kafka1 -p 9093:9093 -e KAFKA_BROKER_ID=1 -e KAFKA_ZOOKEEPER_CONNECT=192.168.0.104:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.0.104:9093 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9093 -t wurstmeister/kafka
Kafka2:
docker run -d --name kafka2 -p 9094:9094 -e KAFKA_BROKER_ID=2 -e KAFKA_ZOOKEEPER_CONNECT=192.168.0.104:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.0.104:9094 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9094 -t wurstmeister/kafka
注:上記のノードは、独自のIPに置き換える必要があります。
3つのKafkaノードを起動した後、起動が成功したかどうかを確認します。
このようにして、Kafkaクラスターがセットアップされます。
3. Broker0ノードでテストするためのトピックを作成します。
テスト用に、ブローカー0にレプリカ3とパーティション5を使用してトピックを作成します。
(Kafkaトピックのすべてのパーティションは異なるブローカーに分散されるため、トピックの5つのパーティションは3つのブローカーに分散され、そのうち2つのブローカーは2つのパーティションを取得し、もう1つのブローカーは1つのパーティションしかありません。結論は次のようになります。以下で確認済み。)
cd /opt/kafka_2.12-2.4.0/bin
kafka-topics.sh --create --zookeeper 192.168.0.104:2181 --replication-factor 3 --partitions 5 --topic TestTopic
新しく作成されたトピック情報を表示します。
kafka-topics.sh --describe --zookeeper 192.168.0.104:2181 --topic TestTopic
上記のトピック情報はどういう意味ですか?
上記のように、「トピックの5つのパーティションは3つのブローカーに配布され、そのうち2つのブローカーは2つのパーティションを取得し、もう1つのブローカーは1つのパーティションのみを持ちます」。この文章を読むことで、上の図のトピック情報の意味を理解できるはずです。
まず、Topic: TestTopic PartitionCount: 5 ReplicationFactor: 3
TestTopicに5つのパーティションと3つのレプリカノードがあることを表します
Topic: TestTopic Partition: 0 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1
Leader:2
。TestTopicの下のパーティション0を表すリーダーレプリカはBroker.id = 2ノードにあり
Replicas
、そのレプリカノードにはBroker.id = 2、0、1(リーダーレプリカを含む)があります。およびフォロワーレプリカ(
Isr
稼働しているかどうかに関係なく)、つまり、リーダーノードのレプリカが稼働して同期されていることを意味します。Broker.id= 2、0、1
レプリケーションメカニズムに関しては、このセクションの焦点ではありません。ので、私は、この記事で詳しく説明しません。これらのあなたはもっと学ぶために行くことができます理解していない人を。
4.Kafkaクラスターの検証
前のステップでは、トピック:TestTopicがBroker0で作成され、次に他の2つのウィンドウが開かれ、Kafka1コンテナーとKafka2コンテナーにそれぞれ入力して、2つの
トピックが2つのコンテナーで同期されているかどうかを確認します。 Kafka2が同期されました。トピックが作成されました。
次に、Broker0でプロデューサーを実行し、Broker1と2でコンシューマーを実行します。
kafka-console-producer.sh --broker-list 192.168.0.104:9092 --topic TestTopic
kafka-console-consumer.sh --bootstrap-server 192.168.0.104:9093 --topic TestTopic --from-beginning
kafka-console-consumer.sh --bootstrap-server 192.168.0.104:9094 --topic TestTopic --from-beginning
次の図に示すように、
ブローカー0でメッセージを送信して、ブローカー1および2でメッセージを正常に受信できるかどうかを確認します。
次に、Docker-Composeを使用してKafkaクラスターを構築します
1. Docker-Composeとは何ですか?
Docker-Composeは、同じアプリケーションで同時に複数のコンテナーを管理するためにDockerが提供するツールです。
たとえば、DockerでKafkaクラスターを構築する上記の手順は複雑です。たとえば、最初にZKコンテナーを構築し、次にコマンドを使用して複数のKafkaコンテナーを作成し、それらを個別に起動します。Docker-Composeを使用すると、すべてのサービスを1つのコマンドで開始できます。
DockerとDocker-Composeの違いは次のとおりです。
2.Dockerの使用方法-作成
Docker-composeを使用してKafkaを作成する方法は、次のリンクにあります:https://github.com/wurstmeister/kafka-docker。(1)ディレクトリを作成します。
まず、ローカルパスにdocker-compose.ymlファイルを保存するためのディレクトリを作成し、新しいファイルを作成します:docker-compose.yml(docker-compose-kafka-single-broker.ymlを作成しました)
注:権限の問題が発生した場合は、自分で解決してください
(2)単一のブローカーノード単一のブローカーノード
を作成する方法を見て、docker-compose-kafka-single-broker.ymlファイルで以下を構成しましょう。
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
container_name: zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 192.168.1.202
KAFKA_CREATE_TOPICS: TestComposeTopic:2:1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_BROKER_ID: 1
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.1.202:9092
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
container_name: kafka01
volumes:
- /var/run/docker.sock:/var/run/docker.sock
ファイル内のパラメーターの意味:
-
バージョン:「3」は、第3世代の構成構文を意味します。
-
services:有効にするインスタンスサービスを示します。
-
zookeeper、kafka:開始されたサービスの名前。
-
image:dockerが使用する画像。
-
container_name:起動後のコンテナー名。
-
ポート:エクスポートされたポート番号。
Kafkaに関するパラメータ情報は個別に説明されています。
- KAFKA_ADVERTISED_HOST_NAME:DockerホストIP、複数設定できます。
- KAFKA_CREATE_TOPICS:起動時にデフォルトで作成されるトピック。これ
TestComposeTopic:2:1
は、作成されるトピックがTestComposeTopic、2つのパーティション、および1つのコピーであることを意味します。 - KAFKA_ZOOKEEPER_CONNECT:ZKに接続します。
- KAFKA_BROKER_ID:ブローカーID;
- KAFKA_ADVERTISED_LISTENERSおよびKAFKA_LISTENERSが存在する必要があります。存在しない場合、正しく機能しない可能性があります。
構成が完了したら、コマンドdocker-compose -f docker-compose-kafka-single-broker.yml up
を使用して単一ノードのKafkaを起動します。
開始された単一のブローカー情報とトピック情報を表示します。
メッセージの送受信の確認:
(3)ブローカークラスター
上記では、docker-composeを使用してKafkaシングルノードブローカーを正常に構築しています。次に、Kafkaクラスターを構築する方法を見てみましょう。
まず、ディレクトリに新しいファイルを作成します:docker-compose-kafka-single-broker.yml、構成内容は次のとおりです。
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
container_name: zookeeper
ports:
- "2181:2181"
kafka1:
image: wurstmeister/kafka
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 192.168.1.202
KAFKA_CREATE_TOPICS: TestComposeTopic:4:3
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_BROKER_ID: 1
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.1.202:9092
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
container_name: kafka01
volumes:
- /var/run/docker.sock:/var/run/docker.sock
kafka2:
image: wurstmeister/kafka
ports:
- "9093:9093"
environment:
KAFKA_ADVERTISED_HOST_NAME: 192.168.1.202
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_BROKER_ID: 2
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.1.202:9093
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9093
container_name: kafka02
volumes:
- /var/run/docker.sock:/var/run/docker.sock
kafka3:
image: wurstmeister/kafka
ports:
- "9094:9094"
environment:
KAFKA_ADVERTISED_HOST_NAME: 192.168.1.202
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_BROKER_ID: 3
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.1.202:9094
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9094
container_name: kafka03
volumes:
- /var/run/docker.sock:/var/run/docker.sock
docker-compose -f docker-compose-kafka-cluster.yml up
スクリプトを実行します:、
起動が成功したことがわかります。
トピック情報を表示するには、3つのコンテナを入力してください
メッセージ送信の確認:
メッセージの送信と受信の検証のために、プロデューサーはブローカー0で開始され、コンシューマーはブローカー1と2でそれぞれ開始されます。
3.困難で雑多な病気の記録
1. KAFKA_CREATE_TOPICSパラメーターを使用して、複数のトピックパーティションを作成することはできません
構成ファイルのパラメーターは、KAFKA_CREATE_TOPICS: TestComposeTopic:2:1
トピックを作成することを目的としています:TestComposeTopic、2パーティション、1コピー、ただし実際の実行後、トピックは正常に実行できますが、パーティションは1のままです。
Baiduは同様の問題の数ページをめくりましたが、解決策が見つかりませんでした(ここでは、Baiduは実際に問題を解決したときに本当に悪かったです)、最初のページで問題の解決策を見つけるためにGoogleで検索しました:Can ' KAFKA_CREATE_TOPICS#490を使用して複数のパーティションでトピックを作成すると、誰かが以前に遭遇したようです。誰かが以下の解決策を投稿docker-compose down -v
しており、それを使用して解決できます。
だから、私はすぐに試しました:
docker-compose.ymlが配置されているディレクトリを入力します。デフォルトのdocker-compose.ymlファイルを使用していないため、パラメータ-fを追加して、作成したファイルを指定する必要があります。
cd /docker/config/kafka
### 执行该命令, 解决只能创建一个分区的问题
docker-compose -f docker-compose-kafka-single-broker.yml down -v
### 重新启动
docker-compose -f docker-compose-kafka-single-broker.yml up
docker-compose.ymlを再実行した後、トピック情報を再度確認し、2つのパーティションが正常に作成されていることを確認します。
docker-compose down -v
コマンドの意味については次のとおりです。
コンテナを停止し、
によって作成されたコンテナ、ネットワーク、ボリューム、およびイメージを削除しup
ます。デフォルトでは、削除されるものは次のとおりです。
- 作成ファイルで定義されたサービスのコンテナ
networks
作成ファイルのセクションで定義されたネットワーク- デフォルトネットワーク(使用されている場合)
として定義されたネットワークとボリューム
external
は削除されません。
なぜこのコマンドを使用するのですか?docker-compose
パーティションを作成する前に、デフォルトで1つのパーティションと1つのコピーを作成するトピックを使用していることが原因である可能性があります。私もこの問題について質問し、答えを得たいと思っていました。理解している学生がいれば、記事の下にコメントして教えてください。とても感謝しています。
(リンク:https://github.com/wurstmeister/kafka-docker/issues/490)