Skip to content

STATS (statistics)

malongshuai edited this page Jul 8, 2018 · 4 revisions

The stats database

这个数据库包含了ProxySQL收集的关于其内部功能的指标。通过这个数据库,你可以知道触发某个计数器的频率,途经ProxySQL的查询执行次数等等。

使用admin-stats_credentials用户连接到Admin管理接口也可以访问这个schema。

通常,这个库中的表是在对它们进行SQL查询的时候,临时检查内存数据库来填充的。

stats中包含的表有:

Admin> show tables from stats;
+--------------------------------+
| tables                         |
+--------------------------------+
| stats_mysql_query_rules        |
| stats_mysql_commands_counters  |
| stats_mysql_processlist        |
| stats_mysql_connection_pool    |
| stats_mysql_query_digest       |
| stats_mysql_query_digest_reset |
| stats_mysql_global             |
+--------------------------------+
7 rows in set (0.00 sec)

各表的作用:

  • stats_mysql_query_rules - 每个查询规则被查询语句匹配的次数。
  • stats_mysql_commands_counters - 每种类型的SQL命令(例如UPDATE, DELETE, TRUNCATE等)已执行的次数,以及它们执行时花费的时间。
  • stats_mysql_processlist - 模仿MySQL命令"SHOW PROCESSLIST"结果的表。该表集合了所有后端的信息。
  • stats_mysql_connection_pool - 包含和每个主机组中每个后端节点的连接池使用情况相关的统计数据。
  • stats_mysql_query_digest - 该表包含通过ProxySQL路由出去的各类查询相关统计数据。查询的类指的是参数相同,值不同的查询,只要参数相同,这部分参数就会计算成十六进制的hash部分,并通过"?"替代这些参数(译注:select * from t where id=?)。这样一来,就能将各个查询语句进行分类。
  • stats_mysql_query_digest_reset - 和stats_mysql_query_digest完全一致,但查询它时会自动将内部统计数据重置为0。某些情况下,这是很有用的技术。例如,做了一个配置修改,需要比较修改前后的统计数据。还可以通过定期查询该表来了解一段时间内的负荷的变化情况。由于ProxySQL有一个内部数据库,所以也可以将该表数据保存到内部表中。
  • stats_mysql_global - 全局统计数据,例如查询的总数量、成功连接的总数量等。计划在将来版本中增加该表中变量的数量,以便统计更多全局数据。

stats_mysql_query_rules

以下是创建表stats_mysql_query_rules的语句:

CREATE TABLE stats_mysql_query_rules (
    rule_id INTEGER PRIMARY KEY,
    hits INT NOT NULL
)

各字段的意义如下:

  • rule_id - 规则的id,通过该字段,可以和main.mysql_query_rules表在rule_id字段上进行联接。
  • hits - 该规则被匹配命中的总次数。每当一个查询匹配到该规则时,命中数就加1。

stats_mysql_commands_counters

以下是创建stats_mysql_commands_counters表的语句:

CREATE TABLE stats_mysql_commands_counters (
    Command VARCHAR NOT NULL PRIMARY KEY,
    Total_Time_us INT NOT NULL,
    Total_cnt INT NOT NULL,
    cnt_100us INT NOT NULL,
    cnt_500us INT NOT NULL,
    cnt_1ms INT NOT NULL,
    cnt_5ms INT NOT NULL,
    cnt_10ms INT NOT NULL,
    cnt_50ms INT NOT NULL,
    cnt_100ms INT NOT NULL,
    cnt_500ms INT NOT NULL,
    cnt_1s INT NOT NULL,
    cnt_5s INT NOT NULL,
    cnt_10s INT NOT NULL,
    cnt_INFs
)

各字段的意义:

  • command - SQL命令的类型,例如: FLUSH, INSERT, KILL, SELECT FOR UPDATE等。
  • Total_Time_us - 执行命令所花的时间长度(单位毫秒)。
  • total_cnt - 每种类型的SQL命令总共执行的次数。
  • cnt_100us, cnt_500us, ..., cnt_10s, cnt_INFs - 某种类型SQL命令的"执行所花时间在给定时间段内"的数量。例如,cnt_500us指的是执行所花时间在100微秒到500微秒内的命令数量(因为存在cnt_100us字段)。cnt_INFs是执行时间超过10秒的命令数量。

注意:只有当全局变量mysql-commands_stats设置为true时,才会统计该表中的数据。默认情况下,这个全局变量是开启的,还用于处理其它查询。建议不要禁用该全局变量。

stats_mysql_processlist

以下是创建stats_mysql_processlist表的语句:

CREATE TABLE stats_mysql_processlist (
    ThreadID INT NOT NULL,
    SessionID INTEGER PRIMARY KEY,
    user VARCHAR,
    db VARCHAR,
    cli_host VARCHAR,
    cli_port VARCHAR,
    hostgroup VARCHAR,
    l_srv_host VARCHAR,
    l_srv_port VARCHAR,
    srv_host VARCHAR,
    srv_port VARCHAR,
    command VARCHAR,
    time_ms INT NOT NULL,
    info VARCHAR
)

