ProxySQL Disk库和Stats库
转载自:https://www.jianshu.com/p/9ef815162fe9
DISK库
disk schema 用于将配置持久化到磁盘上。配置持久化后,下次重启ProxySQL时就会读取这些已被持久化的配置。
disk中的表
Admin> SHOW TABLES FROM disk;
+------------------------------+
| tables |
+------------------------------+
| mysql_servers |
| mysql_users |
| mysql_replication_hostgroups |
| mysql_query_rules |
| global_variables |
| mysql_collations |
| scheduler |
+------------------------------+
7 rows in set (0.00 sec)
这些表完全对应于内存数据库中的表,只不过在ProxySQL重启或崩溃时,内存中的这些表会丢失,而磁盘数据库中的这些表不会丢失。
STATS库(statistics)
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 PROCESSLIST和SHOW 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 和 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 |
+------------------------------+----------------+
ProxySQL Disk库和Stats库的更多相关文章
- Scipy教程 - 统计函数库scipy.stats
http://blog.csdn.net/pipisorry/article/details/49515215 统计函数Statistical functions(scipy.stats) Pytho ...
- 【转】iOS动态库和静态库的简要介绍
静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人 ...
- C++ 系列:静态库与动态库
转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...
- C++静态库与动态库
C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...
- 引用dll动态库,动态库中弹出对话框输入,将输入参数,作为变量继续调用。
在做支付项目时,引用动态库,动态库弹出支付宝或者微信的支付码,继而接收.最终将结果返回给调用动态库方法. 首先,动态库接收的是一个string 类型的xml,如 public string Pay(s ...
- Linux下Gcc生成和使用静态库和动态库详解(转)
一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...
- ios 开发中 动态库 与静态库的区别
使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...
- Makefile中静态库,动态库的创建和使用以及解压缩命令
应用层通过操作文件操控硬件 使用制作好的工具链: 刚开始学习时,用一些已经制作好的工具链,使用以下命令解压到gcc-3.4.5-glibc-2.3.6目录 cd /work/tools tar xjf ...
- 配置自己的OpenGL库,glew、freeglut库编译,库冲突解决(附OpenGL Demo程序)
平台:Windows7,Visual C++ 2010 1. 引言 实验室的一个项目,用到OpenGL进行实时绘制,还用到一些其他的库,一个困扰我很久的问题就是编译时遇到的各种符号未定义,符号重定义之 ...
随机推荐
- 各种Git Bash乱码解决
乱码情景一: 当使用git log 出现乱码时,修改 %GIT_HOME%\etc\gitconfig 文件,加入如下内容: [gui] encoding = utf-8[i18n] commiten ...
- 【PostgreSQL 15】PostgreSQL 15对UNIQUE和NULL的改进
用一句话来总结这种改进就是: 支持唯一性约束和索引将null值视为相同的值.之前是将null值索引成不同的值,现在可以通过使用unique nulls not distinct创建约束,将null值视 ...
- CF1703E Mirror Grid 题解
给定一个矩阵,判断最少将多少个格反转后使得旋转零度,九十度,一百八十度,二百七十度相等. 枚举矩阵每个位置是 \(0\) 还是 \(1\),若已经判断过则跳过,全统 \(1\) 和全统 \(0\) 取 ...
- 在 macOS 上搭建 Flutter 开发环境
下载 Flutter SDK flutter官网下载:https://flutter.io/sdk-archive/#macos 若上述链接无法访问,可通过GitHub下载 https://githu ...
- Vue3 生命周期 && Hooks封装 && toRef
1 # 一.Vue3.0与Vue2.0生命周期改动 2 beforDestroy改名为beforeUnmount 3 destroyed改名为unmounted 4 # Vue3.0页提供了Compo ...
- 三菱模拟量输入模块FX3U-4AD与FX3U-4AD-ADP的区别
三菱PLC模块 FX3U-4AD与FX3U-4AD-ADP同为三菱FX3U系列PLC的模拟量4通道电压/电流输入模块,其功能作用相同,在三菱FX3U系列PLC上使用起来也并无不同之处. 1.三菱PLC ...
- mysql-shell for GreatSQL 8.0.27编译安装及使用
目录 0. 前言 1. 修改说明 2. 编译mysql-shell 2.1 环境准备 2.2 开始编译mysql & mysql-shell 2.3 利用patchelf修改mysqlsh二进 ...
- 年度开源盛会 ApacheCon 首发中文盛宴来临,欢迎报名!
ApacheCon 是久负盛名的开源盛宴,为开源界备受关注的会议之一,也是开源运动早期的知名活动之一,其最早的一期要追溯 1998 年,也是在这一届上,开发 HTTPD 服务的开发者们欢聚一堂,并决定 ...
- React报错之Cannot assign to 'current' because it is a read-only property
正文从这开始~ 总览 当我们用一个null值初始化一个ref,但在其类型中不包括null时,就会发生"Cannot assign to 'current' because it is a r ...
- java学习第七天lo流.day17
lo输入