监控 - 图1

性能指标

QPS

分别执行两次

show global status WHERE variable_name in (“Queries”,”uptime”)

  • QPS = (Queries2 - Queries2) / (uptime2 - uptime1)


TPS

分别执行两次

show global status where variable_name in (‘com_insert’, ‘com_delete’, ‘com_update’,’uptime’);

  • Tc = com_insert + com_delete + com_update
  • TPS = (Tc2 - Tc1) / (time2 - time1)

db 并发数

show global status like “Threads_running”;

db 连接数

show global status like “Threads_connected”;

报警阈值

Thread_connected / max_connections > 0.8

  • max_connections 是 my.cnf 配置中的

缓存命中率

show status like “innodb_buffer_pool_read_requests”; show status like “innodb_buffer_pool_reads”;

  • innodb_buffer_pool_read_requests: 从缓冲池读取的次数
  • innodb_buffer_pool_reads: 表示从物理磁盘读取的次数
    • 命中率 = (requests - reads) / requests * 100%

可用性指标

可用性

  1. 周期性连接数据库,并且执行

    select @@version;

堵塞

  1. SELECT waiting_pid AS'被阻塞的线程',
  2. waiting_query AS'被阻塞的SQL',
  3. blocking_pid AS '阻塞线程',
  4. blocking_query AS '阻塞SQL',
  5. wait_age AS '阻塞时间',
  6. sql_kill_blocking_query AS '建议操作'
  7. FROM sys.innodb_lock_waits
  8. WHERE (UNIX_TIMESTAMP()-UNIX_TIMESTAMP(wait_started))>30

死锁

  • 查看上一条

    show engine innodb status;

  • 打印死锁日志
    • 打开配置时,死锁日志存放到error_log配置的文件里面

      set global innodb_print_all_deadlocks=on;

  • 使用 percona toolkit 的 pt-deadlock-logger

    1. pt-deadlock-logger u=<check_db_user>, p=<check_db_password>,h=<check_db_host> \
    2. --create-dest-table \
    3. --dest \
    4. u=<save_user>,p=<save_password>,h=<save_host>,D=<save_database>,t=<save_table>
    • —create-dest-table :创建指定的表。
    • —dest :创建存储死锁信息的表。
    • —database :-D,指定链接的数据库。
    • —table :-t,指定存储的表名。
    • —log :指定死锁日志信息写入到文件。
    • —run-time :运行次数,默认永久
    • —interval :运行间隔时间,默认30s。
    • u,p,h,P :链接数据库的信息。

慢查询

  1. 通过慢查询日志监控
  2. 通过 information_schema. PROCESSLIST 表实时监控
    1. select * from information_schema.PROCESSLIST
    2. -- where time > 60 and command <> 'Sleep';

主从延迟

  • 思路
    • 主库自己创建一张表,内容只有时间
    • 主库周期更新数据
    • 从库周期读取数据,跟自己的时间做比较,得出延迟时间
  • 使用 percona toolkit 的 pt-heartbeat
  • 主节点周期性更新监控数据

    1. pt-heartbeat --user=xx --password=xxx -h <master_host> \
    2. --create-table \
    3. --database xxx \
    4. --update \
    5. --daemonize \
    6. --interval=1
    • --database 表的创建和数据更新所在 db
    • --update 执行 update
    • --interval 周期时间,单位 s
  • 从节点周期性读取监控数据,并且进行数据比较

    1. pt-heartbeat --user=xx --password=xxx -h <slave_host>\
    2. --database xxx \
    3. --monitor \
    4. --daemonize \
    5. --log/tmp/slave_lag.log
    • --database 监控数据所在 db

主从状态

show slave status;

  • 查看
    • Slave_IO_Running 是否为 Yes
    • Slave_SQL_Running 是否为 Yes
    • 和 错误报告 Last_ErrnoLast_Error