PMM2: MySQL


Mediante la monitorización de bases de datos MySQL con PMM seremos capaces de diagnosticar problemas a nivel de query, slow querys, obtener información del performance schema, QPS y multitud de métricas mas, todo esto unido a las alertas hacen de PMM un sistema de monitorización a nivel de base de datos muy completo.

 

El primer paso será crear el usuario de monitorización a nivel MySQL, el cliente de PMM no soporta autenticación caching_sha2_password, así que creamos el usuario con el plugin mysql_native_password:

CREATE USER pmm@'localhost' IDENTIFIED BY 'PASSWORD' WITH MAX_USER_CONNECTIONS 10;
ALTER USER pmm@'localhost' IDENTIFIED WITH mysql_native_password BY 'PASSWORD';
SELECT user,plugin,host FROM mysql.user WHERE user='pmm';
+------+-----------------------+-----------+
| user | plugin                | host      |
+------+-----------------------+-----------+
| pmm  | mysql_native_password | localhost |
+------+-----------------------+-----------+

GRANT SELECT, PROCESS, SUPER, REPLICATION CLIENT, RELOAD ON *.* TO 'pmm'@'localhost';
GRANT SELECT, UPDATE, DELETE, DROP ON performance_schema.* TO 'pmm'@'localhost';
FLUSH PRIVILEGES;

Si queremos una monitorización básica basta con añadir el exporter sin mas:

pmm-admin add mysql --username pmm --password PASSWORD

Pero si queremos poder utilizar el query analytics de Percona primero debemos configurar la base de datos. Las métricas se pueden obtener tanto del slowlog(MySQL >=5.1) como de la tabla performance schema(MySQL >=5.6), si no se indica por defecto utilizará slowlog.


SLOWLOG:

Es la opción que presenta mayor compatibilidad con diferentes versiones de MySQL, la información es mas detallada que la proporcionada por performance schema pero penaliza en mayor medida el rendimiento del servidor.

Si queremos tener un análisis completo debemos asignar la variable long_query_time a 0 para que capture todas las queries, pero si el servidor recibe muchas QPS el rendimiento puede verse mermado.

SET global slow_query_log='ON';

Si es un Slave:

SET global slow_query_log='ON';
SET global log_slow_slave_statements='ON';

Indicamos que queremos logear todas las queries:

SET global long_query_time=0;

El equivalente en fichero de configuración sería:

vi /etc/mysql/mysql.d/50-distro-server.cnf
[mysqld]
slow_query_log = ON
long_query_time = 0
#log_slow_slave_statements='ON'

Quizás la opción mas razonable sea capturar todas las queries durante un periodo de tiempo y analizar los resultados para averiguar a partir de cuanto tiempo debemos considerar la query como slow, luego reconfigurar el long_query_time a un valor cercano a este.

InnoDB proporciona métricas interesantes y no penaliza demasiado el rendimiento así que las habilitamos:

SET GLOBAL innodb_monitor_enable=all

Para que sea permanente:

vi /etc/mysql/mysql.d/50-distro-server.cnf
[mysqld]
innodb_monitor_enable=all

Reiniciamos MySQL:

/etc/init.d/mysql restart

Añadimos el exporter:

pmm-admin add mysql --username pmm --password PASSWORD

Comprobamos que se haya añadido el exporter:

pmm-admin list
Service type  Service name         Address and port  Service ID
MySQL         kr0mtest-mysql       127.0.0.1:3306    /service_id/d3a76048-ea77-4016-9614-d116a6017f05

Agent type                  Status     Agent ID                                        Service ID
pmm_agent                   Connected  /agent_id/70831d60-cca4-43dc-9ac1-ed6e24ea69dc  
node_exporter               Running    /agent_id/7afe5727-f389-4382-a8a9-3d345a012d74  
mysqld_exporter             Running    /agent_id/da7bce4d-6a68-462f-aaff-5bc58bd18ff9  /service_id/d3a76048-ea77-4016-9614-d116a6017f05
mysql_slowlog_agent         Running    /agent_id/67b8b836-d63c-42e6-b124-58b6415a697d  /service_id/d3a76048-ea77-4016-9614-d116a6017f05

