Engula NetTrace Synth(流量回放工具)

Engula 提供一款名为 NetTrace Synth 的 TCP 流量回放工具,用于对数据库系统进行更贴近真实场景的性能测试与负载分析。该工具会捕获真实业务流量模式,并将其回放到 Engula 实例上,从而获得更可靠的基准结果与性能评估。

目标

该工作负载回放工具的主要目标包括:

  • 性能基准:通过回放真实生产工作负载,在更真实的流量条件下测量系统性能
  • 容量规划:用可控、可复现的回放测试推断资源需求与扩展上限
  • 回归验证:用一致的流量模式验证变更/升级是否引入性能或行为回退
  • 压力测试:在不同负载条件下观察系统行为,定位瓶颈与潜在故障点
  • 兼容性验证:对同一工作负载,比较 Engula 与参考实现的处理行为是否一致

该工具弥合了“纯合成基准”与“真实业务场景”之间的差距,帮助您评估 Engula 在真实应用模式与查询分布下的表现。

非目标

该工具不是数据迁移/传输工具。它专注于流量模式分析与性能基准测试,而非数据同步或迁移。

主要限制:

  • 数据一致性:回放过程中不保证数据一致性/正确性,核心目标是工作负载模拟而非数据准确性
  • 状态保留:捕获与回放之间不保留数据库状态,目标系统应预先准备好对应的测试数据集
  • 数据迁移:不用于在不同实例或环境间传输数据
  • 备份/恢复:不提供备份或容灾能力;仅回放命令序列,不保证底层数据语义正确
  • 实时同步:不能作为源与目标系统之间的实时数据同步机制

重要说明

该工具依赖 pcap(抓包)在网卡层截获流量,因此运行时需要 root 权限。

使用指南

在 Redis 所在机器上执行下述命令安装前置组件。以下示例以 Ubuntu 22.04 为例。

下载 Engula Server

Refer to Engula Downloads

安装 OpenJDK 17.x

1sudo apt-get install openjdk-17-jdk
2export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
3export PATH=$PATH:$JAVA_HOME/bin
4java -version

安装 Gradle 8.14.x

1wget https://services.gradle.org/distributions/gradle-8.14.2-bin.zip
2unzip gradle-8.14.2-bin.zip
3export GRADLE_HOME=$PWD/gradle-8.14.2
4export PATH=$PATH:$GRADLE_HOME/bin
5gradle -v

构建 pcap_resp_replay

1git clone https://github.com/montplex/pcap_resp_replay.git
2cd pcap_resp_replay
3gradle jar
4cd build/libs
5java -jar pcap_resp_replay-1.0.0.jar --help

命令行参数说明:

Usage: java -jar pcap_resp_replay-1.0.0.jar [-d] [-b=<bufferSize>] [-B=<sendCmdBatchSize>] [-c=<maxPacketCount>] [-f=<filter>] [-h=<host>] [-H=<targetHost>] [-i=<itf>] [-m=<bigKeyTopNum>] [-p=<port>] [-P=<targetPort>] [-r=<readTimeout>] [-R=<readScale>] [-s=<runningSeconds>] [-W=<writeScale>] TCP monitor / filter and then replay / redirect to target redis server. -b, --buffer-size=<bufferSize> buffer size, default: 1048576 (1M) -B, --send-cmd-batch-size=<sendCmdBatchSize> send cmd pipeline size, default: 1, max 10, means no pipeline -c, --max-packet-count=<maxPacketCount> receive max packet count, default: -1, means not limit -d, --debug debug mode, if true, just log resp data, skip execute to target redis server -f, --filter=<filter> filter, default: tcp dst port 6379 -h, --host=<host> host, eg: localhost -H, --target-host=<targetHost> target host, eg: localhost -i, --interface=<itf> interface, eg: lo, default: lo -m, --big-key-top-num=<bigKeyTopNum> big key top num, default: 10, max 100 -p, --port=<port> port, eg: 6379 -P, --target-port=<targetPort> target port, eg: 6380 -r, --read-timeout=<readTimeout> read timeout seconds by capture from network interface, default: 10 -R, --read-scale=<readScale> read scale, default: 1, max 100 -s, --running-seconds=<runningSeconds> running seconds, default: 60, max 36000 -W, --write-scale=<writeScale> write scale, default: 1, max 100

用 Engula 测试您的真实工作负载

启动 Engula Server

