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) を選択します。 ビジネス要件に基づいてディスク容量を選択します。 |
| 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の使用」をご参照ください。
すべてのECSインスタンスに順番にログインします。
詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。
(条件付きで必要)
uname -r
コマンドを実行して、カーネルのバージョンを表示します。 すべてのインスタンスのカーネルバージョンが5.10.134-16.3
以降であることを確認してください。 インスタンスのカーネルバージョンが5.10.134-16.3
より前の場合、次のコマンドを実行してカーネルを最新バージョンにアップグレードします。sudo yum update kernel sudo reboot
次のコマンドを実行して、各インスタンスにsmc-tools toolkitをインストールします。
sudo yum install smc-tools -y
次のコマンドを実行して、各インスタンスでeRDMAが有効になっているかどうかを確認します。
smcr dev
サンプル出力:
Net-Dev IB-Dev IB-P IB-State Type Crit #Links PNET-ID eth0 erdma_0 1 ACTIVE 0x107f No 0
なし
次のコマンドを実行して、各インスタンスのIPv6を無効にします。
説明Alibaba Cloud eRDMAデバイスとSMCデバイスはIPv6アドレスをサポートしていません。 IPv6を無効にすると、トラフィックはIPv4を使用してRDMAチャネルを通過できます。
sudo sysctl net.ipv6.conf.all.disable_ipv6=1
次のコマンドを実行して、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
次のコマンドを実行して、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を起動する
すべてのECSインスタンスに順番にログインします。
インスタンスのプライベートIPアドレスとホスト名の間のマッピングを、各インスタンスの
/etc/hosts
ファイルに追加します。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
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クラスターに寄与するパフォーマンス向上を評価します。
ストレステストインスタンスにログインします。 Open Messaging Benchmarkをダウンロードしてコンパイルします。
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/
ダウンロードを高速化するために、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>
Open Messaging Benchmarkソースコードをダウンロードしてコンパイルします。
git clone https://github.com/openmessaging/benchmark.git cd benchmark && mvn clean verify -DskipTests
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
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
に変更します。 実際のテストでは、ビジネス要件に基づいてメッセージ送信レートを設定します。次のいずれかの方法を使用して、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を再起動します。
2つのテストの結果からレイテンシ情報を取得して、eRDMAがKafkaクラスターに寄与するパフォーマンス向上を評価します。
最後の
Aggregated Pub Latency (ms)
エントリを見つけて表示します。avg
は平均レイテンシを表し、99% はP99レイテンシを表し、999% はP999レイテンシを表します。