[Kafka Progressive Series 003] Docker環境でKafkaクラスターを構築する

前のセクション[KafkaAdvanced Series 002] Docker環境でのKafkaのインストールと起動およびメッセージ送信では、DockerにKafkaをインストールして起動する方法を示し、Kafkaメッセージの送受信プロセスを正常にテストしました。

実際の実稼働環境では、Kafkaはクラスターにデプロイされます。一般的なアーキテクチャーは次のとおりです。
ここに画像の説明を挿入します

Kafkaクラスターは複数のブローカーで構成されており、各ブローカーはKafkaインスタンスに対応しています。Zookeeperは、Kafkaクラスターのリーダー選出と、コンシューマーグループが変更された場合のリブランス操作を管理する責任があります。

この記事では、Docker環境でZookeeper + Kafkaクラスターを構築する方法について説明します。

この記事を通して、あなたは学びます:

  • Dockerを使用してKafkaクラスターを構築する方法。
  • Docker-composeを使用して、ワンクリックでKakfaシングルノードおよびクラスターサービスを構築する方法。
  • docker-compose down -vdocker-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: 3TestTopicに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)

おすすめ

転載: blog.csdn.net/noaman_wgs/article/details/103757791