PERFORMANCE SCHEMA:

Analizar las queries mediante performance schema es en general mas rápido que utilizar las slow queries, performance schema viene habilitado por defecto a partir de MySQL 5.6.6

Comprobamos que esté habilitado:

SHOW VARIABLES LIKE 'performance_schema';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| performance_schema | ON    |
+--------------------+-------+

Hay algunas opciones de instrumentación que no están habilitadas por defecto por penalizar el rendimiento en exceso, debido a esto pueden haber gráficas que no estén disponibles, si queremos habilitar estos parámetros debemos arrancar MySQL con el parámetro --performance-schema-instrument.

vi /etc/conf.d/mysql
MY_ARGS="--performance-schema-instrument"
/etc/init.d/mysql restart

NOTA: No se recomienda habilitar esta opción en un servidor en producción.

InnoDB proporciona métricas interesantes y no penaliza demasiado el rendimiento así que las habilitamos:

SET GLOBAL innodb_monitor_enable=all

Para que sea permanente:

vi /etc/mysql/mysql.d/50-distro-server.cnf
[mysqld]
innodb_monitor_enable=all

Reiniciamos MySQL:

/etc/init.d/mysql restart

Añadimos el exporter:

pmm-admin add mysql --query-source=perfschema --username pmm --password PASSWORD

Comprobamos que se haya añadido el exporter:

pmm-admin list
Service type  Service name         Address and port  Service ID
MySQL         kr0mtest2-mysql      127.0.0.1:3306    /service_id/89269ff0-fc13-4762-8f9f-500f0bc000f1

Agent type                  Status     Agent ID                                        Service ID
pmm_agent                   Connected  /agent_id/64a3b42c-bd8d-49ff-a12b-a65ad00bcf13  
node_exporter               Running    /agent_id/632231d5-9540-4a5f-b688-e23e14a48965  
mysqld_exporter             Running    /agent_id/66b9221e-5a4e-45e8-9ba5-e16b249a6e34  /service_id/89269ff0-fc13-4762-8f9f-500f0bc000f1
mysql_perfschema_agent      Running    /agent_id/cdeed460-de71-4ed0-ac76-f546e2491dd8  /service_id/89269ff0-fc13-4762-8f9f-500f0bc000f1

Podemos ver las métricas obtenidas en la interfaz de Grafana:

Y las queries ejecutadas en el query analytics:

Las alertas de Prometheus correspondientes serían:

groups:

- name: mysqlRules
  rules:
  - alert: BrokenMySQLExporter
    expr: sum(up{agent_type="mysqld_exporter"} == 0) by (node_name)
    for: 5m
    labels:
      severity: critical

  - alert: MySQLDown
    expr: sum(mysql_up == 0) by (node_name)
    for: 5m
    labels:
      severity: critical
 
  - alert: DelayedMySQLSlave
    expr: mysql_slave_status_seconds_behind_master > 300
    for: 30m
    labels:
      severity: medium

  - alert: BrokenMySQLSlave
    expr: mysql_slave_status_slave_sql_running == 0
    for: 5m
    labels:
      severity: critical

  - alert: BrokenMySQLSlaveIO
    expr: mysql_slave_status_slave_io_running == 0
    for: 5m
    labels:
      severity: critical

En la captura podemos ver la alerta de un Slave que no es capaz de conectar con su Master:

Si hemos seguido la guía sobre Alertmanager: https://www.alfaexploit.com/readArticle/363 veremos en Telegram alertas como esta:

La monitorización normal en PMM funciona en base a un exporter que se instala en el servidor, pero si no tenemos acceso a este servidor cabe la posibilidad de monitorizar la base datos mediante un acceso a la base de datos:

PMM2: Remote services monitoring – monitor MySQL, PostgreSQL, and MongoDB from PMM Server without the need for client installation

Si te ha gustado el artículo puedes invitarme a un redbull aquí.
Autor: kr0m -- 23/04/2020 23:45:19