1. 概要

Dockerは、ソフトウェア業界でアプリケーションの作成、パッケージ化、および展開に使用される最も人気のあるコンテナエンジンの1つです。

このチュートリアルでは、Dockerを使用して Apache KafkaKafkaセットアップを行う方法を学習します。

2. シングルノードセットアップ

シングルノードKafkaブローカーのセットアップは、ローカル開発のニーズのほとんどを満たすので、この簡単なセットアップを学ぶことから始めましょう。

2.1. docker-compose.yml構成

Apache Kafka Kafkaサーバーを起動するには、最初にZookeeperサーバーを起動する必要があります。

この依存関係をdocker-compose.ymlファイル構成できます。これにより、Zookeeperサーバーは常にKafkaサーバーの前で起動し、その後で停止します。

zookeeperkafkaの2つのサービスを使用して、単純なdocker-compose.ymlファイルを作成しましょう。

version: '2'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
    ports:
      - 22181:2181
  
  kafka:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    ports:
      - 29092:29092
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

このセットアップでは、Zookeeperサーバーはport = 2181 で、同じコンテナーセットアップ内で定義されているkafkaサービスをリッスンしています。 ただし、ホストで実行されているクライアントの場合、ポート22181で公開されます。

同様に、kafkaサービスはポート29092を介してホストアプリケーションに公開されますが、実際には、KAFKA_ADVERTISED_LISTENERSプロパティによって構成されたコンテナ環境内のポート9092でアドバタイズされます。 。

2.2. Kafkaサーバーを起動します

docker-compose コマンドを使用してコンテナーを起動し、Kafkaサーバーを起動しましょう。

$ docker-compose up -d
Creating network "kafka_default" with the default driver
Creating kafka_zookeeper_1 ... done
Creating kafka_kafka_1     ... done

次に、 ncコマンドを使用して、両方のサーバーがそれぞれのポートでリッスンしていることを確認しましょう。

$ nc -z localhost 22181
Connection to localhost port 22181 [tcp/*] succeeded!
$ nc -z localhost 29092
Connection to localhost port 29092 [tcp/*] succeeded!

さらに、コンテナの起動中に詳細ログをチェックして、Kafkaサーバーが起動していることを確認することもできます。

$ docker-compose logs kafka | grep -i started
kafka_1      | [2021-04-10 22:57:40,413] DEBUG [ReplicaStateMachine controllerId=1] Started replica state machine with initial state -> HashMap() (kafka.controller.ZkReplicaStateMachine)
kafka_1      | [2021-04-10 22:57:40,418] DEBUG [PartitionStateMachine controllerId=1] Started partition state machine with initial state -> HashMap() (kafka.controller.ZkPartitionStateMachine)
kafka_1      | [2021-04-10 22:57:40,447] INFO [SocketServer brokerId=1] Started data-plane acceptor and processor(s) for endpoint : ListenerName(PLAINTEXT) (kafka.network.SocketServer)
kafka_1      | [2021-04-10 22:57:40,448] INFO [SocketServer brokerId=1] Started socket server acceptors and processors (kafka.network.SocketServer)
kafka_1      | [2021-04-10 22:57:40,458] INFO [KafkaServer id=1] started (kafka.server.KafkaServer)

これで、Kafkaセットアップを使用する準備が整いました。

2.3. Kafkaツールを使用した接続

最後に、 KafkaツールGUIユーティリティを使用して、新しく作成したKafkaサーバーとの接続を確立します。後で、この設定を視覚化します。

ホストマシンのポート29092でリッスンしているKafkaサーバーに接続するには、Bootstrapserversプロパティを使用する必要があることに注意する必要があります。

最後に、左側のサイドバーで接続を視覚化できるはずです。

そのため、TopicsとConsumersのエントリは、新しい設定であるため空です。 トピックが作成されると、パーティション間でデータを視覚化できるようになります。 さらに、Kafkaサーバーに接続しているアクティブなコンシューマーがいる場合は、それらの詳細も表示できます。

3. Kafkaクラスターのセットアップ

より安定した環境を実現するには、回復力のあるセットアップが必要です。 docker-compose.ymlファイルを拡張して、マルチノードKafkaクラスターセットアップを作成しましょう。

3.1. docker-compose.yml構成

Apache Kafkaのクラスター設定には、ZookeeperサーバーとKafkaサーバーの両方に冗長性が必要です。

それでは、ZookeeperサービスとKafkaサービス用にそれぞれもう1つのノードの構成を追加しましょう。

---
version: '2'
services:
  zookeeper-1:
    image: confluentinc/cp-zookeeper:latest
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
    ports:
      - 22181:2181

  zookeeper-2:
    image: confluentinc/cp-zookeeper:latest
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
    ports:
      - 32181:2181
  
  kafka-1:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper-1
      - zookeeper-2

    ports:
      - 29092:29092
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-1:9092,PLAINTEXT_HOST://localhost:29092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
  kafka-2:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper-1
      - zookeeper-2
    ports:
      - 39092:39092
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-2:9092,PLAINTEXT_HOST://localhost:39092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

サービス名とKAFKA_BROKER_IDがサービス全体で一意であることを確認する必要があります

さらに、各サービスはホストマシンに一意のポートを公開する必要があります。 zookeeper-1およびzookeeper-2はポート2181でリッスンしていますが]、それぞれポート2218132181を介してホストに公開しています。 同じロジックがkafka-1およびkafka-2 サービスにも適用され、ポート29092およびでリッスンします。それぞれ39092

3.2. Kafkaクラスターを開始します

docker-compose コマンドを使用して、クラスターを起動してみましょう。

$ docker-compose up -d
Creating network "kafka_default" with the default driver
Creating kafka_zookeeper-1_1 ... done
Creating kafka_zookeeper-2_1 ... done
Creating kafka_kafka-2_1     ... done
Creating kafka_kafka-1_1     ... done

クラスタが起動したら、Kafkaツールを使用して、Kafkaサーバーとそれぞれのポートにカンマ区切りの値を指定してクラスタに接続しましょう。

最後に、クラスターで使用可能な複数のブローカーノードを見てみましょう。

4. 結論

この記事では、 Dockerテクノロジーを使用して、ApacheKafkaのシングルノードおよびマルチノードのセットアップを作成しました。

また、Kafkaツールを使用して、構成されたブローカーサーバーの詳細を接続して視覚化しました。