In questo articolo parlerò di come utilizzare pinba insieme a clickhouse e grafana invece di pinba_engine e pinboard.
Nel progetto php, pinba è senza dubbio l'unico modo affidabile per capire cosa sta succedendo con le prestazioni. Tuttavia, di solito pinba viene implementato solo quando si osservano già problemi e non è chiaro "dove scavare".
Spesso nessuno ha idea di quante volte al secondo/minuto venga chiamato uno script e iniziano ad ottimizzare "a tentoni", partendo dai posti che sembrano più logici.
Qualcuno analizza i log di nginx, mentre qualcun altro si concentra sulle query lente nel database.
Certo, pinba non sarebbe superflua, ma ci sono diverse ragioni per cui non è presente in ogni progetto.
La prima ragione è l'installazione.
Per ottenere un qualche "risultato" dall'implementazione di pinba, è molto desiderabile vedere le metriche non solo negli ultimi minuti, ma anche su un lungo intervallo di tempo (da giorni a mesi).
Per questo è necessario:
- installare l'estensione per php (e forse vorrete un modulo per nginx)
- compilare l'estensione per mysql
- installare pinboard e configurare cron
A causa della scarsa informazione su pinba, molti sono rimasti con l'impressione che funzionasse solo su php5 e che fosse rimasta nel passato, ma come vedremo più avanti, non è così.
Il primo passo è il più semplice, è sufficiente eseguire il comando:
apt install php-pinbaNei repository, questa estensione è disponibile fino a php 7.3 incluso e non è necessario compilare nulla.
Dopo l'esecuzione del comando di installazione, otteniamo immediatamente un'estensione funzionante che raccoglie e invia le metriche di ogni script (durata, memoria, ecc.) nel formato via udp a 127.0.0.1:30002.
Questi pacchetti udp al momento non vengono ancora catturati né elaborati, ma questo non influisce negativamente sulla velocità o stabilità delle vostre script php.
Fino a poco tempo fa, come applicazione in grado di catturare ed elaborare questi pacchetti udp c'era solo . La descrizione "" dell'installazione scoraggia dal volerla leggere e approfondire ancora. Nei chilometrici elenchi di dipendenze ci sono sia i nomi dei pacchetti che i nomi dei programmi e i link a pagine separate per la loro installazione, e quelli hanno i loro link ad altre dipendenze. Nessuno ha tempo o voglia di occuparsi di questa roba.
Il processo di installazione non è diventato .
Forse un giorno sarà possibile installare pinba10 con una o due comandi e senza dover leggere un sacco di materiale per capire come farlo, ma per ora non è così.
Se hai comunque installato pinba_engine, questo è solo metà del lavoro. Perché senza sarai costretto a limitarti ai dati solo degli ultimi minuti o a raccogliere, salvare e visualizzare i dati manualmente. È un bene che pinboard sia abbastanza semplice da .
Sembra strano perché subire tali sofferenze, se tutte le metriche da php già passano su una porta udp in formato protobuf e tutto ciò che serve è scrivere un'applicazione che le catturi e le memorizzi in qualche archiviazione? A quanto pare, gli sviluppatori a cui era venuta in mente questa idea si sono subito messi a scrivere le proprie soluzioni, alcune delle quali sono finite su GitHub.
Di seguito trovi una panoramica di quattro progetti open source che memorizzano metriche in archiviazioni, da cui è facile estrarre e visualizzare questi dati, ad esempio, con grafana.
(novembre 2017)
server udp in go, che memorizza le metriche in OpenTSDB. Se OpenTSDB è già in uso nel tuo progetto, questa soluzione potrebbe adattarsi, altrimenti ti consiglio di evitarla.
(giugno 2018)
server udp in go, dallo stesso , che questa volta memorizza metriche in InfluxDB. Molti progetti già utilizzano InfluxDB per il monitoraggio, quindi per loro questa soluzione potrebbe adattarsi perfettamente.
Pro:
- InfluxDB aggregare le metriche ricevute e cancellare l'originale dopo un certo periodo.
Contro:
- questa soluzione non memorizza informazioni sui timer.
- InfluxDB memorizzerà gli indirizzi delle pagine del sito come tag e se hai molti indirizzi unici, ciò porterà a un di memoria RAM. A un certo punto, inizierà a "«. ()
(gennaio 2019)
server udp in go, che memorizza le metriche in ClickHouse. Questa è una soluzione di un mio amico. È stato dopo averne preso visione che ho deciso che era tempo di affrontare pinba e ClickHouse.
Pro:
- ClickHouse è perfetto per tali compiti, consente di comprimere i dati a tal punto che puoi memorizzare tutti i dati grezzi anche senza aggregazioni
- se necessario, puoi facilmente aggregare le metriche ricevute
- un modello pronto per grafana
- memorizza informazioni sui timer
Contro:
- non c'è una configurazione in cui sia possibile impostare il nome del db e delle tabelle, l'indirizzo e la porta del server.
- durante il salvataggio dei dati grezzi si utilizza una tabella di supporto per memorizzare gli indirizzi delle pagine e dei domini, il che complica successivamente le query.
- altri piccoli dettagli che derivano dal primo svantaggio.
(aprile 2019)
un server UDP in PHP, che memorizza le metriche in ClickHouse. Questa è la mia soluzione, frutto della mia esperienza con pinba, ClickHouse e protobuf. Mentre esploravo questa combinazione, ho scritto un «proof of concept», che sorprendentemente non consumava risorse significative (30 MB di RAM e meno dell'1% di uno degli otto core del processore), quindi ho deciso di condividerlo con il pubblico.
Pro: gli stessi vantaggi della soluzione precedente, ho anche utilizzato nomi familiari dall'originale pinba_engine. Inoltre, ho aggiunto una configurazione che consente di avviare più istanze del pinba-server per memorizzare le metriche in diverse tabelle - utile se desideri raccogliere dati non solo da PHP, ma anche da Nginx.
Contro: «difetto fatale» e dettagli che potrebbero non soddisfarti, ma la mia soluzione è «semplice come una ciabatta» e consiste di circa 100 righe di codice, quindi qualsiasi sviluppatore PHP può cambiare ciò che non gli piace in pochi minuti.
Il principio di funzionamento
Viene ascoltata la porta UDP 30002. Tutti i pacchetti in ingresso vengono decodificati secondo lo schema protobuf e aggregati. Ogni minuto viene effettuata un'inserzione batch in ClickHouse nella tabella pinba.requests. (tutti i parametri possono essere configurati in )
Un po' su ClickHouse
ClickHouse supporta vari motori di archiviazione. Il più comunemente usato è il MergeTree.
Se in un certo momento decidi di memorizzare i dati aggregati per tutto il tempo, e i grezzi solo per l'ultimo periodo, puoi creare una materialized view con raggruppamento, mentre la tabella principale pinba.requests può essere pulita periodicamente, mantenendo tutti i dati nella materialized view. Inoltre, quando crei la tabella pinba.requests puoi specificare «engine = Null», in questo modo i dati grezzi non verranno salvati su disco e continueranno a finire nella materialized view, aggregati. Utilizzo questo schema per le metriche Nginx, perché su Nginx ho circa 50 volte più richieste rispetto a PHP.
Quindi, hai fatto un lungo percorso e non vorrei lasciarti a metà strada, quindi di seguito troverai una descrizione dettagliata dell'installazione e configurazione della mia soluzione e di tutto ciò di cui avrai bisogno, oltre a insidie in cui molte navi si sono schiantate. L'intero processo di installazione è descritto per Ubuntu 18.04 LTS e Centos 7, su altre distribuzioni e versioni il processo potrebbe differire leggermente.
Installazione
Tutti i comandi necessari li ho estratti in per facilitare la riproduzione delle istruzioni. Di seguito saranno descritte solo le insidie.
php-pinba
Dopo l'installazione assicurati che nel file /etc/php/7.2/fpm/conf.d/20-pinba.ini tutte le opzioni siano decommentate. In alcune distribuzioni (ad esempio, centos) potrebbero essere commentate.
extension=pinba.so
pinba.enabled=1
pinba.server=127.0.0.1:30002clickhouse
Durante l'installazione, clickhouse ti chiederà di impostare una password per l'utente default. Per impostazione predefinita, questo utente è accessibile da tutti gli ip, quindi se non hai un firewall sul server, ti consiglio di impostargli una password. Questo può essere fatto anche dopo l'installazione nel file /etc/clickhouse-server/users.xml.
Vale la pena notare che clickhouse utilizza diverse porte, tra cui 9000. Questa porta è utilizzata anche per php-fpm in alcune distribuzioni (ad esempio, centos). Se hai già in uso questa porta, puoi cambiarla in un'altra nel file /etc/clickhouse-server/config.xml.
grafana con plugin per clickhouse
Dopo aver installato grafana, utilizza il login admin e la password admin. Al primo accesso, grafana ti chiederà di impostare una nuova password.
Successivamente, vai nel menu «+» -> import e indica il numero del dashboard da importare . Questo dashboard l'ho preparato e caricato, così non dovrai farlo di nuovo da solo.
Grafana supporta l'uso di clickhouse tramite un plugin di terze parti, ma per i plugin di terze parti non funzionano gli avvisi (è un ticket aperto da anni).
pinba-server
L'installazione di protobuf e libevent non è obbligatoria, ma migliora le prestazioni di pinba-server. Se installi pinba-server in una cartella diversa da /opt, dovrai anche modificare il file.
modulo pinba per nginx
Per la compilazione del modulo sono necessari i sorgenti della stessa versione di nginx già installata sul server, nonché le stesse opzioni di compilazione, altrimenti la compilazione avrà successo, ma sarà restituito un errore al momento della connessione del modulo che indica "il modulo non è compatibile a livello binario". Le opzioni di compilazione possono essere visualizzate con il comando nginx -V
Lifehacks
Tutti i miei siti funzionano solo con https. Il campo schema diventa quindi irrilevante, quindi lo utilizzo per distinguere tra web/console.
Negli script accessibili dal web utilizzo:
if (ini_get('pinba.enabled')) {
pinba_schema_set('web');
}
E negli script da console (ad esempio, script cron):
if (ini_get('pinba.enabled')) {
pinba_schema_set('console');
}Nel mio dashboard di Grafana c'è un interruttore web/console per visualizzare le statistiche separatamente.
In Pinba è inoltre possibile passare i propri tag, ad esempio:
pinba_tag_set('country', $countryCode);Questo è tutto.
Ti prego di rispondere ai sondaggi sotto l'articolo.
Avviso tradizionalmente che non fornisco consulenze né aiuto tramite messaggi privati su Habr e social media.
Apri un ticket su GitHub.
Inoltre, ti prego di sostenere con dei like di questo articolo, .
Solo gli utenti registrati possono partecipare al sondaggio. , per favore.
Quale OS utilizzi sul server?
Ubuntu
CentOS
Debian
Gentoo
Red Hat
Fedora
OpenSUSE
SuSE
Unix
Windows
altro
Hanno votato 114 utenti. Si sono astenuti 11 utenti.
Quale versione di PHP utilizzi sul server?
7.3
7.2
7.1
7.0
5
altro
Hanno votato 105 utenti. Si sono astenuti 17 utenti.
Hai mai utilizzato Pinba?
sì
no, ma mi piacerebbe
no e non lo vorrei
no e non ne ho mai sentito parlare
Hanno votato 100 utenti. Si sono astenuti 14 utenti.
Quale versione del server Pinba vorresti provare?
pinba_engine (motore mysql)
pinba2 (motore 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)
scriverò la mia personalmente
altro
Hanno votato 39 utenti. Si sono astenuti 47 utenti.
Fonte: habr.com
