全部产品
Search
文档中心

云服务器 ECS:基于eRDMA部署高网络性能的Kafka集群

更新时间:Sep 20, 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时延。