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, debemos tener en cuenta que si se trata de un slave y se están replicando todas las bases de datos tendremos que crear el usuario en el master.
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@'127.0.0.1' IDENTIFIED BY 'PASSWORD' WITH MAX_USER_CONNECTIONS 10;
ALTER USER pmm@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'PASSWORD';
SELECT user,plugin,host FROM mysql.user WHERE user='pmm';
+------+-----------------------+-----------+
| user | plugin | host |
+------+-----------------------+-----------+
| pmm | mysql_native_password | 127.0.0.1 |
+------+-----------------------+-----------+
GRANT SELECT, PROCESS, SUPER, REPLICATION CLIENT, RELOAD ON *.* TO 'pmm'@'127.0.0.1';
GRANT SELECT, UPDATE, DELETE, DROP ON performance_schema.* TO 'pmm'@'127.0.0.1';
FLUSH PRIVILEGES;
Si queremos una monitorización básica basta con añadir el exporter sin mas:
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:
[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:
[mysqld]
innodb_monitor_enable=all
Reiniciamos MySQL:
Añadimos el exporter:
Comprobamos que se haya añadido el exporter:
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.
MY_ARGS="--performance-schema-instrument"
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:
[mysqld]
innodb_monitor_enable=all
Reiniciamos MySQL:
Añadimos el exporter:
Comprobamos que se haya añadido el exporter:
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
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