全部產品
Search
文件中心

Elastic Compute Service:基於eRDMA部署高網路效能的Kafka叢集

更新時間:Sep 21, 2024

基於支援eRDMA能力的ECS執行個體部署Kafka叢集,可以充分利用eRDMA提供的低延遲、高輸送量以及低CPU佔用等特性,以最佳化Kafka叢集內部節點間的資料轉送效率,適用於對訊息輸送量和時延要求較高的應用情境。本文介紹如何基於支援eRDMA能力的ECS執行個體部署Kafka叢集,並測試eRDMA對Kafka效能的提升效果

說明
  • Kafka是一個分布式流處理平台,用於高效地處理和儲存大量資料流,支援即時訊息發布和訂閱,廣泛應用於日誌彙總、事件來源、即時分析等情境。更多資訊,請參見Kafka官方文檔

  • eRDMA(Elastic Remote Direct Memory Access,彈性RDMA),是阿里雲提供的低延遲、大吞吐、高彈性的高效能RDMA網路服務。更多資訊,請參見eRDMA概述

步驟一:準備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)使用說明

  1. 依次登入所有ECS執行個體。

    具體操作,請參見通過密碼或密鑰認證登入Linux執行個體

  2. (條件必選)確保所有執行個體核心版本(通過uname -r查詢)大於等於5.10.134-16.3。如果執行個體核心版本小於5.10.134-16.3,執行以下命令將核心升級至最新版本。

    sudo yum update kernel
    sudo reboot
  3. 執行以下命令,在所有執行個體上安裝SMC工具集smc-tools。

    sudo yum install smc-tools -y
  4. 執行以下命令,在所有執行個體上查看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 
  5. 執行以下命令,在所有執行個體上禁用IPv6。

    說明

    阿里雲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

步驟三:啟動Kafka的Zookeeper和Broker

  1. 登入所有執行個體。

  2. 修改/etc/hosts檔案,分別在每個執行個體的/etc/hosts檔案中添加所有執行個體的私網IP和主機名稱的對應關係。

    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

    • 在第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叢集帶來的效能提升。

  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地址。

    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
  3. 配置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。在實際測試過程中,請根據業務需求進行調整。

  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秒採樣一次,採樣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。

    清空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
    • 在3台Broker執行個體上分別停掉Broker並清空Broker記錄

      bash $HOME/kafka_2.13-3.5.0/bin/kafka-server-stop.sh
      rm -rf $HOME/kafka-logs/
    • 分別在3台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. 擷取兩種測試結果中的時延資訊,比較eRDMA對Kafka叢集帶來的效能提升。

    找到最後一處Aggregated Pub Latency (ms)輸出,avg為平均時延,99%為P99時延,99.9%為P999時延。