In questo articolo spiegherò come utilizzare Pinba insieme a ClickHouse e Grafana, invece di pinba_engine e pinboard.
Nel progetto PHP, Pinba è probabilmente l'unico modo affidabile per capire cosa sta succedendo con le prestazioni. Tuttavia, di solito Pinba viene implementato solo quando si riscontrano già problemi e non è chiaro "da dove cominciare".
Spesso nessuno ha idea di quante volte al secondo/minuto venga chiamato uno script e cominciano a ottimizzare "alla cieca", partendo dai punti che sembrano più logici.
Qualcuno analizza i log di nginx, e qualcun altro le 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 poter ottenere un "risultato" dall'implementazione di Pinba, è molto utile vedere le metriche non solo negli ultimi minuti, ma su un periodo di tempo più lungo (da giorni a mesi).
Per questo è necessario:
- installare l'estensione per PHP (e magari desidererete un modulo per nginx)
- compilare l'estensione per MySQL
- installare Pinboard e configurare Cron.
A causa della scarsa informazione su Pinba, molti pensano che funzioni solo su PHP5 e che sia ormai un ricordo del passato, ma come vedremo in seguito, non è così.
Il primo passo è il più semplice; è sufficiente eseguire il comando:
apt install php-pinbaQuesto estensione è disponibile nei repository fino a PHP 7.3 incluso, e non è necessario compilare nulla.
Dopo aver eseguito il comando di installazione, otteniamo subito un'estensione funzionante che raccoglie e invia metriche di ogni script (durata, utilizzo della memoria, ecc.) nel formato via UDP a 127.0.0.1:30002.
Al momento, nessuno sta ancora catturando e gestendo questi pacchetti UDP, ma ciò non influisce negativamente sulla velocità o stabilità dei vostri script PHP.
Fino a poco tempo fa, l'unica applicazione in grado di catturare e gestire questi pacchetti UDP era . La descrizione "Le installazioni scoraggiano chiunque a rileggerlo e ad approfondire. Nelle lunghe liste di dipendenze ci sono sia nomi di pacchetti che nomi di programmi, con link a pagine specifiche per l'installazione, e ciascuno di questi ha i propri link ad altre dipendenze. Nessuno ha né il tempo né la voglia di districarsi in questo pasticcio.
Processo di installazione non è stato .
Forse un giorno sarà possibile installare pinba10 con una o due comandi senza dover leggere una montagna di materiale per capire come fare, ma per ora non è così.
Se hai comunque installato pinba_engine, questo è solo metà del lavoro. Infatti, senza dovrai limitarti a dati soltanto per gli ultimi minuti o aggregare, conservare e visualizzare i dati autonomamente. Fortunatamente, pinboard è sufficientemente semplice da .
Potrebbe sembrare inutile tanto soffrire quando tutte le metriche da PHP vengono già inviate su una porta UDP in formato protobuf e tutto ciò che serve è scrivere un'applicazione che le riceva e le memorizzi in un archivio. Evidentemente, gli sviluppatori a cui era venuta in mente questa idea si sono subito messi al lavoro per scrivere le proprie soluzioni, alcune delle quali sono finite su GitHub.
Segue una panoramica di quattro progetti open source che memorizzano le metriche in archivi, da cui questi dati possono essere facilmente estratti e visualizzati, ad esempio utilizzando Grafana.
(novembre 2017)
server UDP scritto in Go, che memorizza le metriche in OpenTSDB. Se OpenTSDB è già in uso nel vostro progetto, questa soluzione potrebbe fare al caso vostro, altrimenti consiglio di evitarla.
(giugno 2018)
server UDP scritto in Go, dallo stesso , che stavolta memorizza le metriche in InfluxDB. Molti progetti per il monitoraggio stanno già utilizzando InfluxDB, quindi questa soluzione potrebbe essere molto adatta per loro.
Vantaggi:
- InfluxDB aggregare le metriche ricevute e rimuovere l'originale dopo un certo periodo di tempo.
Contro:
- questa soluzione non memorizza informazioni sui timer.
- InfluxDB conserverà gli indirizzi delle pagine del sito come tag e se hai molti indirizzi unici delle pagine, ciò porterà a di memoria operativa. A un certo punto inizierà a "«. ()
(gennaio 2019)
server UDP in Go che salva le metriche in ClickHouse. Questa è una soluzione di un mio amico. È stato dopo aver preso visione di essa che ho deciso che era ora di lavorare su Pinba e ClickHouse.
Vantaggi:
- ClickHouse è perfetto per tali compiti, permette di comprimere i dati così tanto che puoi conservare tutti i dati grezzi anche senza aggregazioni
- se necessario, puoi facilmente aggregare le metriche ottenute
- un modello pronto per Grafana
- conserva le informazioni sui timer
Contro:
- non c'è una configurazione in cui è possibile impostare il nome del DB e delle tabelle, l'indirizzo e la porta del server.
- nella conservazione dei dati grezzi si utilizza una tabella ausiliaria per memorizzare indirizzi di pagine e domini, il che complica successivamente le query
- altri piccoli problemi che derivano dal primo difetto
(aprile 2019)
server UDP in PHP che memorizza le metriche in ClickHouse. Questa è la mia soluzione, risultato della mia esperienza con pinba, ClickHouse e protobuf. Mentre analizzavo tutto questo sistema, ho scritto un 'proof of concept' che, sorprendentemente per me, non consumava risorse significative (30 MB di RAM e meno dell'1% di uno degli otto core della CPU), perciò ho deciso di condividerlo con il pubblico.
I vantaggi sono gli stessi della soluzione precedente; ho utilizzato anche le denominazioni familiari della originale pinba_engine. Ho inoltre aggiunto una configurazione che consente di avviare più istanze del pinbserver, così da memorizzare le metriche in diverse tabelle. Questo è utile se si desidera raccogliere dati non solo da PHP, ma anche da Nginx.
Gli svantaggi sono un 'difetto fatale' e quei piccoli dettagli che potrebbero non soddisfarvi, ma la mia soluzione è 'semplice come una ciabatta' e consiste di circa 100 righe di codice, quindi qualsiasi sviluppatore PHP sarà in grado di modificare in pochi minuti ciò che non piace.
Principio di funzionamento
La porta UDP 30002 è in ascolto. Tutti i pacchetti in ingresso vengono decodificati secondo lo schema protobuf e aggregati. Ogni minuto, viene eseguita un'inserzione batch in ClickHouse nella tabella pinba.requests. (tutti i parametri sono configurabili in )
Un po' su ClickHouse
ClickHouse supporta diversi motori di archiviazione dei dati. Il più comunemente usato è MergeTree.
Se in qualche momento decidete di mantenere i dati aggregati per tutto il tempo, mentre i dati grezzi solo per l'ultimo periodo, potete creare una vista materializzata con raggruppamento e pulire periodicamente la tabella pinba.requests; tutti i dati rimarranno nella vista materializzata. Inoltre, quando create la tabella pinba.requests potete specificare «engine = Null», in tal modo i dati grezzi non verranno mai salvati su disco, ma continueranno a essere inviati alla vista materializzata e salvati in forma aggregata. Utilizzo questo schema per le metriche di nginx, poiché su nginx ho 50 volte più richieste rispetto a php.
Dunque, hai fatto un lungo percorso e non vorrei lasciarti a metà strada, quindi di seguito troverai una descrizione dettagliata dell'installazione e della configurazione della mia soluzione, insieme a tutto ciò di cui avrai bisogno, così come le insidie in cui molti hanno inciampato. 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 sono stati riportati in per facilitare la riproduzione delle istruzioni. Di seguito verranno 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. Di default, questo utente è accessibile da tutti gli IP, quindi se non hai un firewall sul server, assicurati di impostare una password. Questo può essere fatto anche dopo l'installazione nel file /etc/clickhouse-server/users.xml.
È importante notare che ClickHouse utilizza diverse porte, incluse la 9000. Questa porta è utilizzata anche per PHP-FPM in alcune distribuzioni (ad esempio, CentOS). Se questa porta è già in uso, puoi cambiarla in un'altra nel file /etc/clickhouse-server/config.xml.
Grafana con plugin per ClickHouse
Dopo l'installazione di Grafana, utilizza il login admin e la password admin. Al primo accesso, Grafana ti chiederà di impostare una nuova password.
Quindi accedi al menu «+» -> import e inserisci il numero del dashboard da importare. . Ho preparato e caricato questo dashboard per evitare che tu debba crearlo di nuovo da zero.
Grafana supporta l'interazione con ClickHouse tramite un plugin di terze parti, ma per i plugin esterni gli avvisi non funzionano (c'è un ticket aperto da alcuni anni per questo).
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 compilare il modulo, sono necessari i sorgenti della stessa versione di nginx già installata sul server, oltre alle stesse opzioni di compilazione; altrimenti la compilazione avrà successo, ma si verificherà un errore al collegamento del modulo che indica 'il modulo non è compatibile binariamente'. Le opzioni di compilazione possono essere visualizzate con il comando nginx -V.
Lifehacks
Tutti i miei siti funzionano solo tramite https. Il campo schema diventa quindi superfluo, perciò lo utilizzo per separare web/console.
Negli script accessibili da 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 in Grafana c'è un interruttore web/console per visualizzare le statistiche separatamente.
Inoltre, in Pinba è possibile passare i propri tag, ad esempio:
pinba_tag_set('country', $countryCode);Questo è tutto.
Ti prego di rispondere ai sondaggi sotto l'articolo.
Tradizionalmente avviso che non consulenza né assistenza tramite messaggi privati su Habra e social media.
Apri un ticket su GitHub.
Inoltre, ti chiedo di supportare con like di questo articolo .
Solo gli utenti registrati possono partecipare al sondaggio. , per favore.
Quale sistema operativo hai 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 stai usando 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 mi piacerebbe.
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ò il mio.
altro
Hanno votato 39 utenti. Si sono astenuti 47 utenti.
Fonte: habr.com