engula-server --port 6380 --save "" --appendonly no --protected-mode no

运行 pcap_resp_replay 做初步验证

1sudo java -Xmx1g -Xms1g -XX:+UseZGC -XX:+ZGenerational -jar pcap_resp_replay-1.0.0.jar -i lo -p 6379 -H 127.0.0.1 -P 6380 -s 30

分析性能输出与统计摘要

1+---------+---------+-----------+
2| ps_recv | ps_drop | ps_ifdrop |
3+---------+---------+-----------+
4| 4490    | 42      | 0         |
5+---------+---------+-----------+
6+--------------------------+-------------------------+-----------------------+----------------+-----------------+-----------------+
7| timeout packet get count | invalid resp data count | valid resp data count | read cmd count | write cmd count | other cmd count |
8+--------------------------+-------------------------+-----------------------+----------------+-----------------+-----------------+
9| 2                        | 0                       | 2190                  | 764            | 1414            | 12              |
10+--------------------------+-------------------------+-----------------------+----------------+-----------------+-----------------+
11+--------------------+--------------------------+---------------------+---------------------------+
12| forward read count | forward read error count | forward write count | forward write error count |
13+--------------------+--------------------------+---------------------+---------------------------+
14| 764                | 0                        | 1413                | 1                         |
15+--------------------+--------------------------+---------------------+---------------------------+
16+-------------+-------+
17| cmd         | count |
18+-------------+-------+
19| append      | 51    |
20| client      | 6     |
21| config      | 2     |
22| decr        | 59    |
23| decrby      | 66    |
24| get         | 595   |
25| getdel      | 49    |
26| getex       | 53    |
27| getrange    | 68    |
28| getset      | 53    |
29| hello       | 3     |
30| incr        | 51    |
31| incrby      | 57    |
32| incrbyfloat | 68    |
33| mget        | 53    |
34| mset        | 51    |
35| msetnx      | 51    |
36| ping        | 1     |
37| set         | 617   |
38| setex       | 66    |
39| setnx       | 49    |
40| setrange    | 73    |
41| strlen      | 48    |
42+-------------+-------+
43big key top n 10:
44+---------------------------------------------+--------+
45| key                                         | length |
46+---------------------------------------------+--------+
47| string:4a65d70f-2260-4c1d-9ef9-ef36f3041c0c | 749    |
48| string:9825eed7-7529-4cfb-bb79-611281ebb2ee | 787    |
49| string:90d40f8d-cd9d-430a-85a7-e0e1d4cf7077 | 780    |
50| string:da6ee415-b4b3-4d54-925e-02aa3900f29e | 927    |
51| string:67bd18a8-ffdb-4418-a1ad-6df4dfc116cf | 892    |
52| string:1918dec2-c048-4879-b045-ac8291ab0e05 | 944    |
53| string:76096a81-36df-4671-8402-fa6cd64ba7c9 | 992    |
54| string:0e5b9f2f-938d-4005-8f62-723152e6f42e | 955    |
55| string:848cadae-e9fb-4c38-89ac-a3f024a6b1bc | 943    |
56| string:667cd229-4e33-455a-a08e-7da1280e97ab | 962    |
57+---------------------------------------------+--------+

预加载 RDB 数据到 Engula

为了让回放结果更具参考价值,目标实例应预先加载具有代表性的数据集,以便真实的数据访问模式能够被准确复现。我们强烈建议在进行回放测试前,先将 RDB 文件加载到 Engula。 生成 RDB 的方式与 Redis 一致:在 Redis 上执行 BGSAVE,然后将生成的 RDB 文件复制到 Engula 的数据目录中。

调整读写流量缩放参数

进行回放测试时,您可能需要按测试目的调整读/写缩放参数,以模拟不同的流量模式与负载特征。

关键参数

  • --read-scale=:回放时读操作的缩放系数,默认 1
  • --write-scale=:回放时写操作的缩放系数,默认 1

使用场景

  • 读多写少:提高 --read-scale 并保持 --write-scale 较低,以模拟读密集型应用
  • 写多读少:提高 --write-scale 并保持 --read-scale 较低,以模拟写密集型场景(如日志写入)
  • 读写均衡:保持两者相等,以维持捕获流量的原始读写比例
  • 放大负载:使用大于 1 的值,将回放流量放大到超过原始捕获量
  • 限流回放:使用 0~1 的值,降低回放工作负载强度