使用Prometheus监控ProxySQL

2017-07-27 阅读: ProxySQL Prometheus

最近需要把ProxySQL加入到Prometheus的监控目标里,因此需要先整理一下ProxySQL提供的监控信息。

ProxySQL内置的统计信息

我们先通过管理接口登录进入ProxySQL:

mysql -u admin -P 6032 -p -h 127.0.0.1
SHOW DATABASES;
+-----+---------+-------------------------------+
| seq | name    | file                          |
+-----+---------+-------------------------------+
| 0   | main    |                               |
| 2   | disk    | /var/lib/proxysql/proxysql.db |
| 3   | stats   |                               |
| 4   | monitor |                               |
+-----+---------+-------------------------------+

其中stats库中包含ProxysQL运行时抓取的统计信息:

SHOW TABLES FROM stats;
+-----------------------------------+
| tables                            |
+-----------------------------------+
| global_variables                  |
| stats_mysql_commands_counters     |
| stats_mysql_connection_pool       |
| stats_mysql_connection_pool_reset |
| stats_mysql_global                |
| stats_mysql_processlist           |
| stats_mysql_query_digest          |
| stats_mysql_query_digest_reset    |
| stats_mysql_query_rules           |
| stats_mysql_users                 |
+-----------------------------------+
10 rows in set (0.00 sec)

需要我们重点的关注的信息都在stats_mysql_global中:

SHOW MYSQL STATUS;(或select * from  stats_mysql_global;)
+------------------------------+----------------+
| Variable_Name                | Variable_Value |
+------------------------------+----------------+
| ProxySQL_Uptime              | 255245         |
| Active_Transactions          | 0              |
| Client_Connections_aborted   | 0              |
| Client_Connections_connected | 4              |
| Client_Connections_created   | 2025           |
| Server_Connections_aborted   | 0              |
| Server_Connections_connected | 11             |
| Server_Connections_created   | 458            |
| Client_Connections_non_idle  | 4              |
| Queries_backends_bytes_recv  | 6348309        |
| Queries_backends_bytes_sent  | 51245678       |
| Query_Processor_time_nsec    | 532924901      |
| Backend_query_time_nsec      | 12057118628    |
| mysql_backend_buffers_bytes  | 141824         |
| mysql_frontend_buffers_bytes | 262144         |
| mysql_session_internal_bytes | 19264          |
| Com_autocommit               | 230            |
| Com_autocommit_filtered      | 230            |
| Com_commit                   | 94             |
| Com_commit_filtered          | 47             |
| Com_rollback                 | 18             |
| Com_rollback_filtered        | 3              |
| Com_backend_change_user      | 813            |
| Com_backend_init_db          | 78             |
| Com_backend_set_names        | 214            |
| Com_frontend_init_db         | 81             |
| Com_frontend_set_names       | 98             |
| Com_frontend_use_db          | 9              |
| Com_stmt_prepare             | 5647           |
| Com_stmt_execute             | 5647           |
| Com_stmt_close               | 5647           |
| Mirror_concurrency           | 0              |
| Mirror_queue_length          | 0              |
| Questions                    | 267223         |
| Slow_queries                 | 44             |
| Servers_table_version        | 15             |
| MySQL_Thread_Workers         | 4              |
| MySQL_Monitor_Workers        | 8              |
| ConnPool_get_conn_immediate  | 22             |
| ConnPool_get_conn_success    | 248710         |
| ConnPool_get_conn_failure    | 308306         |
| SQLite3_memory_bytes         | 1206488        |
| ConnPool_memory_bytes        | 641680         |
| Stmt_Active_Total            | 0              |
| Stmt_Active_Unique           | 0              |
| Stmt_Max_Stmt_id             | 35             |
| Query_Cache_Memory_bytes     | 0              |
| Query_Cache_count_GET        | 0              |
| Query_Cache_count_GET_OK     | 0              |
| Query_Cache_count_SET        | 0              |
| Query_Cache_bytes_IN         | 0              |
| Query_Cache_bytes_OUT        | 0              |
| Query_Cache_Purged           | 0              |
| Query_Cache_Entries          | 0              |
+------------------------------+----------------+
54 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表中包含连接池统计信息:

select * from stats_mysql_connection_pool \G
*************************** 1. row ***************************
      hostgroup: 2
       srv_host: 192.168.1.3
       srv_port: 3306
         status: ONLINE
       ConnUsed: 0
       ConnFree: 2
         ConnOK: 441
        ConnERR: 0
        Queries: 250492
Bytes_data_sent: 50056378
Bytes_data_recv: 6040259
     Latency_us: 242
*************************** 2. row ***************************
......
  • status是后端DB的状态
  • Queries是对后端DB的请求数
  • ConnUsed是对后端DB的活跃连接数
  • Latency_us是对后端DB请求的网络延时

stats_mysql_processlist表中包含每个用户当前的连接信息:

select * from stats_mysql_processlist \G
*************************** 1. row ***************************
  ThreadID: 0
 SessionID: 2001
      user: testuser
        db: testdb
  cli_host: 192.168.1.3
  cli_port: 59042
 hostgroup: 2
l_srv_host:
l_srv_port:
  srv_host:
  srv_port:
   command: Sleep
   time_ms: 1556
      info:
*************************** 2. row ***************************
......

stats_mysql_query_diges表中是对sql的统计信息:

 select * from stats_mysql_query_digest  \G
*************************** 1. row ***************************
  hostgroup: 2
 schemaname: testdb
   username: testuser
     digest: 0xB0288986D94B9DC2
digest_text: SELECT * FROM t_user;
 count_star: 1
 first_seen: 1501233427
  last_seen: 1501233427
   sum_time: 361
   min_time: 361
   max_time: 361
*************************** 2. row ***************************
......

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的单元文件:

[Unit]
Description=proxysql_exporter
After=network.target
[Service]
Type=simple
User=prometheus
Environment=DATA_SOURCE_NAME=stats:stats@tcp(127.0.0.1:6032)/
ExecStart=/home/prometheus/proxysql_exporter/proxysql_exporter \
 -web.listen-address=:42004
Restart=on-failure
[Install]
WantedBy=multi-user.target
  • proxysql_exporter从环境变量DATA_SOURCE_NAME获取连接ProxySQL管理接口的dns信息,注意以stats用户连接
  • -web.listen-address设置proxysql_exporter的监听端口,默认为42004

接下来在Prometheus的配置文件中配置收集ProxySQL信息的Job和Instance,这里还是贴一下我们的配置文件片段,实际上这个片段也是有ansible编排生成的。

scrape_configs:

  - job_name: 'proxysql'
    static_configs:
     - targets:
        - 192.168.1.3:42004
       labels:
         instance: proxysql1
     - targets:
        - 192.168.1.4:42004
       labels:
         instance: proxysql2

重启Prometheus之后,Prometheus就可以从proxysql_exporter中收集ProxySQL的运行时信息了。

在监控图表上我们使用的Grafana,因此可以直接使用percona PMM项目中的ProxySQL Overview,将其入到Grafana即可。

prometheus_proxysql

参考

标题:使用Prometheus监控ProxySQL
本文链接:https://blog.frognew.com/2017/07/proxysql-stats-tables.html
转载请注明出处。

目录