Monitorowanie rozproszonych serwerów przy użyciu Zabbixa
Jak zainstalować i skonfigurować rozproszony system monitorowania Zabbix na serwerze Gentoo Linux.
Ostatnio szukałem dobrego i skalowalnego rozwiązania monitorującego, które uprościłoby by zarządzanie moimi serwerami. Moim głównym zmartwieniem jest monitorowanie wydajności serwerów w tym wydajności kluczowych serwisów takich jak MySQL czy Apache. Chciałbym mieć do dyspozycji system monitorujący, który pozwalałby na prezentowanie statystyk wydajności pracy na czytelnych wykresach. Wcześniej wykorzystywałem MRTG ale to rozwiązanie było dalekie od doskonałości. Po sprawdzeniu kilku alternatyw mój wybór był oczywisty: rozproszony system monitorowania Zabbix wydaje się być najlepszym systemem monitorowania typu OpenSource.
Zabbix jest systemem w pełni rozproszonym z wieloma możliwymi opcjami konfiguracji. Śmiało mogę powiedzieć, że jedynie twoja wyobraźnia cię ogranicza. Z odrobiną dodatkowej konfiguracji i wsparciem dla protokołów Snmp i OpenIMPI ten system jest w stanie monitorować cokolwiek zechcesz na dowolnym komputerze. System Zabbix jest zbudowany z trzech komponentów: serwera, proxy i agenta. Serwer jest centralnym węzłem monitorującym zbierającym statystyki i prezentującym je przy wykorzystaniu prostego w użytkowaniu interfejsu WWW. Proxy może zbierać statystyki z większej ilości monitorowanych urządzeń i przekazywać je do serwera. Agent jest małym programem działającym na monitorowanym komputerze, którego zadaniem jest zbieranie statystyk na tym komputerze. Oprogramowanie Serwera musi zostać uruchomione na systemie typu Posix ale programy agentów są dostępne na niemalże wszystkie systemy operacyjne. Interfejs WWW wymaga serwera WWW ze wsparciem dla PHP.
Postaram się podzielić tutaj konfiguracją systemu pochodzącą z moich serwerów. Jak zauważysz nie używam instancji serwera proxy. Większość informacji zamieszczonych poniżej jest kompilacją dwóch źródeł jakie znalazłem w Internecie. W dolnej części artykułu znajdziesz pełną listę tych źródeł. Chciałbym udokumentować tę konfigurację na moim blogu mając nadzieję, że ktoś inny uzna te informacje na użyteczne. Większość podanych poniżej informacji dotyczy serwerów Gentoo Linuksa ale niektóre z nich powinny dać się zastosować na dowolnej dystrybucji Linuksa lub innym systemie zgodnym ze standardem Possix na którym został uruchomiony system Zabbix.
Ostatnia najnowsza wersja Zabbiksa to 1.8.3 i na szczęście jest to też wersja dostępna w drzewie portów dystrybucji Gentoo Linux. Pierwszą rzeczą jaką należy zrobić jest instalacja serwera Zabbix. Do zainstalowania Zabbiksa na moim serwerze wykorzystałem następującą komendę:
USE="-ldap -openipmi -oracle -postgres -proxy -sqlite3 mysql agent frontend jabber server ssh snmp" emerge -av net-analyzer/zabbix
Ta komenda zaowocuje także zainstalowaniem wszystkich wymaganych zależności i sprawdzeniem kompatybilności zainstalowanych w systemie pakietów. Jest dość prawdopodobne, że zostaniesz poproszony o rekompilację PHP aby spełnić wymagania konfiguracyjne interfejsu WWW Zabbiksa. Jak widzisz wykorzystuje do przechowywania informacji serwer bazy danych MySQL (opcjonalnie możesz wykorzystać bazy postgresql, oracle lub sqlite). Wyłączyłem wsparcie dla uwierzytelnienia po ldap i protokołu openimpi jako, że nie są mi one potrzebne. Zainstalowałem serwer i interfejs WWW na tym samym komputerze i dodałem wsparcie dla protokołu komunikatora jabber aby móc definiować zdarzenia powiadomień wysyłane do mojego konta w komunikatorze jabber. Dodatkowo wybrałem instalację agenta aby także monitorować komputer z zainstalowanym serwerem Zabbiksa.
Na monitorowanych komputerach Gentoo instalacja jest prostsza. Wykorzystałem następującą komendę aby zainstalować agentów:
USE="-ldap -openipmi -oracle -postgres -proxy -sqlite3 -mysql -frontend -jabber -server -ssh -snmp agent" emerge -av net-analyzer/zabbix
Przed utworzeniem bazy danych dla serwera Zabbiksa domyślna konfiguracja MySQL dostępna w Gentoo Linuksie musi zostać zmieniona aby uniknąć przeładowania bazy danych dużą ilością informacji. Według Gentoo Linux Wiki Archive należy zmienić kilka parametrów dotyczących mechanizmu przechowywania danych InnoDB. Ale uważaj, jeśli wykorzystywałeś serwer bazy danych przed zainstalowaniem serwera Zabbix i masz jakieś istotne dane przechowywane przy wykorzystaniu mechanizmu InnoDB zalecam wykonanie kopii wszystkich danych przed zmienianiem parametrów. Możesz podążyć za tym linkiem i uzyskać dostęp do skryptu służącego do sporządzania kopii wszystkich baz danych. Jeśli będziesz już posiadał pełną kopię wszystkich danych możesz w bezpieczny sposób zmienić plik /etc/mysql/my.cnf upewniając się, że poniższe parametry są w nim obecne w sekcji [mysqld].
expire_logs_days = 2
innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:12800M
Ta konfiguracja wymusi rotację logów co dwa dni i zwiększy maksymalny dopuszczalny rozmiar plików danych InnoDB. Możesz poprawić te ustawienia tak aby odpowiadały one twoim potrzebom ale upewnij się, że nie pozostawisz ustawień domyślnych. Po dokonaniu tych zmian będziesz musiał wejść do katalogu /var/lib/mysql/ i skasować wszystkie pliki związane z InnoDB z tego katalogu. Najprawdopodobniej będą to pliki: ib_logfile* i ibdata*. Bez tego baza danych mysql nie wystartuje. Po zrestartowaniu usługi serwera bazy danych upewnij się, że możesz uzyskać dostęp do starych baz danych. Jeśli nie są one dostępne usuń je i przywróć je z uprzednio wykonanej kopi wykonując następującą komendę:
mysql -u User -pPassword database_name < /your/beckup/path/beckup_file.sql
Po prawidłowym skonfigurowaniu mysqla nadszedł czas na stworzenie bazy danych dla Zabbiksa. Najpierw utworzymy bazę danych dla serwera Zabbix a następnie utworzymy użytkownika z pełnym dostępem do tej bazy:
mysql -u User_with_full_db_access -pPassword create database zabbix; grant all on zabbix.* to zabbix_user@localhost identified by 'password'; flush privileges; quit;
Następnie możemy stworzyć schemat bazy danych i umieścić w bazie wymagane informacje wykorzystując skrypty sql dostarczane z Zabbiksem.
cat /usr/share/zabbix/database/create/schema/mysql.sql | mysql -u zabbix_user pPassword zabbix cat /usr/share/zabbix/database/create/data/data.sql | mysql -u zabbix_user pPassword zabbix cat /usr/share/zabbix/database/create/data/images_mysql.sql | mysql -u zabbix_user pPassword zabbix
Teraz mając gotową bazę danych można skonfigurować serwer Zabbiska. Aby to zrobić należy poddać edycji plik /etc/zabbix/zabbix_server.conf. Ten plik jest bardzo dobrze udokumentowany więc nie powinno stanowić problemu stworzenie konfiguracji odpowiadającej twoim potrzebom. Najważniejsza część tego pliku to konfiguracja połączenia z bazą danych znajdująca się w dolnej jego części. Ta konfiguracja powinna wyglądać podobnie do tej:
# Database host name # Default is localhost DBHost=localhost # Database name # SQLite3 note: path to database file must be provided. DBUser and DBPassword are ignored. DBName=zabbix # Database user DBUser=zabbix_user # Database password # Comment this line if no password used DBPassword=Password # Connect to MySQL using Unix socket? DBSocket=/var/run/mysqld/mysqld.sock
I to wszystko. Można teraz uruchomić serwer wykonując następującą komendę:
/etc/init.d/zabbix-server start
i dodać usługę serwera do domyślnego poziomu uruchamiania aby uruchamiała się ona przy każdym starcie systemu:
rc-update add zabbix-server default
Kolejna rzecz do zrobienia to instalacja interfejsu WWW. Posiadam serwer WWW Apache tym samym poniższa konfiguracja dotyczy tego właśnie serwera. W Gentoo Linuksie mamy świetny skrypt webapp-config, który ułatwia proces instalacji aplikacji WWW. Zdecydowałem się na instalację interfejsu WWW w odrębnym wirtualnym hoście. Aby tego dokonać musiałem wydać następującą komendę:
webapp-config -I -h zabbix zabbix 1.8.3
Ta komenda utworzyła katalog dla wirtualnego hosta w /var/www/zabbix i umieściła pliki php interfejsu Zabbiksa wewnątrz katalogu /var/www/zabbix/htdocs. Aby sprawić, że mój interfejs WWW Zabbiska będzie dostępny musiałem utworzyć pliki konfiguracyjne wirtualnych hostów i umieścić je wewnątrz katalgu /etc/apache2/vhosts.d/. Poniżej możesz zobaczyć konfiguracje wirtualnych hostów dla mojego Zabbiksa:
<VirtualHost *:80> ServerAdmin admin@my_domain.org DocumentRoot /var/www/zabbix/htdocs/ ServerName cname.my_domain.org RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [R,L] ErrorLog /var/log/apache2/zabbix-error_log CustomLog /var/log/apache2/zabbix-access_log common </VirtualHost>
<VirtualHost *:443> ServerAdmin admin@my_domain.org ServerName cname.my_domain.org UseCanonicalName On SSLEngine on SSLOptions StrictRequire SSLCertificateFile /etc/ssl/apache2/server.crt SSLCertificateKeyFile /etc/ssl/apache2/server.key SSLProtocol all -SSLv2 DocumentRoot /var/www/zabbix/htdocs <Directory "/var/www/zabbix/htdocs"> Options -Indexes FollowSymLinks AllowOverride All Order allow,deny Allow from all SSLRequireSSL </Directory> ErrorLog /var/log/apache2/zabbix-ssl-error_log CustomLog /var/log/apache2/zabbix-ssl-access_log "%t %h %{HTTPS}x %{SSL_PROTOCOL}x %{SSL_CIPHER}x %{SSL_CIPHER_USEKEYSIZE}x %{SSL_CLIENT_VERIFY}x \"%r\" %b" </VirtualHost>
Jak widzisz ta konfiguracja wymusi połączenie z interfejsem Zabbiksa przy użyciu protokołu ssl. Upewniłem się że moje nazwy FQDN serwera są poprawnie skonfigurowane w moim systemie DNS. Ostatnią rzeczą do zrobienia jest upewnienie się, że wymagania interfejsu Zabbiksa są spełnione. Możesz być zaskoczony widząc te wymagania jako, że są one nieco specyficzne. Dlatego tak samo jak Gentoo Linux Wiki Archive nie polecam umieszczania tych ustawień w głównym pliku php.ini. Zamiast tego stwórz plik .htaccess wewnątrz katalogu /var/www/zabbix/htdocs i umieść tam wymagane opcje konfiguracyjne. Dla Zabbiksa 1.8.3 ta konfiguracja powinna wyglądać następująco:
php_value max_execution_time 600 php_value memory_limit 256M php_value post_max_size 32M php_value upload_max_filesize 16M php_value max_input_time 600 php_value upload_max_filesize 200M
Teraz można uruchomić ponownie serwer apache:
/etc/init.d/apache2 restart
i połączyć się przy wykorzystaniu przeglądarki z adresem Zabbiksa. Spowoduje to uruchomienie interfejsu instalacyjnego, który sprawdzi twoją konfigurację i poprosi cię o wprowadzenie wymaganych opcji konfiguracyjnych. Na końcu ten interfejs pozwoli ci zapisać plik konfiguracyjny. Powinieneś umieścić ten plik w katalogu /var/zabbix/htdocs/conf.
Teraz brakuje tylko monitorowanych komputerów. Na każdym monitorowanym serwerze powinieneś poddać edycji plik konfiguracyjny agenta /etc/zabbix/zabbix_agentd.conf i zmienić w nim linię:
Server=127.0.0.1
tak aby wskazywała ona IP twojego serwera. Powinieneś także zmienić linię:
Hostname=your_hostname
i wprowadzić unikalną nazwę hosta twojego monitorowanego komputera. Jest to wymagane do dokonywania aktywnych sprawdzeń.
Jako, że Zabbiks posiada wiele wbudowanych zdarzeń monitorowania jest to wszystko co należy zrobić aby działał poprawnie, ale jak napisałem na samym początku na moich serwerach chciałbym monitorować wydajność usług Apache i MySql . Aby tego dokonać muszę zdefiniować dodatkowe parametry użytkownika. Przykładowa konfiguracja dla bazy danych MySQL była dostępna w pliku /etc/zabbix/zabbix_agentd.conf, musiałem tylko odkomentować niektóre jego linie. Dodałem także dodatkowe opcje monitorowania MySQL wykorzystująć zapytanie sql:
SHOW GLOBAL STATUS;
Do monitorowania Apacha wykorzystałem konfigurację zaproponowaną przez Gentoo Linux Wiki Archive. Poniżej możesz znaleźć pełną listę parametrów użytkownika pochodzącą z moich monitorowanych serwerów.
#MySql Uptime UserParameter=mysql.uptime,mysqladmin -uUser -pPassword status|cut -f2 -d":"|cut -f1 -d"T" #MySql number of queries sent to the server UserParameter=mysql.questions,mysqladmin -uUser -pPassword status|cut -f4 -d":"|cut -f1 -d"S" #MySql SlowQueries UserParameter=mysql.slowqueries,mysqladmin -uUser -pPassword status|cut -f5 -d":"|cut -f1 -d"O" #MySql Queries Per Second UserParameter=mysql.qps,mysqladmin -uUser -pPassword status|cut -f9 -d":" #Mysql Bytes recived UserParameter=mysql.bytes_received,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Bytes_received | awk '{ print $2; }' #MySql Bytes sent UserParameter=mysql.bytes_sent,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Bytes_sent | awk '{ print $2; }' #MySql Connections UserParameter=mysql.connections,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Connections | awk '{ print $2; }' #MySql Key Reads UserParameter=mysql.key_reads,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Key_reads | awk '{ print $2; }' #MySql Key Writes UserParameter=mysql.key_writes,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Key_writes | awk '{ print $2; }' #MySql Threads Running UserParameter=mysql.threads_running,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Threads_running | awk '{ print $2; }' #MySql Threads Connected UserParameter=mysql.threads_connected,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Threads_connected | awk '{ print $2; }' #MySql InnoDB Buffer Pool Read UserParameter=mysql.innodb_pool_read,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Innodb_buffer_pool_read_requests | awk '{ print $2; }' #MySql InnoDB Buffer Pool Writes UserParameter=mysql.innodb_pool_writes,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Innodb_buffer_pool_write_requests | awk '{ print $2; }' #MySql InnoDB Data Reads UserParameter=mysql.innodb_data_reads,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Innodb_data_reads | awk '{ print $2; }' #MySql InnoDB Data Writes UserParameter=mysql.innodb_data_writes,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Innodb_data_writes | awk '{ print $2; }' #Apache monitoring #Total Accesses UserParameter=apache.accesses,wget --quiet -O - http://localhost/server-status?auto | head -n 9 | grep Accesses | cut -d " " -f 3 #Total kBytes UserParameter=apache.totalkb,wget --quiet -O - http://localhost/server-status?auto | head -n 9 | grep kBytes | cut -d " " -f 3 #CPU Load UserParameter=apache.cpuload,wget --quiet -O - http://localhost/server-status?auto | head -n 9 | grep CPULoad | cut -d " " -f 2 #Apache uptime UserParameter=apache.uptime,wget --quiet -O - http://localhost/server-status?auto | head -n 9 | grep Uptime | cut -d " " -f 2 #Requests per second UserParameter=apache.reqpersec,wget --quiet -O - http://localhost/server-status?auto | head -n 9 | grep ReqPerSec | cut -d " " -f 2 #Bytes per second UserParameter=apache.bytespersec,wget --quiet -O - http://localhost/server-status?auto | head -n 9 | grep BytesPerSec | cut -d " " -f 2 #Bytes per request UserParameter=apache.bytesperrec,wget --quiet -O - http://localhost/server-status?auto | head -n 9 | grep BytesPerReq | cut -d " " -f 2 #Busy Workers UserParameter=apache.busywokers,wget --quiet -O - http://localhost/server-status?auto | head -n 9 | grep BusyWorkers | cut -d " " -f 2 #Idle Workers UserParameter=apache.idleworkers,wget --quiet -O - http://localhost/server-status?auto | head -n 9 | grep IdleWorkers | cut -d " " -f 2
Jest to pełna konfiguracja jaką wykorzystuję, ale jako że Zabbix to świetne narzędzie na pewno dodam coś do niej w przyszłości. Ostatnia rzecz jaką należy zrobić to uruchomienie usługi agenta Zabbix na wszystkich monitorowanych serwerach:
/etc/init.d/zabbix-agentd start
i dodanie jej do domyślnego poziomu uruchamiania tak aby startowała z każdym uruchomieniem systemu:
rc-update add zabbix-agentd default
Zrobiłem jeszcze jedną dodatkową rzecz. Jako, że wykorzystuję Monita do kontrolowania wszystkich uruchomionych usług na moim serwerze dodałem konfigurację serwera i agenta Zabbix do pliku konfiguracyjnego /etc/monitrc. Konfiguracja Monita dla Serwera wygląda następująco:
################################################### #Check zabbix server ################################################### check process zabbix-server with pidfile /var/run/zabbix/zabbix_server.pid group monitoring start program = "/etc/init.d/zabbix-server start" stop program = "/etc/init.d/zabbix-server stop" if failed host 127.0.0.1 port 10051 then restart if 5 restarts within 5 cycles then timeout
a dla agenta konfiguracja Monita wygląda tak:
################################################### #Check zabbix agent ################################################### check process zabbix-agentd with pidfile /var/run/zabbix/zabbix_agentd.pid group monitoring start program = "/etc/init.d/zabbix-agentd start" stop program = "/etc/init.d/zabbix-agentd stop" if failed host 127.0.0.1 port 10050 then restart if 5 restarts within 5 cycles then timeout
Teraz możesz rozpocząć monitorowanie swoich serwerów i stworzyć dla nich rozbudowaną konfigurację wykorzystując interfejs WWW Zabbiksa. Jeśli chciałbyś tworzyć wykresy na podstawie parametrów użytkownika będziesz musiał stworzyć dla nich zdarzenia podając klucz UserParameter tak jak zdefiniowałeś go w pliku konfiguracyjnym /etc/zabbix/zabbix-agentd. Porównaj z poniższym zrzutem ekranu:
Wykorzystując Zabbiksa możesz w prosty sposób tworzyć wykresy takie jak ten pokazany na poniższym zrzucie ekranu:
Możesz tworzyć ekrany prezentujące grupy wykresów umieszczonych obok siebie tak jak pokazuje to poniższy zrzut ekranu:
Możesz także tworzyć pokazy slajdów, wyzwalacza i wiele innych przydatnych rzeczy wykorzystując Zabbiksa. Upewnij się, że zajrzysz do dokumentacji Zabbiska. Znajdziesz tam wiele przydatnych informacji temat tego świetnego narzędzia.
Źródła:
- Dokumentajca Zabbiksa
- Gentoo Linux Wiki Archive dotyczące Zabbiska.
GNU Free Documentation License or Creative Commons Share Alike
- Opublikowano:
- Komentarz:
- 12.03.2012
- "answer":I'm not sure what do you mean by template? The definition is preaty simple: UserParameter= key_used_in_zabbix_interface, command that will print some information
- 21.02.2012
- "Request":Can you provide a template with the items using the keys declared by your UserParameters ? thanks
Jeśli znalazłeś jakieś błędy w powyższej informacji lub po prostu chcesz wypowiedzieć swoje zdanie na jej temat, będę wdzięczny za pozostawienie komentarza.
Wszystkie komentarze będą pokazywać się na stronie po tym jak zostaną zatwierdzone. Przepraszam za to ale chcę mieć pewność, że moja strona będzie wolna od obraźliwych lub wulgarnych treści. Nie mam nic przeciwko krytyce ale zrób to właściwie dobierając słowa.
Trwa przetwarzanie komentarza.