TiProxy 流量回放

从 TiProxy v1.3.0 开始,你可以使用 TiProxy 捕获 TiDB 生产集群中的访问流量,并在测试集群中按照指定的速率回放这些流量。通过该功能,你可以在测试环境中重现生产集群的实际工作负载,从而验证所有 SQL 的执行结果和性能表现。

TiProxy 流量回放

使用场景

流量回放适用于以下场景:

  • TiDB 版本升级前验证:在新版本的测试集群上回放生产流量,验证新版本 TiDB 能否成功执行所有 SQL 语句。
  • 执行变更前影响评估:在测试集群上使用生产流量模拟,验证变更对集群的影响。例如在变更配置项或系统变量、变更表结构、使用 TiDB 的新功能前,先在测试集群验证效果。
  • TiDB 扩缩容前性能验证:在新规模的测试集群上按对应速率回放流量,验证新规模集群的性能是否满足要求。例如,为了节省成本要将集群规模缩容到 1/2 时,可以按 1/2 速率回放流量,验证缩容后 SQL 延迟是否满足要求。
  • 性能上限测试:在相同规模的测试集群上多次回放流量,每次调大回放速率,测试该规模下集群的吞吐量上限,以评估性能是否满足未来业务增长需求。

流量回放不适用于以下场景:

  • TiDB 与 MySQL 的 SQL 兼容性验证:TiProxy 只支持读取 TiProxy 生成的流量文件,不支持从 MySQL 捕获流量后在 TiDB 上回放。
  • TiDB 版本间 SQL 执行结果对比:TiProxy 只验证 SQL 语句是否执行成功,不对比运行结果。

使用步骤

  1. 准备测试环境:

    1. 创建测试集群,详情参考使用 TiUP 部署 TiDB 集群
    2. 安装 tiproxyctl,确保安装 tiproxyctl 的主机能连接到生产集群和测试集群的 TiProxy 实例。详情参考安装 TiProxy Control
    3. 同步生产集群的数据到测试集群,详情参考数据迁移概述
    4. 在测试集群中运行 ANALYZE 更新统计信息。
  2. 使用 tiproxyctl traffic capture 命令连接到生产集群的 TiProxy 实例,开始捕获流量。

    例如,以下命令连接到 TiProxy 实例 10.0.1.10:3080,捕获一个小时的流量,并将流量保存到 TiProxy 实例的 /tmp/traffic 目录下:

    tiproxyctl traffic capture --host 10.0.1.10 --port 3080 --output="/tmp/traffic" --duration=1h

    流量文件会自动转轮和压缩。/tmp/traffic 目录下的文件示例如下:

    ls /tmp/traffic # meta traffic-2024-08-29T17-37-12.477.log.gz traffic-2024-08-29T17-43-11.166.log.gz traffic.log

    更多信息,请参考 tiproxyctl traffic capture

  3. 将流量文件目录复制到测试集群的 TiProxy 实例上。

  4. 使用 tiproxyctl traffic replay 连接到测试集群的 TiProxy 实例,开始回放流量。

    默认配置下,SQL 语句的执行速率与生产集群相同,数据库连接也与生产集群一一对应,以模拟生产集群的负载,并保证事务的执行顺序一致。

    例如,如下命令通过用户名 u1 和密码 123456 连接到 TiProxy 实例 10.0.1.10:3080,从 TiProxy 实例的 /tmp/traffic 目录下读取流量文件并回放流量:

    tiproxyctl traffic replay --host 10.0.1.10 --port 3080 --username="u1" --password="123456" --input="/tmp/traffic"

    由于所有流量在用户 u1 下运行,请确保 u1 能访问所有数据库和表。如果没有这样的用户,则需要创建一个。

    更多信息,请参考 tiproxyctl traffic replay

  5. 查看回放报告。

    回放完成后,报告存储在测试集群的 tiproxy_traffic_replay 数据库下。该数据库包含两个表 failother_errors

    fail 表存储运行失败的 SQL 语句,字段说明如下:

    • cmd_type:运行错误的命令类型,例如 Query(执行普通语句)、Prepare(预处理语句)、Execute(执行预处理语句)。
    • digest:执行失败的 SQL 语句的指纹。
    • sample_stmt:SQL 语句首次执行失败时的 SQL 文本。
    • sample_err_msg:SQL 语句执行失败的报错信息。
    • sample_conn_id:SQL 语句在流量文件中记录的连接 ID,可用于在流量文件中查看 SQL 语句的执行上下文。
    • sample_capture_time:SQL 语句在流量文件中记录的执行时间,可用于在流量文件中查看 SQL 语句的执行上下文。
    • sample_replay_time:SQL 语句在回放时执行失败的时间,可用于在 TiDB 日志文件中查看错误信息。
    • count:SQL 语句执行失败的次数。

    以下是 fail 表的输出示例:

    SELECT * FROM tiproxy_traffic_replay.fail LIMIT 1\G
    *************************** 1. row *************************** cmd_type: StmtExecute digest: 89c5c505772b8b7e8d5d1eb49f4d47ed914daa2663ed24a85f762daa3cdff43c sample_stmt: INSERT INTO new_order (no_o_id, no_d_id, no_w_id) VALUES (?, ?, ?) params=[3077 6 1] sample_err_msg: ERROR 1062 (23000): Duplicate entry '1-6-3077' for key 'new_order.PRIMARY' sample_conn_id: 1356 sample_capture_time: 2024-10-17 12:59:15 sample_replay_time: 2024-10-17 13:05:05 count: 4

    other_errors 表存储其他未预期错误,例如网络错误、连接数据库错误。字段说明如下:

    • err_type:错误的类型,是一个简短的错误信息,例如 i/o timeout
    • sample_err_msg:错误首次出现时的完整错误信息。
    • sample_replay_time:错误在回放时执行失败的时间,可用于在 TiDB 日志文件中查看错误信息。
    • count:错误出现的次数。

    以下是 other_errors 表的输出示例:

    SELECT * FROM tiproxy_traffic_replay.other_errors LIMIT 1\G
    *************************** 1. row *************************** err_type: failed to read the connection: EOF sample_err_msg: this is an error from the backend connection: failed to read the connection: EOF sample_replay_time: 2024-10-17 12:57:39 count: 1

