すべてのプロダクト
Search
ドキュメントセンター

Elastic Compute Service:高ネットワークパフォーマンスのKafkaクラスターをeRDMA対応インスタンスにデプロイする

最終更新日:Aug 27, 2024

Elastic Remote Direct Memory Access (eRDMA) が有効になっているElastic Compute Service (ECS) インスタンスにKafkaクラスターをデプロイできます。 Kafkaクラスターは、eRDMAによって提供される低レイテンシ、高スループット、および低CPU使用率を十分に活用して、Kafkaクラスター内のノード間のデータ伝送の効率を向上させることができます。 Kafkaクラスターは、高いメッセージスループットと低いレイテンシが必要なシナリオに適しています。 このトピックでは、eRDMA対応ECSインスタンスにKafkaクラスターをデプロイする方法について説明します。 このトピックでは、テストする方法についても説明しますeRDMAによって改善されたKafkaパフォーマンス.

説明
  • Kafkaは、多数のデータストリームを効率的に処理および保存し、リアルタイムのメッセージ発行とサブスクリプションをサポートする分散ストリーム処理プラットフォームです。 Kafkaは、ログ集計、イベントソーシング、リアルタイム分析などのシナリオで広く使用されています。 詳細については、「Kafkaドキュメント」をご参照ください。

  • eRDMAは、Alibaba Cloudによって開発されたリモートダイレクトメモリアクセス (RDMA) サービスであり、低レイテンシ、高スループット、高弾力性で高いネットワークパフォーマンスを保証します。 詳細については、「概要」をご参照ください。

ステップ1: ECSインスタンスの準備

Kafkaクラスターをデプロイする前に、複数のECSインスタンスを準備し、BrokerサービスとZooKeeperサービスをデプロイし、インスタンスにストレステスト環境を構築します。

  • Broker対応インスタンスは、クラスター内のコアデータノードとして機能し、メッセージを保存、送信、および管理します。

  • ZooKeeper対応インスタンスは、Kafkaクラスターで分散サービスの調整と管理を実装します。

  • ストレステストインスタンスは、デプロイされたKafkaクラスターのパフォーマンスをテストするために使用されます。

この例では、1つのZooKeeper対応インスタンス、3つのBroker対応インスタンス、および1つのストレステストインスタンスを含む5つのECSインスタンスが作成されます。 次の表に、インスタンス設定の要件を示します。

重要

選択したインスタンスタイプはeRDMAをサポートする必要があります。 eRDMAをサポートするインスタンスタイプの詳細については、「エンタープライズレベルのインスタンスでeRDMAを構成する」トピックの制限セクションを参照してください。

目的

インスタンス要件

ディスク要件

ネットワーク要件

イメージ要件

ブローカー対応インスタンス

3つのインスタンスを作成します。 この例では、ecs.g8a.2xlargeインスタンスタイプが使用されています。

パフォーマンスレベル3 (PL3) のエンタープライズSSD (ESSD) を選択します。 ビジネス要件に基づいてディスク容量を選択します。

  • インスタンスのパブリックIPアドレスを設定する必要があります。

  • 同じ仮想プライベートクラウド (VPC) にインスタンスをデプロイする必要があります。 デフォルトでは、インスタンスは内部ネットワーク内で相互に通信できます。

  • インスタンスのeRDMA機能を有効にする必要があります。 詳細については、「エンタープライズレベルのインスタンスでのeRDMAの設定」をご参照ください。

Alibaba Cloud Linux 3.2104 LTS 64ビット。

Zookeeper対応インスタンス

インスタンスを1つ作成します。 この例では、ecs.g8a.xlargeインスタンスタイプが使用されています。

なし。

Stress testingインスタンス

インスタンスを1つ作成します。 この例では、ecs.g8a.16xlargeインスタンスタイプが使用されています。

なし。

ステップ2: 必要なツールとKafkaをインストールする

ステップ1で準備した5つのECSインスタンスのそれぞれにログインし、関連するコマンドを実行して、リモートダイレクトメモリアクセス (SMC-R) による共有メモリ通信、Javaツール、およびKafkaをインストールします。

説明

