MySQL Router 8.4  /  部署 MySQL Router  /  MySQL Router 设置跟踪

3.7 MySQL Router 设置跟踪

MySQL Router 支持跟踪从客户端到服务器处理的语句,以及对客户端的响应。跟踪以 JSON 格式返回。

这可以用于调试、测试、应用程序连接比较等等。

配置

要配置 ROUTER SET trace,您必须将以下内容添加到 MySQL Router 配置文件

  • max_idle_server_connections:添加到 DEFAULT 部分。这必须至少设置为 1。

  • 以下值可以添加到 DEFAULT 部分并应用于所有连接,或者您可以将其添加到要详细检查的连接的各个 ROUTING: ... 部分。

    • client_ssl_mode:设置为 PREFERREDREQUIRED

    • server_ssl_mode:设置为 PREFERRED,REQUIREDDISABLED

    • connection_sharing:设置为 1 以启用连接共享。

例如

[DEFAULT]
max_idle_server_connections=64 

[routing:{...}]
client_ssl_mode=PREFERRED 
server_ssl_mode=PREFERRED
connection_sharing=1

启用 ROUTER TRACE

ROUTER TRACE 可以在 MySQL 客户端的命令行上按会话或按语句启用。

  • 按会话启用

    ROUTER SET TRACE = 1;
  • 按会话禁用

    ROUTER SET TRACE = 0;
  • 按语句启用

    query_attributes router.trace 1;
  • 按语句禁用

    query_attributes router.trace 0;

跟踪格式

跟踪以 JSON 对象形式返回,具有以下属性

  • start_time:表示跨度开始日期和时间的字符串。

  • end_time:表示跨度结束日期和时间的字符串。

  • elapsed_in_span_us:在当前跨度中花费的微秒数。此值等于 end_time 减去 start_time

  • status_code:表示已完成跨度的规范状态代码。默认值为“”。

  • name:事件名称。

  • attributes:事件的属性。

  • events:事件数组。这些包含以下内容

    • timestamp:表示日期和时间的字符串。

    • name:事件名称。

    • attributes:事件的属性。

例如

> mysql --host=127.0.0.1 --port=6446 --show-warnings
> ROUTER SET trace = 1;
> SELECT @@port;
+--------+
| @@port |
+--------+
|   3306 |
+--------+
1 row in set, 1 warning (0,02 sec)
Note (code 4600): {
  "start_time": "2023-03-23T15:31:08.052442Z",
  "end_time": "2023-03-23T15:31:08.052653Z",
  "elapsed_in_span_us": 211,
  "name": "mysql/query",
  "attributes": {
    "mysql.sharing_blocked": false
  },
  "events": [
    {
      "timestamp": "2023-03-23T15:31:08.052444Z",
      "name": "mysql/query_classify",
      "attributes": {
        "mysql.query.classification": "change_on_tracker"
      }
    },
    {
      "start_time": "2023-03-23T15:31:08.052455Z",
      "end_time": "2023-03-23T15:31:08.052495Z",
      "elapsed_in_span_us": 39,
      "name": "mysql/connect_and_forward",
      "attributes": {
        "mysql.remote.is_connected": true,
        "mysql.remote.endpoint": "localhost:3306",
        "mysql.remote.connection_id": 17,
        "db.name": ""
      },
      "events": [
        {
          "start_time": "2023-03-23T15:31:08.052458Z",
          "end_time": "2023-03-23T15:31:08.052495Z",
          "elapsed_in_span_us": 36,
          "name": "mysql/forward"
        }
      ]
    },
    {
      "start_time": "2023-03-23T15:31:08.052623Z",
      "end_time": "2023-03-23T15:31:08.052627Z",
      "elapsed_in_span_us": 3,
      "name": "mysql/response",
      "attributes": {
        "mysql.session.@@SESSION.statement_id": "84"
      }
    }
  ]
}

跟踪事件

以下跟踪事件和属性受支持

mysql/query

MySQL Router 接收查询。

属性

  • mysql.sharing_blocked:布尔值。如果连接共享被阻止,则会显示 mysql.sharing_blocked_by 以及阻止共享的原因。

  • mysql.sharing_blocked_by:字符串。显示阻止连接共享的原因。这可能是以下值之一

    • trx-state:事务处于活动状态。

    • trx-characteristics:事务状态已设置。例如,SET TRANSACTION READ ONLY

    • some-state-changed:会话处于不可恢复状态。

    • session-track-gtidssession_track_gtids 不包含预期值。

    • session-track-state-changesession_track_state_change 不包含预期值。

    • session-track-transaction-infosession_track_state_change 不包含预期值。

mysql/query_classify

描述 MySQL Router 如何在连接共享的上下文中分析语句。