测试吞吐量

如果需要测试集群的吞吐量,可以使用 --speed 选项调整回放的速率。

例如,--speed=2 会使 SQL 语句以两倍速率执行,总回放时间缩短一半:

tiproxyctl traffic replay --host 10.0.1.10 --port 3080 --username="u1" --password="123456" --input="/tmp/traffic" --speed=2

调大回放速率只会缩短 SQL 语句之间的空闲时间,不会增加连接数。因此当会话的空闲时间本身较短时,仅调大倍速可能无法有效提升吞吐量。在这种情况下,可以部署多个 TiProxy 实例,让它们同时回放相同的流量文件,通过增加并发度来提高吞吐量。

任务查看与管理

在捕获和回放过程中,如果遇到未知错误会自动停止任务。使用 tiproxyctl traffic show 命令可查看当前的任务进度或上次任务的错误信息:

tiproxyctl traffic show --host 10.0.1.10 --port 3080

例如,如下输出代表捕获任务正在运行:

[ { "type": "capture", "start_time": "2024-09-03T09:10:58.220644+08:00", "duration": "2h", "output": "/tmp/traffic", "progress": "45%", "status": "running" } ]

更多信息,请参考 tiproxyctl traffic show

如果需要取消当前的捕获或回放任务,可使用 tiproxyctl traffic cancel 命令:

tiproxyctl traffic cancel --host 10.0.1.10 --port 3080

更多信息,请参考 tiproxyctl traffic cancel

使用限制

  • TiProxy 仅支持回放 TiProxy 捕获的流量文件,不支持其他文件格式,因此生产集群必须先使用 TiProxy 捕获流量。
  • TiProxy 不支持过滤 SQL 类型,DML 和 DDL 语句也会被回放,因此重新回放前需要将集群数据恢复到回放前的状态。
  • 由于 TiProxy 使用同一个用户名回放流量,因此无法测试资源管控权限管理
  • 不支持回放 LOAD DATA 语句。

资源

关于 TiProxy 流量回放更详细的信息,请参阅设计文档

文档内容是否有帮助?