/ HOWTO

Monitorizando MySQL/Percona/MariaDB con Docker.


Como poner en marcha un contenedor Docker para monitorizar servidores de datos, MySQL, Percona o MariaDB. Prepara un contenedor servidor de Monitorización y también un contenedor cliente de ejemplo.


Una de las necesidades diarias es la de monitorizar los servicios que tenemos corriendo, además de tener nuestros sistemas operativos funcionando perfectamente, nuestras bases de datos optimizadas y todo bajo control, también hace falta preparar un sistema de control de servicios para que en todo momento sepamos que pasó y que está pasando ahora mismo, y en caso de incidentes nos avise.

Una de las premisas es “tener números” tangibles y no presentar “sensaciones”, es mejor decir que un servidor está funcionando al 50% de su potencia de CPU, que decir “anda bien”. Lo mismo con el QPS, transacciones abiertas, bloqueos, memoria en uso, etc. Los números son muy instructivos.

Aunque un servidor virtual puede ser una buena opción, Docker es aún nmejor, menos recursos usados, mas rápido despliegue, posibilidad de probar cosas hasta encontrar la configuración correcta completa, gestionar versionado, desplegar la monitorización en mas de un datacenter… en gran número de beneficios.

Usaremos Prometheus, Influxdb y Grafana, los servicios standard usados por PMM y otras soluciones de monitorización de MySQL.

Prometheus

Buscando en internet hay decenas de soluciones preparadas, buscamos una que contemple todo lo que queremos, vemos los datos del desarrollador e investigamos sobre ese contenedor Docker. En este caso este repositorio es simple y con un “all in one”, seguramente habrá mejores y en el futuro podremos construir uno nosotros mismos desde cero.

Usando contenedores Docker tenemos el riezgo de usar imágenes/scripts provistas por “otros”, del que no tenemos mas datos/referencias que sus cuentas existentes y su historia en los sitios de repositorios. Ademas de bajar y probar los contenedores, debemos revisar que estará corriendo “dentro” de esos contenedores, profundizaremos mas sobre este tema en otros posts.

Para esta prueba usaremos dos contenedores, uno será el servidor con todo instalado (srv) y el segundo (db1) el que hará de cliente, en una solución real, habría varios/cientos de clientes que se contactarían con nuestro servidor.

Podríamos utilizar luego solo el contenedor SRV y reconfigurarlo para monitorizar nuestros equipos corriendo MySQL reales (o virtuales). Y tener apagado el Contenedor Cliente que creamos.

Prometheus requiere definir los datos de todos los clientes a quien pedirle datos, IP, Nombre y puertos. Y esos clientes, deben tener corriendo colectores de datos, llamados “exporters”, para este ejemplo usaremos dos colectores, uno del sistema operativo (Linux) y otro del motor MySQL/MariaDB/Percona.


Clonamos el contenedor, en este caso provisto por la cuenta de Percona, en quien confiamos.

git clone https://github.com/percona/grafana-prometheus-influx.docker
cd grafana-prometheus-influx.docker
# Construimos la solución con Docker.
docker build -t monitor monitor/
# Crearems 3 carpetas donde funcionarán como bind-volumes para mantener la persistencia en nuestro contenedor servidor.
mkdir -p docker_shared/{prometheus,grafana,influxdb}
# En caso de tener un equipo con selinux (centos / RedHat, recomiendan correr esta línea
chcon -Rt svirt_sandbox_file_t docker_shared  # if running selinux
# Mas datos sobre el chcon aqui
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/sect-Security-Enhanced_Linux-Working_with_SELinux-SELinux_Contexts_Labeling_Files.html

Arrancamos el contenedor server, compartiendo los puertos 3000, 9090, 8083 y 8086 también para este ejemplo, definimos que el cliente (db1) a monitorizar está en el IP 192.168.11.107, y se llamará “db1”

docker run -d -p 3000:3000 -p 9090:9090 -p 8083:8083 -p 8086:8086 --name prom \
    -v $PWD/docker_shared/prometheus:/opt/prometheus/data \
    -v $PWD/docker_shared/grafana:/var/lib/grafana \
    -v $PWD/docker_shared/influxdb:/var/lib/influxdb \
    -e DB_NODE_IP=192.168.11.107 -e DB_NODE_ALIAS=db1 --name prom monitor

Si queremos agregar mas servidores MySQL a monitorizar, debemos conectarnos a nuestro contenedor SRV y editar este fichero a mano.

# cd /opt/prometheus/
# vi  prometheus.yml
global:
  scrape_interval:     5s
  evaluation_interval: 5s

scrape_configs:
  - job_name: monitor
    target_groups:
      - targets: ['192.168.11.107:9100', '192.168.11.107:9104']
        labels:
          alias: DB_NODE_ALIAS

Agregar estas entradas, una por servidor, indicamos que queremos montorizar los equipos DB2 y DB3, con IPs, 192.168.11.108 y 9, que tendrán corriendo los colectores en los puertos 9100 y 9104. (colector S.O. y colector MySQL)

      - targets: ['192.168.11.108:9100', '192.168.11.108:9104']
        labels:
          alias: db2

      - targets: ['192.168.11.109:9100', '192.168.11.109:9104']
        labels:
          alias: db3

Desde un navegador en nuestro equipo real podemos probar las partes de la solución. Prometheus http://:9090 Grafana http://:3000 (admin/admin) InfluxDB http://:8083

El puerto de grafana es el que usaremos a diario para ver gráficos de los servidores monitorizados.

Monitorización1

Monitorización2


** Ahora la parte cliente**.

En los equipos con MySQL/Percona/MariaDB que queremos monitorizar, debemos instalar los colectores clientes y apuntarlos a nuestro servidor.

En el MySQL del equipo a monitorizar, debemos crear una cuenta llamada ‘prom’@’localhost’, con clave abc123 que servira para que el colector/demonio mysqld_exporter pueda pedir datos al MySQL local.

# Quizas en algunas versiones de motor tengamos que hacer esto mismo con otros comandos.
mysql> GRANT REPLICATION CLIENT, PROCESS ON *.* TO 'prom'@'localhost' identified by 'abc123';
mysql> GRANT SELECT ON performance_schema.* TO 'prom'@'localhost';

Probaremos preparar un contenedor en modo cliente con:

# docker build -t dbnode dbnode/

Arrancaremos el contenedor indicando dos puertos (9100 y 9104) para permitir el acceso remoto desde el servidor que recolecta datos a este equipo (mySQL). Le pasamos los datos de la base de datos local (MySQL) donde se conectará el colector para obtener contadores internos del motor y que se ofrecerán en una interfaz web mediante el mysqld_exporter. El colector “node_exporter” se comunica internamente con el sistema operativo para obtener datos y ofrecerlos via web también.

docker run -d -p 9100:9100 -p 9104:9104 --net="host" \
    -e DATA_SOURCE_NAME="prom:abc123@(localhost:3306)/" --name exp dbnode

Ejemplo obtenido de este sitio https://github.com/roman-vynar/grafana-prometheus-influx.docker


Subscríbete y recibirás los últimos artículos semanalmente en tu email.