属性

  • mysql.query.classification:逗号分隔的列表,包含以下内容的零个或多个

    • accept_session_state_from_session_tracker:语句导致会话跟踪器发出通知,该通知被原样接受。

    • ignore_session_tracker_some_state_changed:语句导致会话跟踪器发出通知,该通知被忽略。

    • session_not_sharable_on_error:语句(例如 SET known_variable = 1, unknown_variable = 2)会导致会话状态发生更改,尽管该语句失败了。服务器返回错误,但没有会话跟踪器,即使会话状态发生了更改。

    • session_not_sharable_on_success:如果语句修改了会话状态,但会话跟踪器未报告它,则设置该状态。

    • forbidden_function_with_connection_sharing:语句包含在连接共享中不可能使用的函数或关键字。例如 GET DIAGNOSTICSLAST_INSERT_ID()

    • forbidden_set_with_connection_sharing:语句试图设置连接共享所需的会话跟踪器信息。

mysql/connect_and_forward

属性

  • mysql.remote.is_connected:布尔值。如果为 fale,则没有连接。如果为 true,则返回以下值

    • mysql.remote.endpoint:服务器连接端点的名称。

    • mysql.remote.connection_id:服务器连接的连接 ID。

    • db.name:架构名称。

mysql/from_pool_or_connect

属性

  • mysql.remote.candidates:逗号分隔的端点列表。

  • net.peer.name:此连接在上一会话中连接到的端点的主机名。

  • net.peer.port:此连接在上一会话中连接到的端点的端口。

mysql/from_pool

属性

  • mysql.error_message:如果 status_codeERROR,则显示该消息。

  • mysql.remote.connection_id:服务器连接的连接 ID。

mysql/connect

属性

  • net.peer.name:端点的主机名。

  • net.peer.port:端点的端口。

mysql/authenticate

属性

  • mysql.remote.needs_full_authentication:布尔值。如果需要完整握手(true),或者如果可以进行快速重置连接(false)。

    如果为 true,则后跟 mysql/change_user。如果为 false,则后跟 mysql/reset_connected

mysql/server_greeting

属性

  • mysql.remote.connection_id:服务器连接的连接 ID。

mysql/client_greeting

属性

  • db.name:架构名称。

mysql/tls_connect

属性

  • tls.version:正在使用的 TLS 版本。

  • tls.cipher:用于连接的 TLS 密码。

  • tls.session_resused:布尔值。如果 TLS 会话被重用,则为 True

mysql/response

属性

  • mysql.session.@@SESSION.*:根据服务器会话跟踪器更改的会话变量。

  • mysql.session.transaction_state:事务状态的逗号分隔列表。

  • mysql.session.transaction_characteristics:恢复事务状态所需的语句。

mysql/set_var

属性

  • mysql.session.@@SESSION.*:重新连接后恢复的会话变量。

以下事件具有与 mysql/query 相同的属性

  • mysql/ping

  • mysql/stmt_prepare

  • mysql/stmt_execute

  • mysql/kill

  • mysql/statistics

  • mysql/set_option

  • mysql/reload

  • mysql/list_fields

以下事件没有属性

  • mysql/prepare_server_connection:

  • mysql/reset_connection:

  • mysql/greeting:

  • mysql/forward:

跟踪示例

简单查询转发

以下示例显示简单查询转发跟踪

  1. MySQL Router 接收查询。

  2. MySQL Router 将查询转发到服务器。

  3. MySQL Router 等待结果。

  4. MySQL Router 将结果转发到客户端。

$ mysql --host=127.0.0.1 --port=6446 --show-warnings
> ROUTER SET trace = 1;
> SELECT @@port;
+--------+
| @@port |
+--------+
|   3306 |
+--------+
1 row in set, 1 warning (0,02 sec)
Note (code 4600): {
  "start_time": "2023-03-23T15:31:08.052442Z",
  "end_time": "2023-03-23T15:31:08.052653Z",
  "elapsed_in_span_us": 211,
  "name": "mysql/query",
  "attributes": {
    "mysql.sharing_blocked": false
  },
  "events": [
    {
      "timestamp": "2023-03-23T15:31:08.052444Z",
      "name": "mysql/query_classify",
      "attributes": {
        "mysql.query.classification": "accept_session_state_from_session_tracker"
      }
    },
    {
      "start_time": "2023-03-23T15:31:08.052455Z",
      "end_time": "2023-03-23T15:31:08.052495Z",
      "elapsed_in_span_us": 39,
      "name": "mysql/connect_and_forward",
      "attributes": {
        "mysql.remote.is_connected": true,
        "mysql.remote.endpoint": "localhost:3306",
        "mysql.remote.connection_id": 17,
        "db.name": ""
      },
      "events": [
        {
          "start_time": "2023-03-23T15:31:08.052458Z",
          "end_time": "2023-03-23T15:31:08.052495Z",
          "elapsed_in_span_us": 36,
          "name": "mysql/forward"
        }
      ]
    },
    {
      "start_time": "2023-03-23T15:31:08.052623Z",
      "end_time": "2023-03-23T15:31:08.052627Z",
      "elapsed_in_span_us": 3,
      "name": "mysql/response",
      "attributes": {
        "mysql.session.@@SESSION.statement_id": "84"
      }
    }
  ]
}