各字段的意义:

  • ThreadID - ProxySQL的内部的线程ID,这些线程ID从0开始递增。
  • SessionID - ProxySQL内部的全局会话id,或者说是和前端客户端建立的连接id。通过这个id可以很轻松地区分出每个会话,例如要杀掉某个会话、要监控某个会话。
  • user - MySQL客户端连接到ProxySQL使用的user。
  • db - 当前使用的schema。
  • cli_host, cli_port - MySQL客户端和ProxySQL建立的连接所使用的地址和端口(host, port)。(译注:是客户端的套接字地址)
  • hostgroup - 当前的主机组。如果是正在执行的查询,则该主机组是查询需要路由到的位置(它可能是默认主机组)。默认情况下,路由的目标主机组是依据MySQL客户端连接ProxySQL时所使用的用户名决定的(各用户的默认主机组定义在mysql_users表中,但通过修改查询规则mysql_query_rules可以基于查询来决定路由目标)
  • l_srv_host, l_srv_port - 本地ProxySQL端和后端MySQL建立的TCP连接所使用的地址和端口号(host, port)。(译注:是ProxySQL本地端的套接字地址)
  • srv_host, srv_port - 后端MySQL监听TCP连接的地址(host, port)。
  • command - 正在执行的查询命令类型。
  • time_ms - 查询处于当前状态到目前为止已经持续了多长时间(单位毫秒)。
  • info - 实际被执行的查询语句。

注意,这个表中的结果只是当前正在执行的查询的一个快照状态。第二次查询该表,可能数据会不同。

以下是该表的一个示例数据结果:

mysql> select * from stats_mysql_processlist;
+----------+-----------+------+------+-----------+----------+-----------+------------+------------+-----------+----------+---------+---------+---------------------------------------+
| ThreadID | SessionID | user | db   | cli_host  | cli_port | hostgroup | l_srv_host | l_srv_port | srv_host  | srv_port | command | time_ms | info                                  |
+----------+-----------+------+------+-----------+----------+-----------+------------+------------+-----------+----------+---------+---------+---------------------------------------+
| 3        | 1         | root | test | 127.0.0.1 | 51831    | 0         | 127.0.0.1  | 55310      | 127.0.0.1 | 3306     | Query   | 0       | SELECT c FROM sbtest1 WHERE id=198898 |
| 0        | 2         | root | test | 127.0.0.1 | 51832    | 0         | 127.0.0.1  | 55309      | 127.0.0.1 | 3306     | Query   | 0       | SELECT c FROM sbtest3 WHERE id=182586 |
| 2        | 3         | root | test | 127.0.0.1 | 51833    | 0         | 127.0.0.1  | 55308      | 127.0.0.1 | 3306     | Query   | 0       | SELECT c FROM sbtest1 WHERE id=199230 |
| 1        | 4         | root | test | 127.0.0.1 | 51834    | 0         | 127.0.0.1  | 55307      | 127.0.0.1 | 3306     | Query   | 0       | SELECT c FROM sbtest2 WHERE id=201110 |
+----------+-----------+------+------+-----------+----------+-----------+------------+------------+-----------+----------+---------+---------+---------------------------------------+
4 rows in set (0.02 sec)

注意: ProxySQL也支持SHOW PROCESSLISTSHOW FULL PROCESSLIST命令来返回当前会话相关的信息。

stats_mysql_connection_pool

以下是创建stats_mysql_connection_pool表的语句:

CREATE TABLE stats_mysql_connection_pool (
    hostgroup VARCHAR,
    srv_host VARCHAR,
    srv_port VARCHAR,
    status VARCHAR,
    ConnUsed INT,
    ConnFree INT,
    ConnOK INT,
    ConnERR INT,
    Queries INT,
    Bytes_data_sent INT,
    Bytes_data_recv INT,
    Latency_us INT)

组中的每一行都代表组中的一个节点。

各字段的意义如下:

  • hostgroup - 该后端节点所在的组。注意,一个后端节点可以同时属于多个组。
  • srv_host, srv_port - 后端MySQL节点监听TCP连接的地址和端口。
  • status - 后端节点的状态。可能值为:ONLINE, SHUNNED, OFFLINE_SOFT, OFFLINE_HARD。详细信息以及各状态的意义,见mysql_servers表。
  • ConnUsed - ProxySQL当前使用了多少个连接来发送查询给该后端节点。
  • ConnFree - 当前和该后端有多少个空闲连接。这些空闲连接保持打开状态,以便稍后能尽快且尽量少开销地发送查询给该后端节点。
  • ConnOK - 和该后端已成功建立的连接数量。
  • ConnERR - 和该后端未成功建立的连接数量。
  • Queries - 路由到该后端节点的查询总数。
  • Bytes_data_sent - 已发送给该后端节点的字节总数。不包括元数据(数据包的包头)。
  • Bytes_data_recv - 已发送给该后端节点的字节总数。不包括元数据(数据包的包头、OK/ERR数据包,数据包的字段描述符等)。
  • Latency_us - Monitor模块发起ping检查时报告的当前ping时间,单位微秒。