eRDMA機能を使用する前に、SMC-Rをデプロイする必要があります。 SMC-Rはカーネル空間で機能し、SMC-RプロトコルスタックはインスタンスがeRDMAリソースを使用、管理、および維持するのに役立ちます。 SMC-Rについては、「SMCの使用」をご参照ください。

  1. すべてのECSインスタンスに順番にログインします。

    詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。

  2. (条件付きで必要) uname -rコマンドを実行して、カーネルのバージョンを表示します。 すべてのインスタンスのカーネルバージョンが5.10.134-16.3以降であることを確認してください。 インスタンスのカーネルバージョンが5.10.134-16.3より前の場合、次のコマンドを実行してカーネルを最新バージョンにアップグレードします。

    sudo yum update kernel
    sudo reboot
  3. 次のコマンドを実行して、各インスタンスにsmc-tools toolkitをインストールします。

    sudo yum install smc-tools -y
  4. 次のコマンドを実行して、各インスタンスでeRDMAが有効になっているかどうかを確認します。

    smcr dev

    サンプル出力:

    Net-Dev IB-Dev IB-P IB-State Type Crit #Links PNET-ID 
    eth0 erdma_0 1 ACTIVE 0x107f No 0 

    なし

  5. 次のコマンドを実行して、各インスタンスのIPv6を無効にします。

    説明

    Alibaba Cloud eRDMAデバイスとSMCデバイスはIPv6アドレスをサポートしていません。 IPv6を無効にすると、トラフィックはIPv4を使用してRDMAチャネルを通過できます。

    sudo sysctl net.ipv6.conf.all.disable_ipv6=1
  6. 次のコマンドを実行して、JavaとGitをインストールします。

    sudo yum install java-11-openjdk-1:11.0.21.0.9-2.0.3.al8 java-11-openjdk-devel-1:11.0.21.0.9-2.0.3.al8 git -y
  7. 次のコマンドを実行して、Kafkaパッケージをダウンロードして解凍します。

    wget https://archive.apache.org/dist/kafka/3.5.0/kafka_2.13-3.5.0.tgz
    tar -xf kafka_2.13-3.5.0.tgz 

ステップ3: KafkaのZooKeeperとBrokerを起動する

  1. すべてのECSインスタンスに順番にログインします。

  2. インスタンスのプライベートIPアドレスとホスト名の間のマッピングを、各インスタンスの /etc/hostsファイルに追加します。

    image

  3. ZooKeeper対応インスタンスで次のコマンドを実行し、ZooKeeperを起動します。

    bash $HOME/kafka_2.13-3.5.0/bin/zookeeper-server-start.sh -daemon $HOME/kafka_2.13-3.5.0/config/zookeeper.properties
  4. 3つのBroker対応インスタンスのそれぞれでBrokerを起動します。

    説明

    eRDMA機能を使用せずにテストを実行する場合は、コマンドからsmc_runパラメーターを削除します。

    • 最初のBroker対応インスタンスで、Broker IDを0に設定し、Brokerを起動します。 <zookeeper ip> をZookeeper対応インスタンスのプライベートIPアドレスに置き換えます。

      KAFKA_HEAP_OPTS="-Xmx4G -Xms4G" smc_run bash $HOME/kafka_2.13-3.5.0/bin/kafka-server-start.sh -daemon $HOME/kafka_2.13-3.5.0/config/server.properties-override broker.id=0-override log.dirs=$HOME/kafka-logs-override zokeeper. connect=<zokeeper ip>:2181
    • 2番目のBroker対応インスタンスで、Broker IDを1に設定し、Brokerを起動します。 <zookeeper ip> をZookeeper対応インスタンスのプライベートIPアドレスに置き換えます。

      KAFKA_HEAP_OPTS="-Xmx4G -Xms4G" smc_run bash $HOME/kafka_2.13-3.5.0/bin/kafka-server-start.sh -daemon $HOME/kafka_2.13-3.5.0/config/server.properties-override broker.id=1-override log.dirs=$HOME/kafka-logs-override zokeeper. connect=<zokeeper ip>:2181
    • 3番目のBroker対応インスタンスで、Broker IDを2に設定し、Brokerを起動します。 <zookeeper ip> をZookeeper対応インスタンスのプライベートIPアドレスに置き換えます。

      KAFKA_HEAP_OPTS="-Xmx4G -Xms4G" smc_run bash $HOME/kafka_2.13-3.5.0/bin/kafka-server-start.sh -daemon $HOME/kafka_2.13-3.5.0/config/server.properties -- override broker.id=2 -- override log.dirs=$HOME/kafka-logs -- override zokeeper. connect=<zokeeper ip>:2181

