基於支援eRDMA能力的ECS執行個體部署Kafka叢集,可以充分利用eRDMA提供的低延遲、高輸送量以及低CPU佔用等特性,以最佳化Kafka叢集內部節點間的資料轉送效率,適用於對訊息輸送量和時延要求較高的應用情境。本文介紹如何基於支援eRDMA能力的ECS執行個體部署Kafka叢集,並測試eRDMA對Kafka效能的提升效果。
步驟一:準備ECS執行個體
部署叢集需要準備多台ECS執行個體用於搭建Broker、Zookeeper服務以及部署壓測環境。
Broker:叢集中的核心資料節點,負責實際的訊息儲存、傳輸和管理。
ZooKeeper:在Kafka叢集中提供分布式服務協調與管理功能。
壓測執行個體:用於驗證已部署的Kafka叢集的效能。
本文準備5台ECS執行個體,1台作為Zookeeper執行個體、3台作為Broker執行個體、1台作為壓測執行個體,執行個體配置要求如下:
選用的執行個體規格需支援eRDMA能力。支援eRDMA能力的執行個體規格,請參見使用限制。
用途 | 所需執行個體 | 雲端硬碟要求 | 網路要求 | 鏡像要求 |
作為Broker執行個體 | 3台,本文樣本規格ecs.g8a.2xlarge | 選擇ESSD PL3雲端硬碟,容量按需選擇 |
| Alibaba Cloud Linux 3.2104 LTS 64位 |
作為Zookeeper執行個體 | 1台,本文樣本規格ecs.g8a.xlarge | 無限制 | ||
作為壓測執行個體 | 1台,本文樣本規格ecs.g8a.16xlarge | 無限制 |
步驟二:安裝工具和Kafka
您可以依次登入步驟一準備的5台ECS執行個體,執行相關命令安裝SMC-R、Java工具、Kafka軟體。
在使用eRDMA功能時,需要部署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工具集smc-tools。
sudo yum install smc-tools -y
執行以下命令,在所有執行個體上查看eRDMA裝置,確保能查到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。
說明阿里雲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
步驟三:啟動Kafka的Zookeeper和Broker
登入所有執行個體。
修改
/etc/hosts
檔案,分別在每個執行個體的/etc/hosts
檔案中添加所有執行個體的私網IP和主機名稱的對應關係。在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
。在第1台Broker執行個體上指定Broker ID為
broker 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 zookeeper.connect=<zookeeper ip>:2181
在第2台Broker執行個體上指定Broker ID為
broker 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 zookeeper.connect=<zookeeper ip>:2181
在第3台Broker執行個體上指定Broker ID為
broker 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 zookeeper.connect=<zookeeper ip>:2181
步驟四:效能測試
下載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地址。
vi $HOME/benchmark/driver-kafka/kafka-throughput.yaml
如下回顯資訊,將檔案中的
bootstrap.servers=localhost:9092
內容替換為bootstrap.servers=<broker0的私網IP地址>:9092,<broker1的私網IP地址>:9092,<broker2的私網IP地址>: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: <訊息發送速率>
參數值,訊息發送速率 = Broker可用頻寬/單個訊息的大小
。本文的Broker執行個體規格為ecs.g8a.2xlarge,該規格的最高網路頻寬為4 Gbit/s,3台Broker執行個體的總頻寬為12 Gbit/s。由於Kafka採用三副本機制,實際可用頻寬約為總頻寬的三分之一,即
Broker可用頻寬
= 12 Gbit/s / 3 = 4 Gbit/s(等於512 MB/s),由於本文是在workloads
目錄下進行測試,該目錄下單個訊息的大小為1 KB,則訊息發送速率
=512 MB/s / 1 KB = 524,288,因此您需要修改檔案中的producerRate: <訊息發送速率>
為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秒採樣一次,採樣20次後退出,然後將3台Broker執行個體的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功能測試後,為避免測試留存資訊對不使用eRDMA功能測試產生影響,您可以按照以下方法清空Broker和Zookeeper的記錄,並重啟Broker和Zookeeper。
擷取兩種測試結果中的時延資訊,比較eRDMA對Kafka叢集帶來的效能提升。
找到最後一處
Aggregated Pub Latency (ms)
輸出,avg
為平均時延,99%為P99時延,99.9%為P999時延。