stats_mysql_query_digest and stats_mysql_query_digest_reset

以下是创建stats_mysql_query_digest表的语句:

CREATE TABLE stats_mysql_query_digest (
    hostgroup INT,
    schemaname VARCHAR NOT NULL,
    username VARCHAR NOT NULL,
    digest VARCHAR NOT NULL,
    digest_text VARCHAR NOT NULL,
    count_star INTEGER NOT NULL,
    first_seen INTEGER NOT NULL,
    last_seen INTEGER NOT NULL,
    sum_time INTEGER NOT NULL,
    min_time INTEGER NOT NULL,
    max_time INTEGER NOT NULL,
    PRIMARY KEY(schemaname, username, digest)
)

每一行代表一类(参数相同,但值不同)通过ProxySQL路由的查询。例如:

mysql> select * from stats_mysql_query_digest order by count_star desc limit 2;
+------------+----------+--------------------+----------------------------------+------------+------------+------------+------------+----------+----------+
| schemaname | username | digest             | digest_text                      | count_star | first_seen | last_seen  | sum_time   | min_time | max_time |
+------------+----------+--------------------+----------------------------------+------------+------------+------------+------------+----------+----------+
| test       | root     | 0x7721D69250CB40   | SELECT c FROM sbtest3 WHERE id=? | 8122800    | 1441091306 | 1441101551 | 7032352665 | 1010     | 117541   |
| test       | root     | 0x3BC2F7549D058B6F | SELECT c FROM sbtest4 WHERE id=? | 8100134    | 1441091306 | 1441101551 | 7002512958 | 101      | 102285   |
+------------+----------+--------------------+----------------------------------+------------+------------+------------+------------+----------+----------+

各字段的意义:

  • hostgroup - 查询将要路由到的目标主机组。如果值为-1,则表示命中了查询缓存,直接从缓存取数据返回给客户端。
  • schemaname - 当前正在执行的查询所在的schema名称。
  • username - MySQL客户端连接到ProxySQL使用的用户名。
  • digest - 一个十六进制的hash值,唯一地代表除了参数部分的查询语句(译注:从上面示例结果中可以看到,0x...代表的是除了id=??部分的语句,这样一来,对digest匹配就表示对这类语句进行精确匹配)。
  • count_star - 该查询(参数相同、值不同)总共被执行的次数。
  • first_seen - unix格式的timestamp时间戳,表示该查询首次被ProxySQL路由出去的时间点。
  • last_seen - unix格式的timestamp时间戳,到目前为止,上一次该查询被ProxySQL路由出去的时间点。
  • sum_time - 执行该类查询所花的总时间(单位微秒)。在想要找出程序中哪部分语句消耗时间最长的语句时非常有用,此外根据这个结果还能提供一个如何提升性能的良好开端。
  • min_time, max_time - 执行该类查询的预期时间范围。min_time表示的是目前为止执行该类查询所花的最短时间,max_time则是目前为止,执行该类查询所花的最长时间,单位都是微秒。

注意,该表中的查询所花时长是指ProxySQL从接收到客户端查询开始,到ProxySQL准备向客户端发送查询结果的时长。因此,这些时间更像是客户端看到的发起、接收的时间间隔(尽管客户端到服务端数据传输也需要时间)。更精确一点,在执行查询之前,ProxySQL可能需要更改字符集或模式,可能当前后端不可用(当前后端执行语句失败)而找一个新的后端,可能因为所有连接都繁忙而需要等待空闲连接。这些都不应该计算到查询执行所花时间内。

注意:只有当全局变量mysql-query_digests=true时,才会统计stat_mysql_query_digest中的数据。该全局变量默认已开启,不建议将其禁用。

stats_mysql_query_digest_reset和上面的表内容、结构完全一致,但每次查询该表后都会自动将内部统计数据重置为0。

stats_mysql_global

以下是创建stats_mysql_global表的语句:

CREATE TABLE stats_mysql_global (
    Variable_Name VARCHAR NOT NULL PRIMARY KEY,
    Variable_Value VARCHAR NOT NULL
)

每行代表一个ProxySQL层与后端MySQL的全局统计数据,包含的变量有:

  • Client_Connections_aborted - 前端和ProxySQL建立连接时由于凭据错误或达到 max_connections 而中断的连接数量。
  • Client_Connections_connected - 当前前端和ProxySQL已建立的连接数量。
  • Client_Connections_created - 到目前为止,前端和ProxySQL已经成功建立过多少个连接。
  • Questions - 前端已经发送过多少个查询。
  • Slow_queries - 查询执行时间超过全局变量mysql-long_query_time所定义的阈值的查询数量。

使用 SHOW MYSQL STATUS 命令可以获取相关的输出结果。

示例:

Admin> select * from stats.stats_mysql_global;
+------------------------------+----------------+
| Variable_Name                | Variable_Value |
+------------------------------+----------------+
| Client_Connections_aborted   | 0              |
| Client_Connections_connected | 4              |
| Client_Connections_created   | 4              |
| Questions                    | 36337716       |
| Slow_queries                 | 0              |
+------------------------------+----------------+
Clone this wiki locally