En este artículo, explicaré cómo usar Pinba junto con ClickHouse y Grafana en lugar de pinba_engine y pinboard.
En un proyecto PHP, Pinba es quizás la forma más confiable de entender qué está sucediendo con el rendimiento. Sin embargo, generalmente, Pinba se implementa solo cuando ya se observan problemas y no se sabe "dónde investigar".
A menudo, nadie tiene idea de cuántas veces por segundo/minuto se llama a un script y comienzan a optimizar "a ciegas", comenzando por los lugares que parecen más lógicos.
Alguien analiza los registros de nginx, mientras que otros estudian las consultas lentas en la base de datos.
Por supuesto, Pinba no estaría de más, pero hay varias razones por las que no está presente en cada proyecto.
Y la primera razón es la instalación.
Para obtener algo de "resultado" de la implementación de Pinba, es muy deseable ver métricas no solo por los últimos minutos, sino en un intervalo de tiempo más largo (desde días hasta meses).
Para esto se necesita:
- instalar la extensión para PHP (y quizás desee el módulo para nginx)
- compilar la extensión para MySQL
- instalar Pinboard y configurar cron
Debido a la escasa información sobre Pinba, muchos han llegado a la impresión de que solo funcionaba en PHP 5 y ha quedado en el pasado, pero como veremos más adelante, no es así.
El primer paso es el más fácil, solo necesita ejecutar el comando:
apt install php-pinbaEn los repositorios, esta extensión está disponible hasta PHP 7.3 incluido y no necesita compilar nada.
Después de ejecutar el comando de instalación, ya obtenemos la extensión funcionando, que recolecta y envía métricas de cada script (duración de la ejecución, memoria, etc.) en formato por UDP en 127.0.0.1:30002.
Estos paquetes UDP aún nadie los atrapa y los procesa, pero eso no afecta la velocidad ni la estabilidad de sus scripts PHP.
Hasta hace poco, la única aplicación que podía atrapar y procesar estos paquetes UDP era . Descripción "» la instalación desanima a cualquiera a leer esto nuevamente y profundizar. En las largas listas de dependencias hay tanto nombres de paquetes como nombres de programas y enlaces a páginas individuales con sus instalaciones, y estas a su vez tienen sus propios enlaces a otras dependencias. Nadie tiene el tiempo ni las ganas de lidiar con este tipo de cosas.
El proceso de instalación no se hizo .
Quizás algún día pinba10 se podrá instalar con uno o dos comandos sin tener que leer una gran cantidad de material para entender cómo hacerlo, pero por ahora eso no es así.
Si aun así instalaste pinba_engine, es solo la mitad del trabajo. Porque sin tendrás que limitarte a los datos de solo los últimos minutos o agregar, almacenar y visualizar los datos por tu cuenta. Bien, que pinboard es bastante simple en .
Aparentemente, ¿por qué sufrir tanto si todas las métricas de php ya van a un puerto udp en formato protobuf y lo único que necesitas es escribir una aplicación que las capture y las almacene en algún lugar? Al parecer, a esos desarrolladores a quienes se les ocurrió esta idea, les dio por ponerse a escribir sus propias bicicletas, y algunas de ellas terminaron en GitHub.
A continuación, se presenta una revisión de cuatro proyectos de código abierto que almacenan métricas en almacenes de los que estos datos se pueden extraer y visualizer fácilmente, por ejemplo, con grafana.
(noviembre de 2017)
servidor udp en go, que guarda métricas en OpenTSDB. Tal vez si OpenTSDB ya se utiliza en tu proyecto, esta solución te convenga, de lo contrario, te recomiendo que pases de largo.
(junio de 2018)
servidor udp en go, del mismo , que esta vez guarda métricas en InfluxDB. En muchos proyectos ya se usa InfluxDB para monitoreo, por lo que esta solución podría ser muy adecuada para ellos.
Pros:
- InfluxDB agregar las métricas obtenidas y eliminar el original después de un tiempo determinado.
Desventajas:
- esta solución no almacena información por temporizadores.
- InfluxDB almacenará las direcciones de las páginas del sitio como etiquetas y si tienes muchas direcciones únicas de páginas, esto provocará de memoria RAM. A partir de un cierto momento, él "«. ()
(enero de 2019)
Servidor UDP en Go que guarda métricas en ClickHouse. Esta es una solución de un amigo mío. Fue después de conocerla que decidí que era hora de ponerme a trabajar en Pinba y ClickHouse.
Pros:
- ClickHouse es perfecto para estas tareas, permite comprimir datos de tal manera que puedes almacenar todos los datos sin procesar incluso sin agregaciones.
- Si es necesario, puedes agregar las métricas obtenidas fácilmente.
- Plantilla lista para Grafana.
- Guarda información por temporizadores.
Desventajas:
- No hay una configuración donde se pueda establecer el nombre de la base de datos y las tablas, así como la dirección y el puerto del servidor.
- Al guardar datos sin procesar, se utiliza una tabla de diccionario auxiliar para almacenar las direcciones de las páginas y los dominios, lo que complica posteriormente las consultas.
- Otros pequeños detalles que derivan de la primera desventaja.
(abril de 2019)
Servidor UDP en PHP que guarda métricas en ClickHouse. Esta es mi solución, resultado de mi experiencia con Pinba, ClickHouse y Protobuf. Mientras trataba de entender todo este conjunto, escribí un 'proof of concept', que inesperadamente para mí no consumía recursos significativos (30 MB de RAM y menos del 1% de uno de los ocho núcleos del procesador), por lo que decidí compartirlo con el público.
Ventajas: las mismas que en la solución anterior, además usé nombres familiares del Pinba original. También añadí una configuración que permite iniciar varias instancias del servidor Pinba, para guardar métricas en diferentes tablas, lo cual es útil si deseas recopilar datos no solo de PHP, sino también de Nginx.
Desventajas: 'defecto fatal' y esos pequeños detalles que no te gustarán personalmente, pero mi solución es 'tan simple como una chancleta' y consiste en alrededor de 100 líneas de código, así que cualquier desarrollador PHP podrá modificar lo que no le guste en unos minutos.
Principio de funcionamiento.
Se escucha el puerto UDP 30002. Todos los paquetes entrantes se decodifican según el esquema Protobuf y se agregan. Cada minuto se inserta un lote en ClickHouse en la tabla pinba.requests. (todos los parámetros se configuran en )
Un poco sobre ClickHouse.
ClickHouse soporta diferentes motores de almacenamiento de datos. El más utilizado es MergeTree.
Si en algún momento decides almacenar datos agregados a lo largo del tiempo y mantener solo los datos en bruto del último período, puedes crear una vista materializada con agrupación y limpiar periódicamente la tabla principal pinba.requests; todos los datos permanecerán en la vista materializada. Además, al crear la tabla pinba.requests, puedes especificar "engine = Null"; de este modo, los datos en bruto no se guardarán en el disco y, sin embargo, seguirán apareciendo en la vista materializada y se guardarán de manera agregada. Utilizo este esquema para las métricas de nginx, ya que en nginx tengo 50 veces más solicitudes que en php.
Así que has recorrido un largo camino y no quiero dejarte a medias, así que a continuación encontrarás una descripción detallada de la instalación y configuración de mi solución y todo lo que necesitarás, así como los escollos en los que se han estrellado más de un barco. Todo el proceso de instalación se describe para Ubuntu 18.04 LTS y Centos 7; en otras distribuciones y versiones, el proceso puede variar ligeramente.
Instalación
He recopilado todos los comandos necesarios en para facilitar la reproducibilidad de las instrucciones. A continuación, solo se describirán los escollos.
php-pinba
Después de la instalación, asegúrate de que en el archivo /etc/php/7.2/fpm/conf.d/20-pinba.ini todas las opciones estén descomentadas. En algunas distribuciones (como centos) pueden estar comentadas.
extension=pinba.so
pinba.enabled=1
pinba.server=127.0.0.1:30002clickhouse
Durante la instalación, clickhouse te pedirá que establezcas una contraseña para el usuario default. Por defecto, este usuario es accesible desde todas las IP, así que si no tienes un firewall en el servidor, asegúrate de establecerle una contraseña. Esto también se puede hacer después de la instalación en el archivo /etc/clickhouse-server/users.xml.
También es importante notar que clickhouse utiliza varios puertos, incluido el 9000. Este puerto también es utilizado por php-fpm en algunas distribuciones (como centos). Si este puerto ya está en uso, puedes cambiarlo en el archivo /etc/clickhouse-server/config.xml.
grafana con plugin para clickhouse
Después de instalar grafana, utiliza el usuario admin y la contraseña admin. En el primer inicio de sesión, grafana te pedirá que establezcas una nueva contraseña.
Luego, ve al menú “+” -> importar y especifica el número del dashboard para importar . Este dashboard lo he preparado y subido para que no tengas que crearlo tú mismo una vez más.
Grafana es compatible con ClickHouse a través de un complemento de terceros, pero las alertas no funcionan para los complementos de terceros (el ticket ha estado abierto durante varios años).
pinba-server
La instalación de protobuf y libevent no es obligatoria, pero mejora el rendimiento de pinba-server. Si instala pinba-server en un directorio diferente a /opt, también deberá ajustarlo. archivo.
módulo pinba para nginx
Para compilar el módulo se necesitan las fuentes de la misma versión de nginx que ya está instalada en su servidor, así como las mismas opciones de compilación; de lo contrario, la compilación será exitosa, pero al conectar el módulo se mostrará un error de "módulo no compatible binariamente". Las opciones de compilación se pueden ver con el comando nginx -V.
Consejos útiles
Todos mis sitios funcionan solo por https. El campo schema se vuelve irrelevante, por lo que lo uso para diferenciar web/console.
En los scripts accesibles desde la web uso:
if (ini_get('pinba.enabled')) {
pinba_schema_set('web');
}
Y en los de consola (por ejemplo, scripts de cron):
if (ini_get('pinba.enabled')) {
pinba_schema_set('console');
}En mi panel de Grafana hay un interruptor web/console para ver estadísticas por separado.
También en Pinba se pueden pasar sus propias etiquetas, por ejemplo:
pinba_tag_set('country', $countryCode);Eso es todo.
Les agradecería que respondieran las encuestas debajo del artículo.
Tradicionalmente, aviso que no consulto ni ayudo a través de mensajes personales en Habr y redes sociales.
Abra un ticket en GitHub.
También, por favor, apoyen con me gusta de este artículo .
Solo los usuarios registrados pueden participar en la encuesta. , por favor.
¿Qué sistema operativo utiliza en el servidor?
Ubuntu
CentOS
Debian
Gentoo
Red Hat
Fedora
OpenSUSE
SuSE
Unix
Windows
otro
114 usuarios votaron. 11 usuarios se abstuvieron.
¿Qué versión de PHP utiliza en el servidor?
7.3
7.2
7.1
7.0
5
otro
105 usuarios votaron. 17 usuarios se abstuvieron.
¿Alguna vez ha usado Pinba?
sí
no, pero me gustaría
no y no me gustaría
no y nunca he oído hablar de ella
100 usuarios votaron. 14 usuarios se abstuvieron.
¿Qué versión de pinba-server le gustaría probar?
pinba_engine (motor mysql)
pinba2 (motor mysql)
pinboard (php + mysql)
olegfedoseev/pinba-server (go + OpenTSDB)
olegfedoseev/pinba-influxdb (go + influxdb)
pinba-server/pinba-server (go + clickhouse)
pinba-server/pinba-server (php + clickhouse)
escribiré el mío
otro
39 usuarios votaron. 47 usuarios se abstuvieron.
Fuente: habr.com
