使用Prometheus监控ProxySQL
2017-07-27
最近需要把ProxySQL加入到Prometheus的监控目标里,因此需要先整理一下ProxySQL提供的监控信息。
ProxySQL内置的统计信息 #
我们先通过管理接口登录进入ProxySQL:
1mysql -u admin -P 6032 -p -h 127.0.0.1
1SHOW DATABASES;
2+-----+---------+-------------------------------+
3| seq | name | file |
4+-----+---------+-------------------------------+
5| 0 | main | |
6| 2 | disk | /var/lib/proxysql/proxysql.db |
7| 3 | stats | |
8| 4 | monitor | |
9+-----+---------+-------------------------------+
其中stats库中包含ProxysQL运行时抓取的统计信息:
1SHOW TABLES FROM stats;
2+-----------------------------------+
3| tables |
4+-----------------------------------+
5| global_variables |
6| stats_mysql_commands_counters |
7| stats_mysql_connection_pool |
8| stats_mysql_connection_pool_reset |
9| stats_mysql_global |
10| stats_mysql_processlist |
11| stats_mysql_query_digest |
12| stats_mysql_query_digest_reset |
13| stats_mysql_query_rules |
14| stats_mysql_users |
15+-----------------------------------+
1610 rows in set (0.00 sec)
需要我们重点的关注的信息都在stats_mysql_global中:
1SHOW MYSQL STATUS;(或select * from stats_mysql_global;)
2+------------------------------+----------------+
3| Variable_Name | Variable_Value |
4+------------------------------+----------------+
5| ProxySQL_Uptime | 255245 |
6| Active_Transactions | 0 |
7| Client_Connections_aborted | 0 |
8| Client_Connections_connected | 4 |
9| Client_Connections_created | 2025 |
10| Server_Connections_aborted | 0 |
11| Server_Connections_connected | 11 |
12| Server_Connections_created | 458 |
13| Client_Connections_non_idle | 4 |
14| Queries_backends_bytes_recv | 6348309 |
15| Queries_backends_bytes_sent | 51245678 |
16| Query_Processor_time_nsec | 532924901 |
17| Backend_query_time_nsec | 12057118628 |
18| mysql_backend_buffers_bytes | 141824 |
19| mysql_frontend_buffers_bytes | 262144 |
20| mysql_session_internal_bytes | 19264 |
21| Com_autocommit | 230 |
22| Com_autocommit_filtered | 230 |
23| Com_commit | 94 |
24| Com_commit_filtered | 47 |
25| Com_rollback | 18 |
26| Com_rollback_filtered | 3 |
27| Com_backend_change_user | 813 |
28| Com_backend_init_db | 78 |
29| Com_backend_set_names | 214 |
30| Com_frontend_init_db | 81 |
31| Com_frontend_set_names | 98 |
32| Com_frontend_use_db | 9 |
33| Com_stmt_prepare | 5647 |
34| Com_stmt_execute | 5647 |
35| Com_stmt_close | 5647 |
36| Mirror_concurrency | 0 |
37| Mirror_queue_length | 0 |
38| Questions | 267223 |
39| Slow_queries | 44 |
40| Servers_table_version | 15 |
41| MySQL_Thread_Workers | 4 |
42| MySQL_Monitor_Workers | 8 |
43| ConnPool_get_conn_immediate | 22 |
44| ConnPool_get_conn_success | 248710 |
45| ConnPool_get_conn_failure | 308306 |
46| SQLite3_memory_bytes | 1206488 |
47| ConnPool_memory_bytes | 641680 |
48| Stmt_Active_Total | 0 |
49| Stmt_Active_Unique | 0 |
50| Stmt_Max_Stmt_id | 35 |
51| Query_Cache_Memory_bytes | 0 |
52| Query_Cache_count_GET | 0 |
53| Query_Cache_count_GET_OK | 0 |
54| Query_Cache_count_SET | 0 |
55| Query_Cache_bytes_IN | 0 |
56| Query_Cache_bytes_OUT | 0 |
57| Query_Cache_Purged | 0 |
58| Query_Cache_Entries | 0 |
59+------------------------------+----------------+
6054 rows in set (0.00 sec)
- 连接数相关的信息:
- Client_Connections_connected
- Server_Connections_connected
- Active_Transactions
- 内存相关的信息(我们不使用ProxySQL的Query Cache所以这里不关注Query Cache的信息)
- ConnPool_memory_bytes
- SQLite3_memory_bytes
stats_mysql_connection_pool表中包含连接池统计信息:
1select * from stats_mysql_connection_pool \G
2*************************** 1. row ***************************
3 hostgroup: 2
4 srv_host: 192.168.1.3
5 srv_port: 3306
6 status: ONLINE
7 ConnUsed: 0
8 ConnFree: 2
9 ConnOK: 441
10 ConnERR: 0
11 Queries: 250492
12Bytes_data_sent: 50056378
13Bytes_data_recv: 6040259
14 Latency_us: 242
15*************************** 2. row ***************************
16......
- status是后端DB的状态
- Queries是对后端DB的请求数
- ConnUsed是对后端DB的活跃连接数
- Latency_us是对后端DB请求的网络延时
stats_mysql_processlist表中包含每个用户当前的连接信息:
1select * from stats_mysql_processlist \G
2*************************** 1. row ***************************
3 ThreadID: 0
4 SessionID: 2001
5 user: testuser
6 db: testdb
7 cli_host: 192.168.1.3
8 cli_port: 59042
9 hostgroup: 2
10l_srv_host:
11l_srv_port:
12 srv_host:
13 srv_port:
14 command: Sleep
15 time_ms: 1556
16 info:
17*************************** 2. row ***************************
18......
stats_mysql_query_diges表中是对sql的统计信息:
1 select * from stats_mysql_query_digest \G
2*************************** 1. row ***************************
3 hostgroup: 2
4 schemaname: testdb
5 username: testuser
6 digest: 0xB0288986D94B9DC2
7digest_text: SELECT * FROM t_user;
8 count_star: 1
9 first_seen: 1501233427
10 last_seen: 1501233427
11 sum_time: 361
12 min_time: 361
13 max_time: 361
14*************************** 2. row ***************************
15......
Percona ProxySQL Exporter #
有了上面这些统计信息,我们需要一个Prometheus Exporter,这样Prometheus就可以拉取监控数据了。 Percona ProxySQL Exporter是Percona提供的ProxySQL Exporter。 当前ProxySQL Exporter 1.1.0的版本支持从ProxySQL的stats_mysql_global和stats_mysql_connection_pool中收集统计信息。
ProxySQL Exporter也是Go语言写的,安装比较简单,这里是使用ansible编排的,简单贴一下我们环境中的一个ProxySQL节点上生成的systemd的单元文件:
1[Unit]
2Description=proxysql_exporter
3After=network.target
4[Service]
5Type=simple
6User=prometheus
7Environment=DATA_SOURCE_NAME=stats:stats@tcp(127.0.0.1:6032)/
8ExecStart=/home/prometheus/proxysql_exporter/proxysql_exporter \
9 -web.listen-address=:42004
10Restart=on-failure
11[Install]
12WantedBy=multi-user.target
- proxysql_exporter从环境变量
DATA_SOURCE_NAME
获取连接ProxySQL管理接口的dns信息,注意以stats用户连接 -web.listen-address
设置proxysql_exporter的监听端口,默认为42004
接下来在Prometheus的配置文件中配置收集ProxySQL信息的Job和Instance,这里还是贴一下我们的配置文件片段,实际上这个片段也是有ansible编排生成的。
1scrape_configs:
2
3 - job_name: 'proxysql'
4 static_configs:
5 - targets:
6 - 192.168.1.3:42004
7 labels:
8 instance: proxysql1
9 - targets:
10 - 192.168.1.4:42004
11 labels:
12 instance: proxysql2
重启Prometheus之后,Prometheus就可以从proxysql_exporter中收集ProxySQL的运行时信息了。
在监控图表上我们使用的Grafana,因此可以直接使用percona PMM项目中的ProxySQL Overview,将其入到Grafana即可。