21 wrzesień 2010

Monitorowanie rozproszonych serwerów przy użyciu Zabbixa

Kategorie:  Server  Monitoring  Linux  Gentoo

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:

Wyświetl zabbix_vhost.conf
  1. <VirtualHost *:80>
  2. ServerAdmin admin@my_domain.org
  3. DocumentRoot /var/www/zabbix/htdocs/
  4. ServerName cname.my_domain.org
  5. RewriteEngine On
  6. RewriteCond %{HTTPS} !=on
  7. RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [R,L]
  8. ErrorLog /var/log/apache2/zabbix-error_log
  9. CustomLog /var/log/apache2/zabbix-access_log common
  10. </VirtualHost>

Wyświetl zabbix_ssl_vhost.conf
  1. <VirtualHost *:443>
  2. ServerAdmin admin@my_domain.org
  3. ServerName cname.my_domain.org
  4. UseCanonicalName On
  5. SSLEngine on
  6. SSLOptions StrictRequire
  7. SSLCertificateFile /etc/ssl/apache2/server.crt
  8. SSLCertificateKeyFile /etc/ssl/apache2/server.key
  9. SSLProtocol all -SSLv2
  10. DocumentRoot /var/www/zabbix/htdocs
  11. <Directory "/var/www/zabbix/htdocs">
  12. Options -Indexes FollowSymLinks
  13. AllowOverride All
  14. Order allow,deny
  15. Allow from all
  16. SSLRequireSSL
  17. </Directory>
  18. ErrorLog /var/log/apache2/zabbix-ssl-error_log
  19. 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"
  20. </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.

Wyświetl konfigurację parametrów użytkownika
  1. #MySql Uptime
  2. UserParameter=mysql.uptime,mysqladmin -uUser -pPassword status|cut -f2 -d":"|cut -f1 -d"T"
  3. #MySql number of queries sent to the server
  4. UserParameter=mysql.questions,mysqladmin -uUser -pPassword status|cut -f4 -d":"|cut -f1 -d"S"
  5. #MySql SlowQueries
  6. UserParameter=mysql.slowqueries,mysqladmin -uUser -pPassword status|cut -f5 -d":"|cut -f1 -d"O"
  7. #MySql Queries Per Second
  8. UserParameter=mysql.qps,mysqladmin -uUser -pPassword status|cut -f9 -d":"
  9. #Mysql Bytes recived
  10. UserParameter=mysql.bytes_received,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Bytes_received | awk '{ print $2; }'
  11. #MySql Bytes sent
  12. UserParameter=mysql.bytes_sent,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Bytes_sent | awk '{ print $2; }'
  13. #MySql Connections
  14. UserParameter=mysql.connections,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Connections | awk '{ print $2; }'
  15. #MySql Key Reads
  16. UserParameter=mysql.key_reads,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Key_reads | awk '{ print $2; }'
  17. #MySql Key Writes
  18. UserParameter=mysql.key_writes,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Key_writes | awk '{ print $2; }'
  19. #MySql Threads Running
  20. UserParameter=mysql.threads_running,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Threads_running | awk '{ print $2; }'
  21. #MySql Threads Connected
  22. UserParameter=mysql.threads_connected,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Threads_connected | awk '{ print $2; }'
  23. #MySql InnoDB Buffer Pool Read
  24. UserParameter=mysql.innodb_pool_read,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Innodb_buffer_pool_read_requests | awk '{ print $2; }'
  25. #MySql InnoDB Buffer Pool Writes
  26. UserParameter=mysql.innodb_pool_writes,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Innodb_buffer_pool_write_requests | awk '{ print $2; }'
  27. #MySql InnoDB Data Reads
  28. UserParameter=mysql.innodb_data_reads,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Innodb_data_reads | awk '{ print $2; }'
  29. #MySql InnoDB Data Writes
  30. UserParameter=mysql.innodb_data_writes,echo 'SHOW GLOBAL STATUS;' | mysql -u User --password=Password | grep Innodb_data_writes | awk '{ print $2; }'
  31. #Apache monitoring
  32. #Total Accesses
  33. UserParameter=apache.accesses,wget --quiet -O - http://localhost/server-status?auto | head -n 9 | grep Accesses | cut -d " " -f 3
  34. #Total kBytes
  35. UserParameter=apache.totalkb,wget --quiet -O - http://localhost/server-status?auto | head -n 9 | grep kBytes | cut -d " " -f 3
  36. #CPU Load
  37. UserParameter=apache.cpuload,wget --quiet -O - http://localhost/server-status?auto | head -n 9 | grep CPULoad | cut -d " " -f 2
  38. #Apache uptime
  39. UserParameter=apache.uptime,wget --quiet -O - http://localhost/server-status?auto | head -n 9 | grep Uptime | cut -d " " -f 2
  40. #Requests per second
  41. UserParameter=apache.reqpersec,wget --quiet -O - http://localhost/server-status?auto | head -n 9 | grep ReqPerSec | cut -d " " -f 2
  42. #Bytes per second
  43. UserParameter=apache.bytespersec,wget --quiet -O - http://localhost/server-status?auto | head -n 9 | grep BytesPerSec | cut -d " " -f 2
  44. #Bytes per request
  45. UserParameter=apache.bytesperrec,wget --quiet -O - http://localhost/server-status?auto | head -n 9 | grep BytesPerReq | cut -d " " -f 2
  46. #Busy Workers
  47. UserParameter=apache.busywokers,wget --quiet -O - http://localhost/server-status?auto | head -n 9 | grep BusyWorkers | cut -d " " -f 2
  48. #Idle Workers
  49. 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:

Zabbix Web FrontEnd

Wykorzystując Zabbiksa możesz w prosty sposób tworzyć wykresy takie jak ten pokazany na poniższym zrzucie ekranu:

Zabbix Web FrontEnd

Możesz tworzyć ekrany prezentujące grupy wykresów umieszczonych obok siebie tak jak pokazuje to poniższy zrzut ekranu:

Zabbix Web FrontEnd

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:




Komentarze

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.

Pozostaw komentarz

  • Opublikowano:
  • Autor:
  •  
  • Komentarz:
  • 12.03.2012
  • kardasa
  •  
  • "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
  • Ben
  •  
  • "Request":
    Can you provide a template with the items using the keys declared by your UserParameters ? thanks