Monitorización de Rendimiento de Bases de Datos con PMM
Percona Monitoring and Management (PMM) es una plataforma de observabilidad de código abierto especializada en bases de datos que ofrece dashboards detallados, análisis de consultas lentas y alertas para MySQL, PostgreSQL y MongoDB. PMM va mucho más allá de las métricas básicas de CPU y memoria: proporciona visibilidad a nivel de consulta, bloqueos, InnoDB internals y métricas de replicación que son esenciales para diagnosticar problemas de rendimiento en producción.
Requisitos Previos
- Servidor para PMM Server: mínimo 2 vCPUs, 4 GB RAM, 100 GB disco
- Docker en el servidor de PMM
- Acceso de red desde los servidores de bases de datos al PMM Server (puerto 443)
- Privilegios de administrador en las bases de datos a monitorizar
Instalación del PMM Server
# Instalar PMM Server usando Docker (método recomendado)
# Crear el volumen de datos persistente
docker volume create pmm-data
# Iniciar el contenedor de PMM Server
docker run -d \
--name pmm-server \
--restart always \
-p 443:443 \
-p 80:80 \
-v pmm-data:/srv \
percona/pmm-server:latest
# Verificar que el servidor está corriendo
docker ps | grep pmm-server
docker logs pmm-server --tail=50
# Acceder a la interfaz web
# URL: https://tu-servidor-pmm
# Usuario por defecto: admin
# Contraseña por defecto: admin (cambiar al primer acceso)
# Para instalación con Docker Compose (recomendado para producción)
cat > docker-compose-pmm.yml << 'EOF'
version: "3"
services:
pmm-server:
image: percona/pmm-server:latest
container_name: pmm-server
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- pmm-data:/srv
environment:
- METRICS_RETENTION=720h # 30 días de retención de métricas
- QUERIES_RETENTION=30 # 30 días de retención de queries
volumes:
pmm-data:
driver: local
EOF
docker compose -f docker-compose-pmm.yml up -d
Instalación del PMM Client
El PMM Client se instala en cada servidor de base de datos a monitorizar.
# Instalar PMM Client (Ubuntu/Debian)
wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
dpkg -i percona-release_latest.generic_all.deb
percona-release enable pmm3-client
apt update && apt install -y pmm-client
# Para CentOS/Rocky Linux
yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
percona-release enable pmm3-client
yum install -y pmm-client
# Verificar la instalación
pmm-admin --version
# Registrar el cliente con el servidor PMM
pmm-admin config \
--server-insecure-tls \
--server-url=https://admin:contraseñ[email protected]
# Verificar la conexión con el servidor
pmm-admin status
Monitorizar MySQL
# Crear el usuario de monitorización en MySQL
mysql -u root -p << 'EOF'
-- Usuario para PMM con los permisos mínimos necesarios
CREATE USER 'pmm'@'localhost' IDENTIFIED BY 'contraseña-pmm-segura' WITH MAX_USER_CONNECTIONS 10;
-- Permisos necesarios para recopilar métricas
GRANT SELECT, PROCESS, SUPER, REPLICATION CLIENT, RELOAD ON *.* TO 'pmm'@'localhost';
GRANT SELECT, UPDATE, DELETE, DROP ON performance_schema.* TO 'pmm'@'localhost';
-- Para MySQL 8.0+
GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO 'pmm'@'localhost';
GRANT REPLICATION CLIENT ON *.* TO 'pmm'@'localhost';
FLUSH PRIVILEGES;
EOF
# Habilitar el slow query log en MySQL (necesario para Query Analytics)
mysql -u root -p << 'EOF'
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 0; -- Capturar TODAS las consultas (0 = todas)
SET GLOBAL log_output = 'FILE';
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow-query.log';
SET GLOBAL log_slow_admin_statements = 'ON';
SET GLOBAL log_slow_slave_statements = 'ON';
EOF
# También activar Performance Schema para mejor análisis
mysql -u root -p -e "
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES', TIMED = 'YES'
WHERE NAME LIKE '%statement/%';"
# Agregar el servicio MySQL a PMM
pmm-admin add mysql \
--username=pmm \
--password=contraseña-pmm-segura \
--service-name=mysql-produccion-01 \
--host=localhost \
--port=3306 \
--query-source=perfschema # Usar Performance Schema para queries (recomendado)
# O usar slow query log como fuente de queries
pmm-admin add mysql \
--username=pmm \
--password=contraseña-pmm-segura \
--service-name=mysql-produccion-01 \
--query-source=slowlog \
--size-slow-logs=1GiB # Rotar cuando el slow log supere 1 GB
# Verificar que el servicio está siendo monitorizado
pmm-admin list
Monitorizar PostgreSQL
# Crear el usuario de monitorización en PostgreSQL
psql -U postgres << 'EOF'
-- Crear usuario con permisos mínimos para PMM
CREATE USER pmm WITH PASSWORD 'contraseña-pmm-pg';
GRANT pg_monitor TO pmm;
-- Para PostgreSQL 10 y anteriores
GRANT SELECT ON pg_stat_database TO pmm;
GRANT SELECT ON pg_stat_user_tables TO pmm;
GRANT SELECT ON pg_stat_user_indexes TO pmm;
GRANT SELECT ON pg_statio_user_tables TO pmm;
EOF
# Habilitar pg_stat_statements en PostgreSQL (necesario para Query Analytics)
echo "shared_preload_libraries = 'pg_stat_statements'" >> /etc/postgresql/15/main/postgresql.conf
echo "pg_stat_statements.track = all" >> /etc/postgresql/15/main/postgresql.conf
echo "pg_stat_statements.max = 10000" >> /etc/postgresql/15/main/postgresql.conf
# Reiniciar PostgreSQL
systemctl restart postgresql
# Habilitar la extensión en la base de datos a monitorizar
psql -U postgres -d mibase -c "CREATE EXTENSION IF NOT EXISTS pg_stat_statements;"
# Agregar el servicio PostgreSQL a PMM
pmm-admin add postgresql \
--username=pmm \
--password=contraseña-pmm-pg \
--service-name=postgresql-produccion-01 \
--host=localhost \
--port=5432 \
--database=mibase \
--query-source=pgstatstatements
# Verificar
pmm-admin list
Análisis de Consultas con Query Analytics
# Query Analytics (QAN) está disponible en la interfaz web de PMM
# URL: https://pmm-server/graph/d/pmm-qan/
# Exportar las consultas más lentas desde la línea de comandos
# (también disponible en la UI web)
# Para MySQL: ver las consultas más lentas directamente
mysql -u root -p << 'EOF'
-- Top 10 consultas más lentas por tiempo total de ejecución
SELECT
DIGEST_TEXT as query,
COUNT_STAR as ejecuciones,
ROUND(SUM_TIMER_WAIT / 1e12, 2) as tiempo_total_seg,
ROUND(AVG_TIMER_WAIT / 1e12, 4) as tiempo_promedio_seg,
ROUND(MAX_TIMER_WAIT / 1e12, 4) as tiempo_maximo_seg
FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 10;
EOF
# Para PostgreSQL: ver las consultas más lentas
psql -U postgres -d mibase -c "
SELECT
LEFT(query, 100) as query_resumida,
calls as ejecuciones,
ROUND(total_exec_time::numeric, 2) as tiempo_total_ms,
ROUND(mean_exec_time::numeric, 4) as tiempo_promedio_ms,
ROUND(max_exec_time::numeric, 4) as tiempo_maximo_ms,
rows as filas_totales
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;"
Dashboards y Alertas
# PMM incluye dashboards predefinidos para:
# - MySQL Overview
# - MySQL InnoDB Metrics
# - MySQL Query Analytics
# - MySQL Replication
# - PostgreSQL Overview
# - PostgreSQL Queries
# - Node Overview (métricas del sistema)
# Configurar alertas mediante la UI web de PMM
# O usando la API de Grafana Alerting (PMM usa Grafana internamente)
# Configurar una alerta para alta carga de CPU de MySQL
# Acceder a: https://pmm-server/alerting/list
# Exportar los dashboards de PMM para backup
curl -s \
-u admin:contraseña \
"https://pmm-server/graph/api/dashboards/uid/pmm-mysql-overview" \
| jq .dashboard > dashboard-mysql-overview.json
# Configurar notificaciones de alertas por email
# En PMM: Configuration → Alerting → Contact Points
# O mediante la API de Grafana:
curl -s -X POST \
-H "Content-Type: application/json" \
-u admin:contraseña \
"https://pmm-server/graph/api/v1/provisioning/contact-points" \
-d '{
"name": "Equipo DBA",
"type": "email",
"settings": {
"addresses": "[email protected]",
"subject": "Alerta PMM: {{ .GroupLabels.alertname }}"
}
}'
Solución de Problemas
El PMM Client no se conecta al servidor:
# Verificar la configuración del cliente
pmm-admin status
pmm-admin config --show
# Verificar conectividad al servidor PMM
curl -sk https://pmm-server.miempresa.com/healthcheck
# Verificar el certificado TLS (si usa certificado autofirmado)
pmm-admin config \
--server-insecure-tls \
--server-url=https://admin:[email protected]
# Reiniciar el agente PMM
systemctl restart pmm-agent
journalctl -u pmm-agent -f
No aparecen datos de Query Analytics:
# Para MySQL: verificar que Performance Schema está habilitado
mysql -u root -p -e "SHOW VARIABLES LIKE 'performance_schema';"
# Verificar que los instrumentos están habilitados
mysql -u root -p -e "
SELECT NAME, ENABLED FROM performance_schema.setup_instruments
WHERE NAME LIKE 'statement/%' AND ENABLED = 'NO';"
# Para PostgreSQL: verificar la extensión
psql -U postgres -d mibase -c "\dx pg_stat_statements"
# Verificar que se están recopilando queries
psql -U postgres -d mibase -c "SELECT COUNT(*) FROM pg_stat_statements;"
PMM Server sin espacio en disco:
# Ver el uso del volumen de datos de PMM
docker exec pmm-server df -h /srv
# Reducir el período de retención de métricas
docker exec pmm-server pmm-admin edit-settings \
--data-retention=360h # 15 días en lugar de 30
# Limpiar métricas antiguas manualmente
docker exec pmm-server curl -s \
http://localhost:9090/-/reload
Conclusión
PMM proporciona una visibilidad completa del rendimiento de las bases de datos que sería muy difícil de obtener con herramientas genéricas de monitorización. El Query Analytics es especialmente valioso: permite identificar rápidamente las consultas que más recursos consumen y optimizarlas antes de que se conviertan en incidentes de producción. Para equipos que operan MySQL o PostgreSQL en entornos críticos, PMM es una herramienta esencial que reduce significativamente el tiempo de diagnóstico de problemas de rendimiento.