ステップ4: パフォーマンステストの実行

Benchmarkツールをダウンロードし、使用可能な最大のネットワーク帯域幅が設定されている環境をシミュレートします。 eRDMAが有効になっているときとeRDMAが無効になっているときにKafkaパフォーマンスをテストします。 テスト結果を比較して、eRDMAがKafkaクラスターに寄与するパフォーマンス向上を評価します。

  1. ストレステストインスタンスにログインします。 Open Messaging Benchmarkをダウンロードしてコンパイルします。

    1. Open Messaging BenchmarkコンパイラであるMavenをダウンロードしてインストールします。

      wget https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz
      tar -xf apache-maven-3.8.8-bin.tar.gz
      export PATH=$PATH:$HOME/apache-maven-3.8.8/bin/ 
    2. ダウンロードを高速化するために、Mavenリポジトリの設定ファイルを変更します。

      vi $HOME/apache-maven-3.8.8/conf/settings.xml

      次の内容をsettings.xml mirrorsタグに追加します。 次に、設定ファイルを保存して閉じます。

      <mirror>
          <id>nexus-aliyun</id>
          <mirrorOf>central</mirrorOf>
          <name>Nexus aliyun</name>
          <url>http://maven.aliyun.com/nexus/content/groups/public</url>
      </mirror>
    3. Open Messaging Benchmarkソースコードをダウンロードしてコンパイルします。

      git clone https://github.com/openmessaging/benchmark.git
      cd benchmark && mvn clean verify -DskipTests
  2. kafka-throughput.yamlファイルでBroker対応インスタンスのプライベートIPアドレスを指定します。

    vi $HOME/benchmark/driver-kafka/kafka-throughput.yaml

    kafka-throughput.yamlファイルで、bootstrap.serversパラメーターをBroker対応インスタンスのプライベートIPアドレスに、<private IP address of Broker 0>:9092、<Private IP address of Broker 1>:9092、<Private IP address of Broker 2>:9092の形式で設定します。

    commonConfig: |
      bootstrap.servers=<172.17.XX.XX>:9092,<172.17.XX.XX>:9092,<172.17.XX.XX>:9092
      default.api.timeout.ms=1200000
      request.timeout.ms=1200000
  3. Kafkaクラスターのパフォーマンスがテストされる環境で使用可能な最大のネットワーク帯域幅をシミュレートするために、Kafkaメッセージが送信される速度を指定します。

    vi $HOME/benchmark/workloads/1-topic-100-partitions-1kb-4p-4c-200k.yaml

    ファイルのproducerRate: <Message sending rate> パラメーターを変更します。 メッセージ送信速度は、次の式を使用して計算されます。ブローカー対応インスタンスの使用可能な帯域幅 /単一メッセージのサイズ

    この例では、Broker対応インスタンスのインスタンスタイプはecs.g8a.2xlargeです。 このインスタンスタイプの最大ネットワーク帯域幅は4 Gbit/sで、3つのBroker対応インスタンスの合計帯域幅は12 Gbit/sです。 Kafkaトリプリケート機構により、実際に利用可能な帯域幅は、全帯域幅の約3分の1である。 したがって、使用可能なBroker対応インスタンスの帯域幅は、12 Gbit/sを3で割った値として計算されます。これは、4 Gbit/s (または512メガバイト/秒) に相当します。 テストはworkloadsディレクトリで実行され、各メッセージのサイズは1 KBです。 メッセージ送信速度は、512メガバイト/秒を1 KBで割った値として計算されます。これは524,288に相当します。 この場合、ファイルのproducerRate: <Message sending rate> パラメーターをproducerRate: 524288に変更します。 実際のテストでは、ビジネス要件に基づいてメッセージ送信レートを設定します。

  4. 次のいずれかの方法を使用して、Kafkaクラスターのパフォーマンスをテストします。

    eRDMAが有効な場合のパフォーマンステストの実行

    smc_run $HOME/benchmark/bin/benchmark --drivers $HOME/benchmark/driver-kafka/kafka-throughput.yaml $HOME/benchmark/workloads/1-topic-100-partitions-1kb-4p-4c-2000k.yaml

    Kafkaパフォーマンステスト中に、次の操作を同時に実行できます。

    • ストレステストインスタンスの別のウィンドウでsmcss -aコマンドを実行し、メッセージの送信にSMC-Rが使用されているかどうかを確認します。

    • 3つのBroker対応インスタンスのそれぞれでsarコマンドを実行し、CPU使用率を確認します。 例えば、sar 1 20コマンドは、1秒に1回、20回、データをサンプリングすることを示す。 次に、3つのブローカー対応インスタンスのCPU使用率値を合計して、合計CPU使用率を取得します。

    eRDMAが無効の場合のパフォーマンステストの実行

    $HOME/benchmark/bin/benchmark --drivers $HOME/benchmark/driver-kafka/kafka-throughput.yaml $HOME/benchmark/workloads/1-topic-100-partitions-1kb-4p-4c-2000k.yaml
    重要

    残りのテストデータがeRDMAが無効になっているパフォーマンステストに悪影響を与えないようにするには、BrokerレコードとZooKeeperレコードを削除し、インスタンスでBrokerとZookeeperを再起動します。

    BrokerとZookeeperのレコードを削除し、BrokerとZookeeperを再起動する

    • Zookeeper対応インスタンスでZookeeperを停止し、Zookeeperレコードを削除します。

      bash $HOME/kafka_2.13-3.5.0/bin/zookeeper-server-stop.sh
      rm -rf /tmp/zookeeper/
    • ZooKeeper対応インスタンスでZooKeeperを再起動します。

      bash $HOME/kafka_2.13-3.5.0/bin/zookeeper-server-start.sh -daemon $HOME/kafka_2.13-3.5.0/config/zookeeper.properties
    • 各Broker対応インスタンスでBrokerを停止し、Brokerレコードを削除します。

      bash $HOME/kafka_2.13-3.5.0/bin/kafka-server-stop.sh
      rm -rf $HOME/kafka-logs/
    • 各Broker対応インスタンスでBrokerを再起動します。

      KAFKA_HEAP_OPTS="-Xmx4G -Xms4G" smc_run bash $HOME/kafka_2.13-3.5.0/bin/kafka-server-start.sh -daemon $HOME/kafka_2.13-3.5.0/config/server.properties --override broker.id=0 --override log.dirs=$HOME/kafka-logs --override zookeeper.connect=<zookeeper ip>:2181
      KAFKA_HEAP_OPTS="-Xmx4G -Xms4G" smc_run bash $HOME/kafka_2.13-3.5.0/bin/kafka-server-start.sh -daemon $HOME/kafka_2.13-3.5.0/config/server.properties --override broker.id=1 --override log.dirs=$HOME/kafka-logs --override zookeeper.connect=<zookeeper ip>:2181
      KAFKA_HEAP_OPTS="-Xmx4G -Xms4G" smc_run bash $HOME/kafka_2.13-3.5.0/bin/kafka-server-start.sh -daemon $HOME/kafka_2.13-3.5.0/config/server.properties --override broker.id=2 --override log.dirs=$HOME/kafka-logs --override zookeeper.connect=<zookeeper ip>:2181
      • <zookeeper ip> をZookeeper対応インスタンスのプライベートIPアドレスに置き換えます。

      • eRDMA機能を使用せずにパフォーマンスをテストする場合は、コマンドからsmc_runパラメーターを削除します。

  5. 2つのテストの結果からレイテンシ情報を取得して、eRDMAがKafkaクラスターに寄与するパフォーマンス向上を評価します。

    最後のAggregated Pub Latency (ms) エントリを見つけて表示します。 avgは平均レイテンシを表し、99% はP99レイテンシを表し、999% はP999レイテンシを表します。