In dit artikel leg ik uit hoe je Pinba kunt gebruiken in combinatie met ClickHouse en Grafana in plaats van Pinba Engine en Pinboard.
In een PHP-project is Pinba waarschijnlijk de enige betrouwbare manier om te begrijpen wat er met de prestaties aan de hand is. Vaak wordt Pinba pas geïmplementeerd wanneer er al problemen zijn en het niet duidelijk is 'waar te beginnen'.
Vaak heeft niemand een idee hoeveel keer per seconde/minuut een bepaald script wordt aangeroepen en beginnen ze met optimaliseren 'op gevoel', startend met de plekken die logischer lijken.
Sommigen analyseren de logs van Nginx, terwijl anderen langzame aanvragen in de database bekijken.
Natuurlijk zou Pinba geen kwaad kunnen, maar er zijn verschillende redenen waarom het niet op elk project aanwezig is.
De eerste reden is de installatie.
Om enigszins een 'resultaat' te behalen van de implementatie van Pinba, is het zeer wenselijk om niet alleen de statistieken van de laatste minuten te zien, maar ook over langere tijdsperiodes (van dagen tot maanden).
Hiervoor moet je:
- de extensie voor PHP installeren (en mogelijk wil je ook de module voor Nginx),
- de extensie voor MySQL compileren,
- Pinboard installeren en cron instellen.
Vanwege de beperkte informatie over Pinba hebben velen de indruk gekregen dat het alleen op PHP5 werkte en inmiddels achterhaald is, maar zoals we later zullen zien, is dit niet het geval.
De eerste stap is de eenvoudigste, je hoeft alleen maar het commando uit te voeren:
apt install php-pinbaIn de repositories is deze extensie beschikbaar tot en met PHP 7.3 en hoef je niets te compileren.
Na het uitvoeren van het installatiecommando hebben we al een werkende extensie die de metrics van elk script verzamelt en verzendt (looptijd, geheugen, enz.) in het formaat via UDP op 127.0.0.1:30002.
Deze UDP-pakketten worden momenteel nog niet opgevangen en verwerkt, maar dit heeft op geen enkele manier een negatieve invloed op de snelheid of stabiliteit van je PHP-scripts.
Tot voor kort was de enige applicatie die deze UDP-pakketten kon opvangen en verwerken . De beschrijving van de '' installatie moedigt niemand aan om dit ooit nog eens te lezen en zich er in te verdiepen. In de kilometerslange lijsten van afhankelijkheden zijn zowel de namen van de pakketten als de namen van programma's en links naar aparte pagina's met hun installatie opgenomen, en daarvan hebben velen weer links naar andere afhankelijkheden. Niemand heeft de tijd of de zin om zich met deze rompslomp bezig te houden.
De installatieprocedure is niet moeilijk geworden. .
Misschien kan pinba10 op een dag met één of twee commando's worden geïnstalleerd zonder een berg materiaal te moeten doornemen om te begrijpen hoe je dit moet doen, maar voorlopig is dit nog niet het geval.
Als je pinba_engine toch hebt geïnstalleerd, is dat slechts de helft van het werk. Want zonder ben je beperkt tot gegevens van de afgelopen paar minuten of moet je zelf de gegevens aggregeren, opslaan en visualiseren. Gelukkig is pinboard vrij eenvoudig in .
Het lijkt misschien een grote opgave, want alle statistieken van php gaan al naar de udp-poort in protobuf-formaat en wat je eigenlijk nodig hebt, is een applicatie te schrijven die ze opvangt en in een opslagplaats plaatst. Blijkbaar zaten die ontwikkelaars die deze gedachte in hun hoofd hadden, meteen aan het schrijven van hun eigen oplossingen, waarvan een deel op GitHub terecht is gekomen.
Hier volgt een overzicht van vier open-source projecten die statistieken in opslagplaatsen opslaan, waarvan deze gegevens eenvoudig toegankelijk en te visualiseren zijn, bijvoorbeeld met behulp van grafana.
(november 2017)
udp-server geschreven in Go, die statistieken opslaat in OpenTSDB. Als je OpenTSDB al gebruikt in je project, is deze oplossing wellicht geschikt, anders raad ik aan om er voorbij te lopen.
(juni 2018)
udp-server in Go, van dezelfde , die deze keer statistieken opslaat in InfluxDB. Veel projecten gebruiken al InfluxDB voor monitoring, dus deze oplossing kan perfect voor hen zijn.
Voordelen:
- InfluxDB om de ontvangen metrics te aggregeren en de originele gegevens na een bepaalde tijd te verwijderen.
Nadelen:
- deze oplossing slaat geen informatie op basis van timers op.
- InfluxDB zal de URL's van de pagina's als tags opslaan en als je veel unieke pagina-URL's hebt, leidt dit tot van het RAM-geheugen. Op een gegeven moment zal het "«. ()
(januari 2019)
udp-server in Go, dat statistieken opslaat in ClickHouse. Dit is een oplossing van mijn vriend. Na het kennismaken hiermee besloot ik dat het tijd was om pinba en ClickHouse aan te pakken.
Voordelen:
- ClickHouse is perfect voor dergelijke taken, het stelt je in staat om gegevens zo te comprimeren dat je zelfs zonder aggregaties alle ruwe gegevens kunt opslaan
- als dat nodig is, kun je de ontvangen metrics gemakkelijk aggregeren
- kant-en-klare sjabloon voor grafana
- slaat informatie op basis van timers op
Nadelen:
- Er is geen configuratie waarmee je de naam van de database en tabellen, het adres en de poort van de server kunt instellen.
- Bij het opslaan van ruwe gegevens wordt een hulptable-woordenboek gebruikt om de adressen van pagina's en domeinen op te slaan, wat het later moeilijker maakt om aanvragen te doen.
- Andere kleinigheden die voortkomen uit het eerste nadeel.
(april 2019)
UDP-server in PHP die statistieken opslaat in ClickHouse. Dit is mijn oplossing, het resultaat van mijn kennismaking met pinba, ClickHouse en protobuf. Terwijl ik deze combinatie doorgronde, heb ik een 'proof of concept' geschreven, die voor mij onverwachts geen significante middelen vereiste (30 MB RAM en minder dan 1% van een van de acht processorkernen), daarom besloot ik het met het publiek te delen.
Voordelen - hetzelfde als de vorige oplossing, bovendien heb ik gebruik gemaakt van vertrouwde benamingen uit de originele pinba_engine. Ook heb ik een configuratie toegevoegd waarmee je meerdere instanties van de pinba-server kunt starten om statistieken in verschillende tabellen op te slaan - dit is nuttig als je gegevens wilt verzamelen, niet alleen uit PHP, maar ook uit Nginx.
Nadelen - 'fatale tekortkoming' en de kleinigheden die jou persoonlijk niet zullen bevallen, maar mijn oplossing is 'simpel als een tap' en bestaat uit ongeveer 100 regels code, zodat elke PHP-developer in een paar minuten kan aanpassen wat hij of zij niet leuk vindt.
Werking principe
De UDP-poort 30002 wordt beluisterd. Alle binnenkomende pakketten worden gedecodeerd volgens het protobuf-schema en geaggregeerd. Een keer per minuut wordt een batch ingevoegd in ClickHouse in de tabel pinba.requests. (alle parameters zijn instelbaar in )
Wat meer over ClickHouse
ClickHouse ondersteunt verschillende opslagmotoren. De meest gebruikte is MergeTree.
Als je op een gegeven moment besluit om geaggregeerde gegevens voor de hele tijd op te slaan, en ruwe gegevens alleen voor de laatste periode, kun je een materialized view met groepering aanmaken, terwijl je de hoofdtafel pinba.requests periodiek opschoont. Alle gegevens blijven in de materialized view. Bovendien kun je bij het aanmaken van de tabel pinba.requests 'engine = Null' opgeven, zodat ruwe gegevens helemaal niet op de schijf worden opgeslagen, maar ze worden nog steeds in de materialized view opgenomen en geaggregeerd opgeslagen. Deze opzet gebruik ik voor Nginx-statistieken, omdat ik op Nginx 50 keer meer aanvragen heb dan op PHP.
U heeft een lange weg afgelegd en ik wil u niet halverwege laten staan, dus hier is een gedetailleerde uitleg over de installatie en configuratie van mijn oplossing en alles wat u nodig heeft, evenals de valkuilen waar al meer dan één schip op is gestrand. Het hele installatieproces is beschreven voor Ubuntu 18.04 LTS en CentOS 7; op andere distributies en versies kan het proces iets afwijken.
Installatie
Alle benodigde opdrachten heb ik in samengebracht om de reproduceerbaarheid van de instructies te vergemakkelijken. Hieronder worden alleen de valkuilen beschreven.
php-pinba
Zorg na de installatie ervoor dat in het bestand /etc/php/7.2/fpm/conf.d/20-pinba.ini alle opties zijn gedecommenteerd. In sommige distributies (bijvoorbeeld CentOS) kunnen ze zijn gecommentarieerd.
extension=pinba.so
pinba.enabled=1
pinba.server=127.0.0.1:30002clickhouse
Tijdens de installatie vraagt ClickHouse u om een wachtwoord voor de gebruiker default in te voeren. Standaard is deze gebruiker toegankelijk vanuit alle ip-adressen, dus als u geen firewall op de server heeft, zorg er dan voor dat u een wachtwoord instelt. Dit kan ook worden gedaan na de installatie in het bestand /etc/clickhouse-server/users.xml.
Let ook op dat ClickHouse meerdere poorten gebruikt, waaronder 9000. Deze poort wordt ook gebruikt voor php-fpm in sommige distributies (bijvoorbeeld CentOS). Als deze poort al in gebruik is, kunt u deze wijzigen naar een andere in het bestand /etc/clickhouse-server/config.xml.
Grafana met de plugin voor ClickHouse
Na het installeren van Grafana gebruikt u inlognaam admin en wachtwoord admin. Bij de eerste inlog vraagt Grafana u om een nieuw wachtwoord in te stellen.
Ga daarna naar het menu ‘+’ -> importeer en geef het dashboardnummer op voor import . Dit dashboard heb ik voorbereid en geüpload, zodat u het niet zelf nog eens hoeft te maken.
Grafana ondersteunt de werking met ClickHouse via een externe plugin, maar voor externe plugins werkt de waarschuwing niet (de ticket hiervoor bestaat al enkele jaren).
pinba-server
De installatie van protobuf en libevent is niet verplicht, maar verbetert de prestaties van pinba-server. Als u pinba-server in een andere map dan /opt installeert, moet u ook het bestand aanpassen.
pinba-module voor nginx
Voor het compileren van de module zijn de bronnen nodig van dezelfde versie van nginx die al op uw server is geïnstalleerd, evenals dezelfde compilatie-opties, anders zal de compilatie succesvol zijn, maar bij het inschakelen van de module verschijnt er een foutmelding dat 'de module binair incompatibel is'. Compilatie-opties kunnen worden bekeken met het commando nginx -V
Lifehacks
Al mijn websites werken alleen via https. Het veld schema wordt daardoor zinloos, dus gebruik ik het om web/console te scheiden.
In de scripts die beschikbaar zijn via het web gebruik ik:
if (ini_get('pinba.enabled')) {
pinba_schema_set('web');
}
En in console-scripts (bijvoorbeeld cron-scripts):
if (ini_get('pinba.enabled')) {
pinba_schema_set('console');
}In mijn dashboard in Grafana is er een schakelaar web/console voor het afzonderlijk bekijken van statistieken.
Ook kunnen eigen tags aan Pinba worden doorgegeven, bijvoorbeeld:
pinba_tag_set('country', $countryCode);gebruik maken van het transportprotocol niet in de weg staat.
Ik verzoek u vriendelijk om de enquêtes onder het artikel te beantwoorden.
Traditioneel waarschuw ik dat ik niet adviseer en niet help via persoonlijke berichten op Habr en sociale netwerken.
Maak een ticket aan op GitHub.
Ik verzoek ook om ondersteuning met likes dit artikel .
Alleen geregistreerde gebruikers kunnen deelnemen aan de enquête. , alstublieft.
Welke OS gebruikt u op de server?
Ubuntu
CentOS
Debian
Gentoo
Red Hat
Fedora
OpenSUSE
SuSE
Unix
Windows
andere
Er hebben 114 gebruikers gestemd. 11 gebruikers hebben zich onthouden.
Welke versie van PHP gebruikt u op de server?
7.3
7.2
7.1
7.0
5
andere
Er hebben 105 gebruikers gestemd. 17 gebruikers hebben zich onthouden.
Heeft u ooit Pinba gebruikt?
ja
nee, maar ik zou dat graag willen
nee en ik zou dat niet willen
nee en ik heb er nog niet van gehoord
Er hebben 100 gebruikers gestemd. 14 gebruikers hebben zich onthouden.
Welke versie van Pinba-server zou u willen proberen?
pinba_engine (mysql-engine)
pinba2 (mysql-engine)
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)
ik schrijf mijn eigen
andere
Er hebben 39 gebruikers gestemd. 47 gebruikers hebben zich onthouden.
Bron: habr.com
