From 6028f53bf629381fa35e40074030e9647b1bd34a Mon Sep 17 00:00:00 2001 From: djshow832 Date: Tue, 27 Aug 2024 17:56:58 +0800 Subject: [PATCH 1/3] rfc --- docs/design/2024-08-27-traffic-replay.md | 208 +++++++++++++++++++++++ docs/design/imgs/traffic-offline.png | Bin 0 -> 115857 bytes docs/design/imgs/traffic-online.png | Bin 0 -> 83806 bytes 3 files changed, 208 insertions(+) create mode 100644 docs/design/2024-08-27-traffic-replay.md create mode 100644 docs/design/imgs/traffic-offline.png create mode 100644 docs/design/imgs/traffic-online.png diff --git a/docs/design/2024-08-27-traffic-replay.md b/docs/design/2024-08-27-traffic-replay.md new file mode 100644 index 00000000..c16af8ea --- /dev/null +++ b/docs/design/2024-08-27-traffic-replay.md @@ -0,0 +1,208 @@ +# Proposal: Traffic-Replay + +- Author(s): [djshow832](https://github.com/djshow832) +- Tracking Issue: https://github.com/pingcap/tiproxy/issues/642 + +## Abstract + +This proposes a design of capturing traffic on the production cluster and replaying the traffic on a testing cluster to verify the SQL compatibility and performance of the new cluster. + +## Background + +There are some cases when users want to capture the traffic on the production cluster and replay the traffic on a testing cluster: +- A new TiDB version may have compatibility breakers, such as the statements failing, running slower, or resulting in different query results. +- When the cluster runs unexpectedly, users want to capture the traffic so that they can investigate it later by replaying the traffic. +- Test the maximum throughput of a scaled-up or scaled-down cluster using the real production workload instead of standard bench tools. + +Some traffic replay tools are widely used, including tcpcopy, mysql-replay, and query-playback. Tcpcopy and mysql-replay capture data like tcpdump, while query-playback is based on slow logs. Although some of them are built for MySQL, deploying them on the proxy instance also works. + +However, they have some limitations: +- Hard to deploy and use. For example, the tools may sometimes fail to be compiled, or take too long to preprocess the captured traffic files. +- Tcpcopy only captures new connections, which is unfriendly for persistent connections. Mysql-replay can capture existing connections but it loses session states such as prepared statements and session variables, which may make replay fail. +- The tools replay the traffic with one username and one current schema, which requires modification to the testing cluster. +- Tcpcopy and mysql-replay don't support TLS because they can't decode the encrypted data. +- Users need to verify the results and performance manually. + +## Goals + +- Verify the SQL compatibility, performance, and correctness of the new TiDB cluster and generate a report +- Capture the existing sessions even if they already have states like prepared statements +- Capture the traffic even if TLS and compression are enabled +- Provide friendly user interfaces to capture traffic, replay traffic, and check report +- Replay the traffic captured by mysql-replay to verify the compatibility of MySQL and TiDB + +## Non-Goals + +- Support capturing and replaying traffic on multiple active TiProxy instances +- Replicate the traffic to the new TiDB cluster online without storing the traffic +- Support capturing and replaying traffic on the TiDB Cloud + +## Proposal + +The basic procedure is: +1. The user creates a TiDB cluster with a new TiDB version. +2. (Optional) The user synchronizes data from the production TiDB cluster to the new cluster and then executes `ANALYZE` commands to refresh the statistics. +3. The user turns on traffic capture on the production TiDB cluster and TiProxy stores traffic to the specified directory. +4. The user turns on traffic replay on the new TiDB cluster and TiProxy replays traffic and generates a report. +5. The user checks the report to see if the result is expected. + +vip architecture + +### Traffic Capture + +TiProxy stores these fields into traffic files: +- The start timestamp of this command. +- The TiProxy connection ID of this command. +- The binary format of this command. +- The first packet header, packet number, size, and duration of the response. + +Most applications use persistent connections, so TiProxy should also capture existing connections. If the existing sessions are in transactions, TiProxy waits for the end of the transaction. + +Existing sessions may have states like prepared statements. For these sessions, TiProxy queries the session states by `SHOW SESSION_STATES` and stores the states as `SET SESSION_STATES` statements in the traffic files. + +### Traffic Storage + +TiProxy is unable to capture MySQL traffic. TiProxy can write traffic files with the same format as mysql-replay, thus it can verify the compatibility of MySQL and TiDB by replaying the traffic file of mysql-replay. However, since the username, current schema, and other session states are not recorded in the traffic files of mysql-replay, TiProxy has the same limitation as mysql-replay. + +It's trivial to lose traffic during failure, so TiProxy doesn't need to flush the traffic synchronously. To reduce the effect on the production cluster, TiProxy flushes the traffic in batch asynchronously with double buffering. Similarly, TiProxy loads traffic with double buffering during replaying. + +The traffic files contain sensitive data, so TiProxy may need to encrypt the data. + +To fully simulate the real workload, users may capture the traffic of days, so TiProxy also needs to compress data or store data on object storage systems. + +### Traffic Replay + +TiProxy replays traffic with the following steps: +1. Connect to TiDB using the specified username in the traffic file. +2. Replay the session states with `SET SESSION_STATES` statement in the traffic file. +3. Replay the commands one by one. + +All the connections share the same username to replay. The user needs to create an account with full privilege and then specify the username and password on TiProxy. + +Replaying DDL and DML statements makes the data on the testing cluster dirty, which requires another import if the replay needs to be executed again. To avoid this, TiProxy should support a statement filter, which allows read-only statements to be replayed. + +When replaying commands, we support multiple speed options: +- Replay with the same speed as the production cluster. Since the command timestamps are recorded in the traffic files, TiProxy can replay with the same speed. It can simulate the production workload. +- Replay with a customized speed, such as 1.5x speed. It's used to get the maximum throughput of the new TiDB version, as well as keep the order of transactions. +- Replay as fast as possible. That is, send the next command once the previous query result is received. It can also get the maximum QPS and verify whether the execution is successful. It can't verify the correctness because it breaks transaction orders. + +In case the response time exceeds the start time of the next command, TiProxy sends the next command immediately. + +If the statement is too large, such as batch insert, reading the whole command at once takes too long and uses too much memory. TiProxy should read and send the commands streamingly. + +### Verification and Report + +TiProxy supports more kinds of comparison than existing tools: +- Compare the response packet header to verify whether the execution succeeds. +- Compare the response packet number to verify the returned row number. +- Compare the response size to verify the result set size. An alternative is to verify the checksum of the result set but it affects performance more. +- Compare the response time to verify performance degradation. The warning is reported only when degradation is too severe to avoid generating too many warnings. + +The above warning types are written into 4 report files respectively. The warnings should be grouped by the statement digest because a failed statement may be reported a thousand times and hard to troubleshoot. To output the count of each statement together with the statements, the report should stay in TiProxy memory until the replay finishes. + +Besides the warnings, another report file contains a summary describing the count of each kind of warning, plus the count of latency increases and decreases. + +If the user only needs to verify the success of statement execution, he doesn't need to import data and TiProxy only needs to verify the packet header. Thus, the verification options should be configurable. + +TiProxy stores the report into report files, the path of which is also specified. + +### User Interface + +To capture traffic, one needs to turn it on and then turn it off or specify a duration. + +It's not intuitive to update the configuration to turn it on and off. The best way is using SQL. Since TiProxy doesn't parse SQL, TiDB parses SQL and sends the command through TiProxy HTTP API. + +The HTTP API is as follows: + +```http +PUT /api/traffic/capture/start?output=/tmp/traffic&duration=1h&compression=zstd&encryption=true +PUT /api/traffic/capture/stop +PUT /api/traffic/replay/start?&input=/tmp/traffic&report=/tmp/result&compression=zstd&encryption=true +PUT /api/traffic/replay/stop +# show the current progress of running catpure or replay jobs +GET /api/traffic/jobs +``` + +The TiProxyCtl commands: + +```shell +tiproxyctl traffic capture start output=/tmp/traffic duration=1h compression=zstd encryption=true +tiproxyctl traffic capture stop +tiproxyctl traffic replay start input=/tmp/traffic report=/tmp/result compression=zstd encryption=true +tiproxyctl traffic replay stop +tiproxyctl traffic jobs +``` + +The SQL statements: + +```SQL +ADMIN TRAFFIC CAPTURE START OUTPUT="/tmp/traffic" DURATION="1h" COMPRESSION="zstd" ENCRYPTION=true +ADMIN TRAFFIC CAPTURE STOP +ADMIN TRAFFIC REPLAY START INPUT="/tmp/traffic" COMPRESSION="zstd" ENCRYPTION=true REPORT="/tmp/result" +ADMIN TRAFFIC REPLAY STOP +ADMIN TRAFFIC JOBS +``` + +## Alternatives + +### Replicate Traffic Online + +It looks simpler to replicate traffic directly to a testing cluster: + +vip architecture + +It's less flexible than the offline mode: +- It's almost impossible to replay traffic when the production cluster behaves unexpectedly because the testing cluster is not ready. +- If the test result is unexpected and the replication needs to be scheduled again, the performance of the production cluster is affected again. + +## Future works + +### Store the Report to TiDB + +Now that TiProxy has a fully privileged account to access TiDB on the testing cluster, another choice is to store the report in TiDB tables. Showing the report in a structured format will be more straightforward and brings more advantages: +- Support operations such as filtering and aggregating +- TiProxy can output to the table streamingly to reduce memory usage + +The table definitions: + +```sql +create table traffic_replay.summary( + failed_count int, + failed_stmt_types int, + faster_stmt_count int, + slower_stmt_count int, + result_mismatches int); + +# the statements that failed to run +create table traffic_replay.fails( + digest varchar(128), + sample_stmt text, + count int, + err_msg text, + primary key(digest)); + +# the statements that are much slower +create table traffic_replay.slow( + digest varchar(128), + sample_stmt text, + count int, + ratio float, + primary key(digest)); + +# the statements that results mismatch +create table traffic.mismatch( + digest varchar(128), + sample_stmt text, + count int, + expected_rows int, + actual_rows int, + expected_size int, + actual_size int, + primary key(digest)); +``` + +### Provide GUI with TiDB Dashboard + +Offering GUI on the TiDB Dashboard is more friendly than providing SQL. Dashboard can send HTTP requests to TiProxy directly so it doesn't require SQL. Besides, showing the report on GUI is more straightforward. + +However, the TiDB Dashboard is unavailable on the cloud, limiting the scope. We may support it later if self-managed users really want it. \ No newline at end of file diff --git a/docs/design/imgs/traffic-offline.png b/docs/design/imgs/traffic-offline.png new file mode 100644 index 0000000000000000000000000000000000000000..d8bf12d43d60586633fe64c4cb2503585179a257 GIT binary patch literal 115857 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 Pfj`%Eo7P@iLy!6&qK`j( literal 0 HcmV?d00001 diff --git a/docs/design/imgs/traffic-online.png b/docs/design/imgs/traffic-online.png new file mode 100644 index 0000000000000000000000000000000000000000..e5e90d20ee668211a206ea38b220736b07a0fff1 GIT binary patch literal 83806 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

