O instalaci monitorovacího systému Zabbix jsem psal v jednom z minulých článků. Docela jsem si ho oblíbil a používám jej pro monitoring stáda Mikrotiků. Zjistil jsem však, že verze 2.2.2 dostupná v oficiálních repozitářích Ubuntu 14.04 je poněkud zastaralá a postrádá jednu důležitou funkci, která by se mi náramně hodila. Rozhodl jsem se proto přestěhovat se na nedávno vyjivší Zabbix 2.4.0, který je zatím dostupný pouze v repozitáři poskytovaném přímo vývojáři.
Nenažranec
Protože dostupnost monitorovaných zařízení je podmíněna nějakými SLA, a nezřídka se najdou klienti, kteří problém nahlásí třeba s týdenním zpožděním, průběžně z Mikrotiků tahám informace o vytížení CPU, provozu na síťových rozhraních, rychlost a kvalitu pingu a nějaké další nesmysly. Drtivou většinu skrze SNMP pollery, což znamená, že na každou jednotlivou monitorovanou položku Zabbix 2.2.2 vytvoří požadavek, předá jej polleru, poller se na něj dotáže cílového zařízení a pokud uspěje, vrátí Zabbixu požadovanou hodnotu. Zařízení je v současné chvíli připojených více než sto a u každého z nich je monitorováno cca 35 položek v minutovém intervalu, z čehož mi vychází, že Zabbix chrlí nějakých 58 požadavků za sekundu.
Ve verzi 2.2.2 jsem narazil na problém s tím, že některé hodnoty přestávaly být reportovány, hromadily se ve frontě nebo Zabbix rovnou prohlásil, že je host nedostupný. Pomaloučku polehoučku jsem zvyšoval hodnotu StartPollers, až jsem se zastavil na 96. Pak už si Zabbix přestal stěžovat a všechny hodnoty byly aktualizovány včas. V tu chvíli si ovšem začalo stěžovat PostgreSQL, protože každý poller si vytvořil spojení s databází a výchozí konfigurace PostgreSQL počítá jen se sto klienty. Když jsem k oněm 96 přičetl další hromádku spojů z ostatních procesů Zabbixu a z webového frontendu, dostal jsem se na 105. Mimoto, že mi řešení jeden proces = jedno spojení přijde krajně nešťastné (ať žije connection pooling), vytížení CPU se konstantně motalo někde kolem 3.15. Ne že by na tom šestnáctijádře nebylo dost výkonu, ale sežrat 3x 1,4 GHz jen na honění UDP paketů tam a zpátky, mi přišlo trochu moc. Škoda že neexistuje způsob jak sloučit více požadavků do jednoho dotazu. Třeba tak jak to popisuje Bulk Table Retrieval with the SNMP popsaný v RFC 1187. Oh, wait!
Rohlíky a bulky
GETBULK request, na rozdíl od obyčejného GETu, žádá cílové zařízení o odpověď ve formě seznamu hodnot, čímž efektivně snižuje počet SNMP požadavků potřebných k vyřízení všech monitorovaných položek u jednoho mého zařízení na průměrně 1,3 za minutu (je tam ještě nějaká režie okolo, autodiscovery a tak), což při stovce zařízení srazí počet požadavků z původních 58 na zhruba 2,2 za sekundu, s čímž už se dá žít o mnoho lépe a radostněji. A co víc, dá se snížit počet pollerů zpátky do příčetných hodnot. Jak na potvoru ale Zabbix tenhle typ requestů podporuje až od verze 2.2.3. A vzhledem k tomu, že Ubuntu 14.04 je LTS, a ještě nějakou by trvalo, než by se do něj novější verze dostala (pokud vůbec), risknul jsem přestěhování Zabbixu rovnou na verzi 2.4.0.
Stěhování národů
Ve svém popisu budu vycházet z konfigurace, kterou popisuju v předchozím článku, tedy Zabbix 2.2.2 s frontendem + PostgreSQL. Předtím než vůbec cokoliv začnete dělat, zálohujte. Hlavně databázi a konfigurační soubory Zabbixu. Pak celý milý Zabbix vygumujte do ztracena.
# service zabbix-server stop
# cp -r /etc/zabbix /etc/zabbix.bak
# apt-get purge zabbix-server-pgsql zabbix-frontend-php
# rm /etc/apache2/sites-enabled/zabbix.conf
V dalším kroku si do seznamu repozitářů přidejte repo.zabbix.com a oba zmíněné Zabbixové balíky zase nainstalujte. Obyčejný upgrade bez vymazání původní verze příliš nedoporučuju, protože některé adresáře a cesty k nim se docela zásadně liší. Během instalace se vás bude Zabbix skrze whiptailové okno ptát, zda chcete vytvořit databázi, tak ho zdvořile odmítněte, protože jednu už máte.
# echo 'deb http://repo.zabbix.com/zabbix/2.4/ubuntu/ trusty contrib main non-free' > /etc/apt/sources.list.d/zabbix.list
# wget -q http://repo.zabbix.com/zabbix-official-repo.key -O - | apt-key add -
# apt-get update
# apt-get install zabbix-server-pgsql zabbix-frontend-php
V současné chvíli tedy máte nainstalovaný (a spuštěný) Zabbix 2.4.0 a někde okolo se vám potlouká databáze a zálohované konfiguráky. Je tedy potřeba vše zase pospojovat. Diffem si prohlédněte rozdíly v konfiguračních souborech a nastavení, které se liší v „živém“ konfiguráku /etc/zabbix/zabbix_server.conf upravte. Tento soubor nedoporučuji nahrazovat starým, protože v něm pár konfiguračních direktiv přibylo a pár ubylo. Konfigurák k frontendu ale klidně nahraďte, jen pamatujte, že Zabbix 2.4.0 jej bude hledat jinde. O konfiguraci Apache se starat nemusíte, o tu se za vás postaral postinstall skript. Pokud si ji budete chtít prohlédnout nebo upravit, račte vstoupit do /etc/zabbix/apache.conf nebo některého ze symlinků v /etc/apache2/conf-*.
# diff -BI '^#' /etc/zabbix.bak/zabbix_server.conf /etc/zabbix/zabbix_server.conf
# cp /etc/zabbix.bak/zabbix.conf.php /etc/zabbix/web/zabbix.conf.php
Na závěr Zabbix otočte a jste-li s výsledkem spokojeni, odkliďte zálohu.
# service zabbix-server restart
# rm -rf /etc/zabbix.bak
A komu tím prospějete, co?
Verze 2.4.0 mi umožnila počet pollerů stáhnout dolů skoro o dvě třetiny, z původních 96 na nějakých 36. Teoreticky je jich při normálním běhu potřeba tak 8 až 12, ale při restartu se Zabbix snaží naráz přečíst hodnoty ze všech klientů, což při tak vysokém počtu znamená řazení do velmi dlouhé fronty a následně i spoustu timeoutů, odeslaných alertů a vyplašených adminů. A mít rezervu na nějaké špičky taky není na škodu. Vytížení CPU díky bulk requestům spadlo z 3.15 na 0.23, což je rozhodně přijatelnější hodnota. Teď už stačí akorát přidat nějaký ten database connection pooling a Zabbix ode mě má plný počet bodů.