基于支持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时延。