dd; zXQAsn!J6X^v2`&Ed4bOT5(oXyuw%Yd&R{|l?h`JEE}vG5jxl=0xXa57i`&X*zLSsP z2))t55G5eFT8-I{+xH4Kekm-DaD-|P7Zd5B8O5UMR$sI~B5KsZC3x3=e<`37t&gEQ z^k4)1Q@RY8%nx}bK3u+kN%4dRY^gFoge-K;+y z@NH8*{0c-bZh!~>qh)uwCtN~#$N$?)xLKf*Nb{n5ro_9`=$p4#?FJ!d3e3X_^v{+j zzC-FqfaJd(nls|YU}k2ad8Af4@Zz5@2eA4MtcjW#wH1vbS`Fni^c03tL?AV<#*Go? zmZ7bL7zn`l5w3B9nDXtwfDJ-N2WF21!Uw$?^rv!G_|{LAKMPyZJf@JyDQtIs^4gx}1O zffygU5AAekr#frNqkkW!{|oVSZ@rZz z9UXK0NmZo_zeU^MqUvwq|F@R}Bw&pYwp&hlxOu{U+H9N@VCZHFn1@rz3-7p$kkSDXYPA$4hbR)kTO2OM zcVwlHtJ@!QnqKTq#$ugkD+bWxOf_mccGevS6DNlF@16u@*e)~~&+RpVbiAsUmF<;o z{`dF)_02$E^lqlQg&Qh5xo-HfJ-hSZgXRMjUy+;55C7eVqR10LErDP1Hc;aJJeK%9 z4(y;ich>1+k3D3+{eYk0sL-dRr@zPbPq#NC8B35#@Ka;r+72N97^67Ot3r8@Du1{C z?q_BP9`<3oS%swf|9JXeZwKqSim-y)O!Uy;^P|xg5c<7wadGk Date: Thu, 29 Aug 2024 21:52:40 +0800 Subject: [PATCH 2/3] update report --- docs/design/2024-08-27-traffic-replay.md | 149 +++++++++++++---------- 1 file changed, 86 insertions(+), 63 deletions(-) diff --git a/docs/design/2024-08-27-traffic-replay.md b/docs/design/2024-08-27-traffic-replay.md index c16af8ea..d1c8d33c 100644 --- a/docs/design/2024-08-27-traffic-replay.md +++ b/docs/design/2024-08-27-traffic-replay.md @@ -14,14 +14,15 @@ There are some cases when users want to capture the traffic on the production cl - When the cluster runs unexpectedly, users want to capture the traffic so that they can investigate it later by replaying the traffic. - Test the maximum throughput of a scaled-up or scaled-down cluster using the real production workload instead of standard bench tools. -Some traffic replay tools are widely used, including tcpcopy, mysql-replay, and query-playback. Tcpcopy and mysql-replay capture data like tcpdump, while query-playback is based on slow logs. Although some of them are built for MySQL, deploying them on the proxy instance also works. +Some traffic replay tools are widely used, including tcpcopy, mysql-replay, and query-playback. Mysql-replay relies on tcpdump and tcpcopy captures traffic like tcpdump, while query-playback is based on slow logs. Although some of them are built for MySQL, deploying them on the proxy instance also works. However, they have some limitations: - Hard to deploy and use. For example, the tools may sometimes fail to be compiled, or take too long to preprocess the captured traffic files. - Tcpcopy only captures new connections, which is unfriendly for persistent connections. Mysql-replay can capture existing connections but it loses session states such as prepared statements and session variables, which may make replay fail. -- The tools replay the traffic with one username and one current schema, which requires modification to the testing cluster. +- The tools replay the traffic within one schema, requiring huge modifications to the testing cluster. +- The tcpdump way doesn't record the result information or duration, while the slow log records the finish time of statements and breaks statement order. - Tcpcopy and mysql-replay don't support TLS because they can't decode the encrypted data. -- Users need to verify the results and performance manually. +- Users need to verify the correctness and performance manually. ## Goals @@ -42,8 +43,8 @@ However, they have some limitations: The basic procedure is: 1. The user creates a TiDB cluster with a new TiDB version. 2. (Optional) The user synchronizes data from the production TiDB cluster to the new cluster and then executes `ANALYZE` commands to refresh the statistics. -3. The user turns on traffic capture on the production TiDB cluster and TiProxy stores traffic to the specified directory. -4. The user turns on traffic replay on the new TiDB cluster and TiProxy replays traffic and generates a report. +3. The user turns on traffic capture on the production TiDB cluster and TiProxy stores traffic to the specified directory. The username and password should be specified. +4. The user turns on traffic replay on the testing TiDB cluster and TiProxy replays traffic and generates a report. 5. The user checks the report to see if the result is expected. vip architecture @@ -60,11 +61,26 @@ Most applications use persistent connections, so TiProxy should also capture exi Existing sessions may have states like prepared statements. For these sessions, TiProxy queries the session states by `SHOW SESSION_STATES` and stores the states as `SET SESSION_STATES` statements in the traffic files. +`SHOW SESSION_STATES` shows all session variables, regardless of whether they have been set by the clients or not, which may miss some problems caused by changes of default session variable values. For example, a session variable has changed its default value in the new version, but TiProxy migrates the old value to the testing cluster to overwrite the default value and reports no errors. When the user migrates applications to the new version, he may find some compatibility breakers caused by the new default value. + ### Traffic Storage -TiProxy is unable to capture MySQL traffic. TiProxy can write traffic files with the same format as mysql-replay, thus it can verify the compatibility of MySQL and TiDB by replaying the traffic file of mysql-replay. However, since the username, current schema, and other session states are not recorded in the traffic files of mysql-replay, TiProxy has the same limitation as mysql-replay. +To support adding more fields in the future, the traffic file format is similar to slow logs: + +``` +# Time: 2024-01-19T16:29:48.141142Z +# Query_time: 0.01 +# Conn_ID: 123 +# Cmd_type: 3 +# Rows_sent: 1 +# Result_size: 100 +# Payload_len: 8 +SELECT 1 +``` + +To replay the statements in the same order, the statements should be ordered by the start time. So the field `Time` indicates the start time instead of the end time. To order by the start time, one statement must stay in memory until all the previous statements are finished. If a statement runs too long, it's logged without query result information, so the replay skips checking the result and duration. -It's trivial to lose traffic during failure, so TiProxy doesn't need to flush the traffic synchronously. To reduce the effect on the production cluster, TiProxy flushes the traffic in batch asynchronously with double buffering. Similarly, TiProxy loads traffic with double buffering during replaying. +It's trivial to lose traffic during failure, so TiProxy doesn't need to flush the traffic synchronously. To reduce the effect on the production cluster, TiProxy flushes the traffic in batch asynchronously with double buffering. Similarly, TiProxy loads traffic with double buffering during replaying. If the IO is too slow and the buffer accumulates too much, the capture should stop immediately and the status should be reported in UI and Grafana. The traffic files contain sensitive data, so TiProxy may need to encrypt the data. @@ -79,7 +95,7 @@ TiProxy replays traffic with the following steps: All the connections share the same username to replay. The user needs to create an account with full privilege and then specify the username and password on TiProxy. -Replaying DDL and DML statements makes the data on the testing cluster dirty, which requires another import if the replay needs to be executed again. To avoid this, TiProxy should support a statement filter, which allows read-only statements to be replayed. +Replaying DDL and DML statements makes the data on the testing cluster dirty, which requires another import if the replay needs to be executed again. To avoid this, TiProxy should support a statement filter, which allows read-only statements to be replayed. TiProxy may not parse the statement correctly because its version decouples with the TiDB version, so it normalizes the statement and simply searches for keywords such as `SELECT`, `UNION`, and `FOR UPDATE` to judge whether the statement is read-only. When replaying commands, we support multiple speed options: - Replay with the same speed as the production cluster. Since the command timestamps are recorded in the traffic files, TiProxy can replay with the same speed. It can simulate the production workload. @@ -98,37 +114,82 @@ TiProxy supports more kinds of comparison than existing tools: - Compare the response size to verify the result set size. An alternative is to verify the checksum of the result set but it affects performance more. - Compare the response time to verify performance degradation. The warning is reported only when degradation is too severe to avoid generating too many warnings. -The above warning types are written into 4 report files respectively. The warnings should be grouped by the statement digest because a failed statement may be reported a thousand times and hard to troubleshoot. To output the count of each statement together with the statements, the report should stay in TiProxy memory until the replay finishes. +Now that TiProxy has a fully privileged account to access TiDB on the testing cluster, it can store the report in TiDB tables. Showing in tables brings more advantages than storing it in files: +- Support complex operations such as filtering, aggregating, and ordering +- TiProxy can insert a failed statement to the table and then update the execution count periodically to reduce memory usage -Besides the warnings, another report file contains a summary describing the count of each kind of warning, plus the count of latency increases and decreases. +The above warning types are written into 4 tables respectively. The warnings should be grouped by the statement digest. The table definitions: -If the user only needs to verify the success of statement execution, he doesn't need to import data and TiProxy only needs to verify the packet header. Thus, the verification options should be configurable. +```sql +create table tiproxy_traffic_replay.summary( + failed_count int, + failed_stmt_types int, + faster_stmt_count int, + slower_stmt_count int, + result_mismatches int); + +# the statements that failed to run +create table tiproxy_traffic_replay.fails( + digest varchar(128), + sample_stmt text, + sample_capture_time timestamp, + sample_replay_time timestamp, + count int, + err_msg text, + primary key(digest)); + +# the statements that are much slower +create table tiproxy_traffic_replay.slow( + digest varchar(128), + sample_stmt text, + sample_capture_time timestamp, + sample_replay_time timestamp, + count int, + ratio float, + primary key(digest)); + +# the statements that results mismatch +create table tiproxy_traffic_replay.mismatch( + digest varchar(128), + sample_stmt text, + sample_capture_time timestamp, + sample_replay_time timestamp, + count int, + expected_rows int, + actual_rows int, + expected_size int, + actual_size int, + primary key(digest)); + ``` -TiProxy stores the report into report files, the path of which is also specified. +If the user only needs to verify the success of statement execution, he doesn't need to import data and TiProxy only needs to verify the packet header. Thus, the verification options should be configurable. ### User Interface To capture traffic, one needs to turn it on and then turn it off or specify a duration. -It's not intuitive to update the configuration to turn it on and off. The best way is using SQL. Since TiProxy doesn't parse SQL, TiDB parses SQL and sends the command through TiProxy HTTP API. +It's not intuitive to update the configuration to turn it on and off. A better way is using SQL. Since TiProxy doesn't parse SQL, TiDB parses SQL and sends the command through TiProxy HTTP API. The HTTP API is as follows: ```http -PUT /api/traffic/capture/start?output=/tmp/traffic&duration=1h&compression=zstd&encryption=true +PUT /api/traffic/capture/start?output=/tmp/traffic.log&duration=1h&encryption=true PUT /api/traffic/capture/stop -PUT /api/traffic/replay/start?&input=/tmp/traffic&report=/tmp/result&compression=zstd&encryption=true +PUT /api/traffic/replay/start?username=u1&password=123456&input=/tmp/traffic.log&encryption=true PUT /api/traffic/replay/stop -# show the current progress of running catpure or replay jobs GET /api/traffic/jobs ``` -The TiProxyCtl commands: +The `jobs` shows: +- The current progress of the running catpure or replay job if the there's one running +- The last run time, final progress, and error message if a job has finished + +To be compatible with lower versions, we also support using TiProxyCtl. The TiProxyCtl commands: ```shell -tiproxyctl traffic capture start output=/tmp/traffic duration=1h compression=zstd encryption=true +tiproxyctl traffic capture start --output="/tmp/traffic.log" --duration=1h encryption=true tiproxyctl traffic capture stop -tiproxyctl traffic replay start input=/tmp/traffic report=/tmp/result compression=zstd encryption=true +tiproxyctl traffic replay start --username="u1" --password="123456" --input="/tmp/traffic.log" --encryption=true tiproxyctl traffic replay stop tiproxyctl traffic jobs ``` @@ -136,9 +197,9 @@ tiproxyctl traffic jobs The SQL statements: ```SQL -ADMIN TRAFFIC CAPTURE START OUTPUT="/tmp/traffic" DURATION="1h" COMPRESSION="zstd" ENCRYPTION=true +ADMIN TRAFFIC CAPTURE START OUTPUT="/tmp/traffic.log" DURATION="1h" ENCRYPTION=true ADMIN TRAFFIC CAPTURE STOP -ADMIN TRAFFIC REPLAY START INPUT="/tmp/traffic" COMPRESSION="zstd" ENCRYPTION=true REPORT="/tmp/result" +ADMIN TRAFFIC REPLAY START USERNAME="u1" PASSWORD="123456" INPUT="/tmp/traffic.log" ENCRYPTION=true ADMIN TRAFFIC REPLAY STOP ADMIN TRAFFIC JOBS ``` @@ -155,51 +216,13 @@ It's less flexible than the offline mode: - It's almost impossible to replay traffic when the production cluster behaves unexpectedly because the testing cluster is not ready. - If the test result is unexpected and the replication needs to be scheduled again, the performance of the production cluster is affected again. -## Future works +### Be Compatible with mysql-replay -### Store the Report to TiDB +In terms of the format of traffic files, TiProxy is better to be compatible with mysql-replay so that it's able to verify the compatibility of MySQL and TiDB, but the format of mysql-replay traffic files is not extensible and hard to be compatible with. It's more practicable for TiProxy to transform the tcpdump `pcap` files into its own format. -Now that TiProxy has a fully privileged account to access TiDB on the testing cluster, another choice is to store the report in TiDB tables. Showing the report in a structured format will be more straightforward and brings more advantages: -- Support operations such as filtering and aggregating -- TiProxy can output to the table streamingly to reduce memory usage +However, since the current schema and other session states are not recorded in the traffic files, TiProxy has the same limitation as other replay tools. -The table definitions: - -```sql -create table traffic_replay.summary( - failed_count int, - failed_stmt_types int, - faster_stmt_count int, - slower_stmt_count int, - result_mismatches int); - -# the statements that failed to run -create table traffic_replay.fails( - digest varchar(128), - sample_stmt text, - count int, - err_msg text, - primary key(digest)); - -# the statements that are much slower -create table traffic_replay.slow( - digest varchar(128), - sample_stmt text, - count int, - ratio float, - primary key(digest)); - -# the statements that results mismatch -create table traffic.mismatch( - digest varchar(128), - sample_stmt text, - count int, - expected_rows int, - actual_rows int, - expected_size int, - actual_size int, - primary key(digest)); -``` +## Future works ### Provide GUI with TiDB Dashboard From 817321114af79146b7c69331a226ccaab65c86c4 Mon Sep 17 00:00:00 2001 From: djshow832 Date: Fri, 25 Oct 2024 17:12:29 +0800 Subject: [PATCH 3/3] add more future works --- docs/design/2024-08-27-traffic-replay.md | 137 +++++++++++++++++------ 1 file changed, 103 insertions(+), 34 deletions(-) diff --git a/docs/design/2024-08-27-traffic-replay.md b/docs/design/2024-08-27-traffic-replay.md index d1c8d33c..03e8c30c 100644 --- a/docs/design/2024-08-27-traffic-replay.md +++ b/docs/design/2024-08-27-traffic-replay.md @@ -63,6 +63,11 @@ Existing sessions may have states like prepared statements. For these sessions, `SHOW SESSION_STATES` shows all session variables, regardless of whether they have been set by the clients or not, which may miss some problems caused by changes of default session variable values. For example, a session variable has changed its default value in the new version, but TiProxy migrates the old value to the testing cluster to overwrite the default value and reports no errors. When the user migrates applications to the new version, he may find some compatibility breakers caused by the new default value. +Some commands should be filtered: +- `COM_CHANGE_USER`, which contains encrypted passwords. +- `CREATE USER`, `ALTER USER`, `SET PASSWORD`, and `GRANT` statements, which may contain user passwords. +- `SET GLOBAL tidb_cloud_storage_url`, `BACKUP`, `RESTORE`, and `IMPORT` statements, which expose cloud URLs. + ### Traffic Storage To support adding more fields in the future, the traffic file format is similar to slow logs: @@ -82,7 +87,7 @@ To replay the statements in the same order, the statements should be ordered by It's trivial to lose traffic during failure, so TiProxy doesn't need to flush the traffic synchronously. To reduce the effect on the production cluster, TiProxy flushes the traffic in batch asynchronously with double buffering. Similarly, TiProxy loads traffic with double buffering during replaying. If the IO is too slow and the buffer accumulates too much, the capture should stop immediately and the status should be reported in UI and Grafana. -The traffic files contain sensitive data, so TiProxy may need to encrypt the data. +The traffic files contain sensitive data, so TiProxy may need to encrypt the data. The encrypt algorithm is AES-256-CTR. Besides, the files are rotated and compressed every 300MB to reduce the effect of data leak. To fully simulate the real workload, users may capture the traffic of days, so TiProxy also needs to compress data or store data on object storage systems. @@ -93,7 +98,14 @@ TiProxy replays traffic with the following steps: 2. Replay the session states with `SET SESSION_STATES` statement in the traffic file. 3. Replay the commands one by one. -All the connections share the same username to replay. The user needs to create an account with full privilege and then specify the username and password on TiProxy. +All the connections share the same username to replay. The user needs to create an account with full privilege and then specify the username and password on TiProxy. Thus, a COM_CHANGE_USER command should be modified to change to the same user and it's just used to clear the session states. + +The failed statements will be reported to the user. The command COM_STMT_EXECUTE contains the prepared statement ID but TiProxy needs to know the text, so TiProxy should maintain the mapping of prepared statements ID and text in memory. It does the following things: +- Initialize the prepared statements through the statement `SET SESSION_STATES` +- Add a prepared statement when `COM_STMT_PREPARE` succeeds +- Remove a prepared statement when `COM_STMT_CLOSE` succeeds +- Record the parameter when `COM_STMT_SEND_LONG_DATA` succeeds and clear the parameter when `COM_STMT_RESET` or `COM_STMT_EXECUTE` succeeds +- Fill the parameters into the prepared statement text when reporting the SQL text to the user Replaying DDL and DML statements makes the data on the testing cluster dirty, which requires another import if the replay needs to be executed again. To avoid this, TiProxy should support a statement filter, which allows read-only statements to be replayed. TiProxy may not parse the statement correctly because its version decouples with the TiDB version, so it normalizes the statement and simply searches for keywords such as `SELECT`, `UNION`, and `FOR UPDATE` to judge whether the statement is read-only. @@ -111,12 +123,14 @@ If the statement is too large, such as batch insert, reading the whole command a TiProxy supports more kinds of comparison than existing tools: - Compare the response packet header to verify whether the execution succeeds. - Compare the response packet number to verify the returned row number. -- Compare the response size to verify the result set size. An alternative is to verify the checksum of the result set but it affects performance more. +- Compare the response size to verify the result set size. +- Compare the checksum of the result set to verify the correctness strictly, including the row order, but it affects performance more. - Compare the response time to verify performance degradation. The warning is reported only when degradation is too severe to avoid generating too many warnings. Now that TiProxy has a fully privileged account to access TiDB on the testing cluster, it can store the report in TiDB tables. Showing in tables brings more advantages than storing it in files: - Support complex operations such as filtering, aggregating, and ordering - TiProxy can insert a failed statement to the table and then update the execution count periodically to reduce memory usage +- It's easy to export a table into a file, but it's hard to import a file into a table The above warning types are written into 4 tables respectively. The warnings should be grouped by the statement digest. The table definitions: @@ -128,40 +142,56 @@ create table tiproxy_traffic_replay.summary( slower_stmt_count int, result_mismatches int); +# other errors, such as network errors and handshake errors +create table tiproxy_traffic_replay.other_errors( + err_type text primary key, + sample_err_msg text, + sample_replay_time timestamp, + count bigint, + ) + # the statements that failed to run -create table tiproxy_traffic_replay.fails( +create table tiproxy_traffic_replay.fail( + cmd_type varchar(32), digest varchar(128), sample_stmt text, + sample_err_msg text, + sample_conn_id bigint, sample_capture_time timestamp, sample_replay_time timestamp, - count int, - err_msg text, - primary key(digest)); + count bigint, + primary key(cmd_type, digest)); # the statements that are much slower create table tiproxy_traffic_replay.slow( + cmd_type varchar(32), digest varchar(128), sample_stmt text, + sample_conn_id bigint, sample_capture_time timestamp, sample_replay_time timestamp, - count int, + count bigint, ratio float, - primary key(digest)); + primary key(cmd_type, digest)); # the statements that results mismatch create table tiproxy_traffic_replay.mismatch( + cmd_type varchar(32), digest varchar(128), sample_stmt text, + sample_conn_id bigint, sample_capture_time timestamp, sample_replay_time timestamp, - count int, - expected_rows int, - actual_rows int, - expected_size int, - actual_size int, - primary key(digest)); + count bigint, + expected_rows bigint, + actual_rows bigint, + expected_size bigint, + actual_size bigint, + primary key(cmd_type, digest)); ``` +A previous replay may run before, so all the tables should be cleared before a new replay. + If the user only needs to verify the success of statement execution, he doesn't need to import data and TiProxy only needs to verify the packet header. Thus, the verification options should be configurable. ### User Interface @@ -173,37 +203,38 @@ It's not intuitive to update the configuration to turn it on and off. A better w The HTTP API is as follows: ```http -PUT /api/traffic/capture/start?output=/tmp/traffic.log&duration=1h&encryption=true -PUT /api/traffic/capture/stop -PUT /api/traffic/replay/start?username=u1&password=123456&input=/tmp/traffic.log&encryption=true -PUT /api/traffic/replay/stop -GET /api/traffic/jobs +curl -X POST "localhost:3080/api/traffic/capture" -d "duration=1m&output=/tmp/traffic" +curl -X POST "localhost:3080/api/traffic/replay" -d "input=/tmp/traffic&speed=1.0&username=root&password=123456" +curl -X POST "localhost:3080/api/traffic/cancel" +curl -X GET "localhost:3080/api/traffic/show" ``` -The `jobs` shows: -- The current progress of the running catpure or replay job if the there's one running +The arguments `input` and `output` specify the directory where traffic files are placed. A filename is enough for the current design, but a directory is more extensible because it can reserve more files storing metrics and traffic metadata. + +The argument `show` shows: +- The current progress of the running capture or replay job if there's one running - The last run time, final progress, and error message if a job has finished -To be compatible with lower versions, we also support using TiProxyCtl. The TiProxyCtl commands: +We also support TiProxy Control to be compatible with lower versions. The TiProxy Control commands: ```shell -tiproxyctl traffic capture start --output="/tmp/traffic.log" --duration=1h encryption=true -tiproxyctl traffic capture stop -tiproxyctl traffic replay start --username="u1" --password="123456" --input="/tmp/traffic.log" --encryption=true -tiproxyctl traffic replay stop -tiproxyctl traffic jobs +tiproxyctl --curls 127.0.0.1:3080 traffic capture --output="/tmp/traffic" --duration=1h encryption=true +tiproxyctl --curls 127.0.0.1:3080 traffic replay --speed=1.0 --username="u1" --password="123456" --input="/tmp/traffic" --encryption=true +tiproxyctl --curls 127.0.0.1:3080 traffic cancel +tiproxyctl --curls 127.0.0.1:3080 traffic show ``` The SQL statements: ```SQL -ADMIN TRAFFIC CAPTURE START OUTPUT="/tmp/traffic.log" DURATION="1h" ENCRYPTION=true -ADMIN TRAFFIC CAPTURE STOP -ADMIN TRAFFIC REPLAY START USERNAME="u1" PASSWORD="123456" INPUT="/tmp/traffic.log" ENCRYPTION=true -ADMIN TRAFFIC REPLAY STOP -ADMIN TRAFFIC JOBS +ADMIN TRAFFIC CAPTURE OUTPUT="/tmp/traffic" DURATION="1h" ENCRYPTION=true +ADMIN TRAFFIC REPLAY USERNAME="u1" PASSWORD="123456" INPUT="/tmp/traffic" SPEED=1.0 ENCRYPTION=true +ADMIN TRAFFIC CANCEL +ADMIN TRAFFIC SHOW ``` +The capture and replay operations should be logged for audit. + ## Alternatives ### Replicate Traffic Online @@ -228,4 +259,42 @@ However, since the current schema and other session states are not recorded in t Offering GUI on the TiDB Dashboard is more friendly than providing SQL. Dashboard can send HTTP requests to TiProxy directly so it doesn't require SQL. Besides, showing the report on GUI is more straightforward. -However, the TiDB Dashboard is unavailable on the cloud, limiting the scope. We may support it later if self-managed users really want it. \ No newline at end of file +However, the TiDB Dashboard is unavailable on the cloud, limiting the scope. We may support it later if self-managed users really want it. + +### Authenticate with Certificates + +When replaying traffic, all connections use the same username. It has 2 disadvantages: +- It can't test the privilege system where each user can only access some databases. +- It can't test resource control where each user belongs to a resource group. + +A better way is to replay with the same username as the captured connections. One way is to use session tokens. However, in the current session token design, the session token has a very short lifetime, which may expire when replaying traffic. Besides, users are required to copy the session certificates to the testing cluster. + +The best way is to skip authentication when TiDB recognizes that the client is TiProxy. TiUP or users should generate a TLS certificate with a common name that is in the TiDB allow list. + +### Compare Cluster Info + +TiProxy can compare more things: +- Prometheus metrics, such as CPU, memory, duration, and QPS +- Global variables and default session variable values +- Configurations +- SQL plans + +### Update Speed Online + +To test the maximum throughput of the testing cluster, users now need to update the speed for each replay and then recover the data for the next replay. It's annoying. + +We can support update speed when the replay is ongoing, so that the updates can be done in only one replay and no need to recover the data. + +Furthermore, TiProxy can update the speed periodically and show a table of duration and QPS for each speed. Beyond that, it can decide the idea speed and QPS. + +### Capture Automatically Based on Rules + +When the cluster runs improperly, the user may not notice it in time and doesn't capture the workload. It would be helpful if TiProxy could detect the exception and capture the traffic automatically. + +Users can set various rules describing when to capture traffic, such as when TiDB CPU is too high, or TiDB reports too many errors. Since the success of the response is recorded, it's more convenient to troubleshoot. + +### Support Multiple TiProxy Instances + +In K8s deployment, there are typically multiple TiProxy instances. It's annoying to capture traffic on each TiProxy, copy all the traffic files, and then replay traffic on each TiProxy. We can support writing traffic files to object storage. Each TiProxy writes to a directory named by its address. + +To replay, it's straightforward that each TiProxy chooses one directory to replay. This requires the production and testing cluster's TiProxy instance counts to be the same. If false, a hash algorithm should map the TiProxy address and connection ID of the captured traffic to one TiProxy instance. \ No newline at end of file