ver. 0.8.9 - SureAlived
Transkrypt
ver. 0.8.9 - SureAlived
ver. 0.8.9 Spis treści 1 Wprowadzenie 1.1 Czym jest i jak działa SureAliveD? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Charakterystyka surealived . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Charakterystyka ipvssync . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 4 4 2 Instalacja 2.1 Ze źródeł . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 3 Uruchomienie 3.1 Schemat działania . . . . . . . . . . . 3.2 Uruchamianie testera . . . . . . . . . 3.3 Uruchamianie synchronizatora . . . . 3.4 Ogólne uwagi odnośnie uruchamiania . . . . 7 7 8 8 9 . . . . . . . . . . . . 10 10 10 11 11 12 12 13 14 14 14 15 15 . . . . . . . . . . . . 4 Konfiguracja 4.1 Głowny plik konfiguracyjny . . . . . . . . 4.1.1 Zmienne konfiguracyjne surealived 4.1.2 Zmienne konfiguracyjne ipvssync . 4.1.3 Wspólne zmienne konfiguracyjne . 4.2 Konfiguracja serwisów . . . . . . . . . . . 4.2.1 Ogólny zarys konfiguracji serwisów 4.2.2 Tester HTTP . . . . . . . . . . . . 4.2.3 Tester TCP . . . . . . . . . . . . . 4.2.4 Tester DNS . . . . . . . . . . . . . 4.2.5 Tester EXEC . . . . . . . . . . . . 4.2.6 Pseudotester NO-TEST . . . . . . . 4.3 Interfejs CMD . . . . . . . . . . . . . . . . 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Wprowadzenie Linux Virtual Server (LVS) jest jednym z najbardziej wydajnych serwerów balansowania ruchu. W środowiskach, gdzie istnieja˛ setki (jak nie tysiace) ˛ usług wpi˛etych do LVS, prawdziwym wyzwaniem staje si˛e ich przetestowanie i podj˛ecie właściwej akcji (wypi˛ecie / wpi˛ecie serwera). Problemem skalowania w tej materii jest także niewielki wybór aplikacji testujacych, ˛ w szczegolności dla LVSów, gdzie wpi˛etych jest wiele serwerów a cz˛estotliwość testu nie powinna być dłuższa niż kilka sekund. Takie założenie zdecydowanie ogranicza list˛e możliwych do zastosowania aplikacji, gdyż musza˛ one być oparte o multipleksowane IO (select/poll/epoll). Do tej pory jedyna˛ aplikacja˛ spełniajac ˛ a˛ te wymagania był keepalived. Ze wzgl˛edu na bł˛edy i pewne braki funkcjonalne w keepalived zdecydowaliśmy si˛e napisać od zera tester usług. Nazwaliśmy go dość przewrotnie SureAliveD, ze wzgl˛edu na to, iż chcemy być pewni, że wpi˛ete do LVSa usługi działaja.˛ 1.1 Czym jest i jak działa SureAliveD? SureAliveD jest bardzo efektywnym testerem serwerów real wpi˛etych do LVSa. Zdecydowaliśmy si˛e na odseparowanie warstwy testujacej ˛ od modyfikujacej ˛ zmiany w jadrze ˛ linuksa (w tablicy IPVS). Aplikacj˛e testujac ˛ a˛ dost˛epność reali nazwaliśmy surealived, natomiast synchronizator zmian w IPVS ipvssync. Podstawowym założeniem aplikacji było zastapienie ˛ stosowanego do tej pory keepalived w cz˛eści testujacej. ˛ Keepalived świetnie sprawuje si˛e tam, gdzie nie ma potrzeby cz˛estego grzebania w konfiguracji. W dużych środowiskach, gdzie do LVSa wpi˛ete sa˛ setki usług, problematyczna staje si˛e każdorazowa konieczność przeładowania całości konfiguracji (nawet przy potrzebie zmiany wagi pojedynczego serwera). Przy cz˛estym przeładowywaniu konfiguracji uwidaczniaja˛ si˛e bł˛edy takie jak: • zaniechanie testowania niektórych usług • segfaultowanie testera • pozostawienie otwartych deskryptorów • brak możliwości przetestowania poprawności składni pliku konfiguracyjnego • czyszczenie tablicy IPVS1 . 1 Istnieje owszem opcja uruchomienia keepalived z pozostawieniem starych wpisów, jednak od tego momentu przestaje si˛e on ”interesować” serwerami, których nie ma już w konfiguracji a pozostały w IPVS – i zamiast usuwać pozostawia je nietkni˛ete z uprzednio ustawiona˛ waga.˛ 3 1.2 Charakterystyka surealived Oto podstawowe cechy testera – surealived: • oparty na epollu, • posiada rozszerzalna˛ XMLowa˛ konfiguracj˛e (rozparsowywalna˛ przez moduł), • testery usług sa˛ w rzeczywistości ładowanymi dynamicznie modułami – daje to możliwość łatwego dodawania nowych testerów kolejnych usług, • obecnie zaimplementowane moduły testujace ˛ protokół TCP, HTTP, DNS, exec (uruchomienie zewn˛etrznego testera) oraz no-test (traktowanie serwera jako dost˛epnego) • ma wbudowana˛ przezroczysta˛ obsług˛e SSL (wystarczy ustawić atrybut SSL=”1” przy konfiguracji testera). • zapisuje statystyki połaczeń ˛ do poszczególnych serwerów (czas połaczenia ˛ i czas odpowiedzi), • trzyma tablic˛e stanów serwerów, których test si˛e nie powiódł, a także tablic˛e przesłaniajac ˛ a˛ bieżac ˛ a˛ konfiguracj˛e (stan serwera oraz wagi), stany te sa˛ honorowane po restarcie, • na starcie nast˛epuje zapisanie stanu dla ipvssync i wymuszenie synchronizacji konfiguracji z tablica˛ IPVS, • komunikacja z ipvssync odbywa si˛e poprzez plik konfiguracji dla ipvssync (zapisywany co 60 sek.) oraz pliki różnicowe, zapisywane przy każdej zmianie, • start testów rozłożony jest w czasie (1 sek.), co zmniejsza obcia˛żenie CPU w przypadku równoczesnego uruchomienia testów dla setek reali, • umożliwia sprawdzenie składni konfiguracji (parametr -t), • restart aplikacji nie stanowi problemu, • możliwa jest praca surealived tylko jako testera usług, bez synchronizacji do IPVS, • wystawia port do zarzadzania ˛ (domyślnie 1337), umożliwiajac ˛ wykonywanie pewnych akcji bez restartowania aplikacji. 1.3 Charakterystyka ipvssync Oto cechy synchronizatora ipvssync: • używa konfiguracji generowanej przez surealived (ipvsfull.cfg) oraz plików różnicowych • pozwala na pozostawienie/usuni˛ecie niezarzadzanych ˛ przez niego wirtuali z IPVS, w przypadku reali pełna synchronizacja odbywa si˛e zawsze, • możliwe jest sprawdzenie składni konfiguracji (parametr -t), • restart aplikacji nie jest problemem, podobnie jak w przypadku restartu surealived nast˛epuje wymuszenie pełnej synchronizacji z IPVS, • wymaga działania z użytkownika root. 4 2 Instalacja 2.1 Ze źródeł Do skompilowania potrzebne sa˛ nast˛epujace ˛ aplikacje i biblioteki2 : • gcc • cmake • make • glib2-dev • libxml2-dev • libssl-dev • źródła kernela (lub pakiet linux-headers) Po rozpakowaniu surealived-x.y.z.tar.gz w katalogu znajduja˛ si˛e nast˛epujace ˛ podkatalogi: • common – katalog z plikami źródłowymi wykorzystywanymi zarówno przez surealived jak i ipvssync • doc – dokumentacja • examples – przykładowe xmlowe pliki konfiguracyjne surealived • ipvssync – katalog ze źródłami synchronizatora • libipvs – biblioteka do komunikacji z IPVS, autorstwa Wensong Zhanga, wykorzystywana przez synchronizator • surealived – katalog ze źródłami testera Kompilacj˛e + instalacj˛e należy wykonać z konta root: # # # # # tar xzvf surealived-x.y.z.tar.gz cd surealived-x.y.z cmake . make make install Po instalacji w systemie pojawia˛ si˛e binarki: • /usr/sbin/ipvssync • /usr/bin/surealived Głowny plik konfiguracyjny surealived.cfg wykorzystywany przez obie aplikacje zostaje przekopiowany do katalogu /etc/surealived. 2 Podane aplikacje i biblioteki sa˛ nazwami pakietów Debiana. 5 Ponadto zostaja˛ utworzone katalogi: • /var/log/surealived – dla logów testera i synchronizatora, • /var/log/surealived/comm – dla wirtuali z ustawionym atrybutem debugcomm=”1”, • /var/lib/surealived – dla dynamicznej konfiguracji testowanych usług surealived3 oraz konfiguracji ipvssync4 , • /var/lib/surealived/diffs – z konfiguracja˛ różnicowa˛ dla ipvssync, • /var/lib/surealived/stats – dla statystyk testów reali. 3 Pliki 4 Plik offline.dump oraz override.dump. ipvsfull.cfg, pliki z konfiguracja˛ różnicowa˛ sa˛ w katalogu diffs. 6 3 Uruchomienie 3.1 Schemat działania Na poniższym diagramie przedstawiony jest schemat przepływu danych pomi˛edzy testerem a synchronizatorem. Po lewej stronie diagramu znajduje si˛e tester (surealived), złożony z dwóch procesów – watchdoga i testera. Po prawej stronie jest jednoprocesowy synchronizator (ipvssync) wpi˛ety do IPVS – synchronizer. Na środku diagramu umieszczone zostały pliki i katalogi biorace ˛ udział w wymianie danych mi˛edzy aplikacjami. Kluczowym plikiem wspólnym dla testera i synchronizatora jest surealived.cfg, którego składnia opisana jest w nast˛epnym rozdziale. Jest to prosty plik typu ”klucz wartość” opisujacy ˛ parametry działania obu aplikacji. Tester definicj˛e usług do przetestowania bierze z pliku services.xml5 . Widok reali, ich wag i to czy sa˛ wpi˛ete przesłaniane jest przez dwa pliki – offline.dump oraz override.dump. Plik offline.dump jest zapisywany przez tester i zawiera reale, których nie udało si˛e poprawnie przetestować. Dzi˛eki temu po starcie podejrzane serwery nie sa˛ wpinane lub wpinane z waga˛ = 0 do IPVS. Plik, który również przesłania konfiguracj˛e to override.dump. Może być on modyfikowany przez użytkownika poprzez interfejs cmd widoczny po lewej stronie diagramu. Jest to wystawiony nasłuchujacy ˛ port umożliwiajacy ˛ wykonanie kilku interesujacych ˛ poleceń na działajacym ˛ testerze. Co dokładnie można wykonać zostało opisane w nast˛epnym rozdziale. Podczas startu tester wymusza zbudowanie konfiguracji synchronizatora ipvsfull.cfg i inicjuje zapisywanie plików różnicowych w katalogu diffs. Chodzi o to, by przy każdym wykrytym nieprawidłowo działajacym ˛ serwerze nie zapisywać od razu całej konfiguracji a jedynie różnic˛e. Stad ˛ też plik ipvsfull.cfg zmienia si˛e co 60 sek. a wszelkie zmiany w stosunku do głównej konfiguracji sa˛ w ostatnim, bieża˛ cym pliku różnicowym. Dwa bardzo ważne zbiory biorace ˛ w tym udział to plik muteksujacy ˛ dost˛ep do konfiguracji synchronizatora – ipvsfull.lock oraz flaga konieczności przeładowania konfiguracji – ipvsfull.reload. Po restarcie testera stan IPVS z jego punktu widzenia jest nieznany, dlatego też po zbudowaniu konfiguracji ipvsfull.cfg wskazuje on konieczność pełnej modyfikacji IPVS poprzez założenie pliku ipvsfull.reload. Tego pliku regularnie poszukuje ipvssync i w przypadku znalezienia czyta nowa˛ konfiguracj˛e, wprowadza zmiany do IPVS po czym usuwa zbiór ipvsfull.reload. Podczas działania ipvssync wie w którym pliku różnicowym si˛e znajduje i usuwa z katalogu diffs wszystkie stare zbiory. Tester daje możliwość zapisu statystyk w katalogu stats. Może zapisywać zarówno do jednego wspólnego zbioru sd_fullstats.log a także zbiorów z pojedynczego testu – sd_virtstats*.TIMESTAMP. W przypadku zapisu do pojedynczych zbiórów należy zadbać o usuwanie tych zbiorów z katalogu stats6 . 5 Oczywiście plik ten może si˛e nazywać zupełnie inaczej, my założyliśmy, że jest to akurat services.xml. zapiać ˛ w cronie usuwanie lub w ogóle nie właczać ˛ zapisu do tych zbiorów poprzez ustawienie ”log_stats false” w pliku surealived.cfg. 6 Można 7 3.2 Uruchamianie testera Przed uruchomieniem synchronizatora po raz pierwszy, konieczne jest uruchomienie testera, zwiazane ˛ jest to z utworzeniem konfiguracji ipvsfull.cfg By uzyskać list˛e możliwych opcji przy uruchamianiu testera wystarczy użyć opcji -h. wegorz@zaphod:~$ surealived -h === SureAliveD v.0.8.9 === Usage: surealived [options] <xml_config_file> Ex : surealived -c /root/sd_new.conf -vv -d test_http.xml Options: --help --test-config --config --verbose --daemonize --no-sync --no-dumpfile --version -h -t -c <path> -v -d -n -k -V This help info Test configuration and exit Use <path> as config file Increase verbosity level Run in background (daemonize) Do not write sync info Do not load and create offline.dump Show Version information Bardzo użyteczna˛ opcja˛ jest -t, pozwalajaca ˛ przetestować poprawność xmlowego pliku konfiguracyjnego serwisów. Standardowo kody wyjścia z programu oznaczaja: ˛ 0 – ok, różny od 0 – bład. ˛ W normalnym produkcyjnym środowisku zazwyczaj tester b˛edzie uruchamiany jako demon: wegorz@zaphod:~$ surealived -d /etc/surealived/services.xml Należy pami˛etać, że w przypadku uruchamiania testera jako demona wszelkie komunikaty o bł˛edach pojawia˛ si˛e w /var/log/surealived/surealived.log o ile istnieje możliwość zapisu do takiego zbioru. Dlatego przed produkcyjnym uruchomieniem najlepiej jest przetestować czy tester bez problemu podniesie si˛e jako proces pierwszoplanowy: wegorz@zaphod:~$ surealived -vvv /etc/surealived/services.xml 3.3 Uruchamianie synchronizatora Jeśli istnieje plik konfiguracyjny dla synchronizatora możemy go (synchronizator) uruchomić – koniecznie z uprawnieniami roota, gdyż modyfikuje on IPVS. By uzyskać list˛e możliwych opcji przy uruchamianiu synchronizatora wystarczy użyć opcji -h. zaphod:~# ipvssync -h === IPVSSync v.0.8.9 === Usage: ipvssync [options] Ex : ipvssync -c /home/surealived/surealived.cfg Options: --help --test-config --config --verbose --daemonize --del-umanaged --keep-diffs --version -h -t -c -v -d -u -k -V This help info Test ipvsfull.cfg configuration and exit Config file (default /etc/surealived/surealived.cfg) Increase verbosity level Run in background (daemonize) Delete unmanaged virtuals from IPVS table Don’t remove processed diff files Show Version information 8 Zanim jednak uruchomimy synchronizator możemy przetestować poprawność pliku ipvsfull.cfg wykorzystujac ˛ opcj˛e -t. Standardowo kody wyjścia z programu oznaczaja: ˛ 0 – ok, różny od 0 – bład. ˛ Opcje które zmieniaja˛ zachowanie synchronizatora to -u oraz -k. Pierwsza z nich powoduje, że ipvssync działa trybie usuwania wszystkich niezdefiniowanych w pliku ipvsfull.cfg wirtuali. Jeśli wi˛ec zostanie coś dodane ”z r˛eki” do IPVS przy przeładowaniu konfiguracji synchronizator usunie to z tablicy. Druga wspomniana opcja wyłacza ˛ usuwanie plików różnicowych w katalogu diffs. 3.4 Ogólne uwagi odnośnie uruchamiania Obie aplikacje zaleca si˛e uruchomić produkcyjnie z logowaniem typu info. W logach obu aplikacji pojawia˛ si˛e najbardziej użyteczne informacje zwiazane ˛ z praca˛ zarówno testera jak i synchronizatora. W przypadku testowania konfiguracji najlepiej jest aplikacje uruchomić z parametrem ’-vvv’, bez wprowadzenia ich w tryb demona. 9 4 Konfiguracja 4.1 Głowny plik konfiguracyjny Domyślnie główny plik konfiguracyjny surealived.cfg rezyduje w /etc/surealived. Zawiera on podstawowa˛ konfiguracj˛e zarówno dla surealived jak i ipvssync. Konfiguracja ta może być w oddzielnych zbiorach, zwłaszcza, że synchronizator korzysta tylko z kilku zmiennych z tego zbioru. Jednakże, jeśli chcemy si˛e uchronić przed dziwnymi bł˛edami zwiazanymi ˛ z tym, że oba programy b˛eda˛ miały różne wartości tych wspólnych zmiennych lepiej jest je zostawić w tym zbiorze. 4.1.1 Zmienne konfiguracyjne surealived Oto lista zmiennych wykorzystywanych przez tester: • maxfd – maksymalna ilość (domyślnie 1024) otwartych deskryptorów procesu7 . • log – ścieżka do logu lub stderr. Wartość ta jest nadpisywana na stderr jeśli program nie b˛edzie uruchamiany w trybie demona. • logging – poziom szczegółowości logowania w kolejności rosnacej: ˛ error, warn, info, debug, debdt. Wartość ta jest nadpisywana przez parametr -v. • modules_path – ścieżka do binarnych modułów (testera). • modules – lista modułów do załadowania oddzielona przecinkami (UWAGA – nie może być spacji po przecinku) lub all, co spowoduje załadowanie wszystkich modułów ze ścieżki modules_path. • epoll_size – minimalny rozmiar epolla, jeśli ilość testowanych usług jest wi˛eksza od tej wartości zostanie ona nadpisana. • loop_interval_ms – określa co ile milisekund tester powinien sprawdzać czy czas testów virtuala dobiegł końca lub też należy go wystartować (domyślnie: 100) • epoll_interval_ms – maksymalny czas (w milisekundach) jaki epoll ma czekać na zdarzenie (domyślnie: 10) • startup_delay_ms – tzw. rozbiegówka – określa okres w którym testy maja˛ być rozpocz˛ete (czasy startu testów b˛eda rozłożone w tym okresie) (domyślnie: 1000) • debug_comm – flaga 0/1 określajaca ˛ możliwość zrzucania przebiegu komunikacji z realami w danym wirtualu. Przełaczenie ˛ jej na 1 jest warunkiem koniecznym (niewystarczajacym) ˛ do zapisu komunikacji przez tester8 . • debug_comm_path – ścieżka, gdzie zapisywane b˛eda˛ zrzuty z komunikacji. • memlimit – limit pami˛eci w MB, w przypadku przekroczenia limitu watchdog zresetuje surealived, wartość ta jest ignorowana gdy program nie jest uruchomiony jako demon. • listen_addr – adres interfejsu poleceń (cmd) na którym można pobrać statystyki działania testera a także wykonać aktywne operacje takie jak zmiana wagi reala oraz jego wpi˛ecie/wypi˛ecie (ONLINE/OFFLINE/DOWN), domyślnie 127.0.0.1. 7 Jeśli uruchamiasz aplikacj˛e z roota sprawa jest prosta, w przeciwnym wypadku upewnij si˛e, że użytkownik może przestawić ta˛ wartość. 8 Należy jeszcze w konfiguracji xmlowej w tagu <tester> ustawić atrybut debugcomm=”1”. 10 • listen_port – port interfejsu poleceń (cmd), domyślnie 1337. • stats_dir – ścieżka, gdzie zapisywane b˛eda˛ statystyki testów9 . • log_stats – ustawienie wartości na true spowoduje, że do stats_dir b˛eda˛ zapisywane statystyki testów w sposób indywidualny, tj <zbiór>.<timestamp> per test wirtuala10 . • log_stats_combined – wartość true oznacza, że do jednego zbioru b˛eda˛ dopisywane wszystkie statystyki testów11 . • no_sync – jeśli true nie b˛eda˛ tworzone pliki dla synchronizatora. • use_offline_dump – czy zapisywać stan reali, których nie udało si˛e poprawnie przetestować (plik stanów negatywnych). • offline_dump – ścieżka do pliku offline.dump – wartość ta jest ignorowana gdy use_offline_dump jest ustawione na false • override_dump – ścieżka do pliku override.dump 4.1.2 Zmienne konfiguracyjne ipvssync Oto lista zmiennych wykorzystywanych przez synchronizator: • ipvssync_log – ścieżka do pliku logu synchronizatora lub stderr. Wartość ta jest nadpisywana na stderr jeśli program nie b˛edzie uruchamiany w trybie demona. • ipvssync_logging – poziom szczegółowości logowania w kolejności rosnacej: ˛ error, warn, info, debug, debdt. Wartość ta jest nadpisywana przez parametr -v. 4.1.3 Wspólne zmienne konfiguracyjne Oto lista zmiennych wykorzystywanych zarówno przez tester jak i synchronizator: • lock_sync_file – plik służacy ˛ do synchronizacji pomi˛edzy testerem a synchronizatorem (flock). • full_sync_file – plik pełnej konfiguracji tablicy IPVS dla synchronizatora (generowany co 60 sek. przez tester). • full_reload_file – plik (flaga), którego pojawienie si˛e wymusza przeładowanie konfiguracji synchronizatora. • diff_sync_dir – katalog, gdzie zapisywane b˛eda˛ pliki różnicowe (zawierajace ˛ zmiany w stosunku do pełnego pliku konfiguracji). 9 Można 10 Jeśli je wykorzystać do analizy czasów odpowiedzi poszczególnych serwerów, zbalansowania wirtuali, itp. właczysz ˛ ta˛ opcj˛e zadbaj o czyszczenie katalogu ze starych zbiorów, gdyż bardzo szybko b˛edziesz tam miał miliony zbiorów. 11 Zbiór można przycinać, gdyż aplikacja dopisuje na koniec (tworzac ˛ wcześniej zbiór jeśli nie istnieje). 11 4.2 Konfiguracja serwisów XMLowy plik konfigurujacy ˛ testowane przez surealived serwisy jest jego argumentem w momencie uruchomienia. Może si˛e wi˛ec znajdować w dowolnym miejscu, załóżmy wi˛ec, że konfiguracja ta jest w pliku /etc/surealived/services.xml. 4.2.1 Ogólny zarys konfiguracji serwisów Plik konfigurujacy ˛ serwisy ma składni˛e typu: <surealived> <virtual ...> <tester ... /> <real ... /> <real ... /> ... </virtual> <virtual ...> <tester ... /> <real ... /> ... </virtual> </surealived> Atrybuty taga <virtual>: • name=”string” [obligatoryjny] – (max 31 znaków, z zakresu [a-zA-Z0-9_-]), • addr=”ip” [obligatoryjny jeśli atrybut fwmark nie jest ustawiony, w przeciwnym wypadku b˛edzie użyty adres ”0.0.0.0”], • port=”int16” [0<=port<=65535, obligatoryjny jeśli nie jest ustawiony fwmark, w przeciwnym wypadku ”0”], • proto=”tcp|udp|fwmark” [obligatoryjny], • sched=”string” [obligatoryjny] – zostanie wykorzystany taki scheduler, • rt=”dr|masq|tun” [obligatoryjny], typ rutingu w IPVS • fwmark=”int” [opcjonalny, jeśli > 0 proto=”fwmark” powinien być ustawiony], • pers=”int” [opcjonalny] – dla połaczeń ˛ persistent to jest wartość timeoutu. Atrybuty taga <tester>: • loopdelay=”int” [opcjonalny, domyślnie 3] – określa opóźnienie w sekundach pomi˛edzy p˛etlami testujacymi ˛ ten wirtual, • timeout=”int” [opcjonalny, domyślnie 5] – czas w sekundach podczas którego każdy real musi zwrócić odpowiedź, • retries2ok=”int” [opcjonalny, domyślnie 1] – ile testów musi si˛e powieść by real był potraktowany jako online, • retries2fail=”int” [opcjonalny, domyślnie 1] – ile testów musi si˛e zakończyć niepowodzeniem by real był potraktowany jako offline, 12 • remove_on_fail=”0|1” [opcjonalnie, domyślnie 0 (fałsz)] – jeśli ”prawda” real b˛edacy ˛ offline jest usuwany z IPVS, • logmicro=”0|1” [opcjonalny, domyślnie 0 (fałsz)] – zapisywać statystyki z mikrosekundowa˛ dokładnościa˛ do plików statystyk (dla ”prawda”), • proto=”string” [obligatoryjny] – który moduł zostanie użyty do testowania, • testport=”int” [obligatoryjny] – który port ma być testowany (real może nadpisać ta˛ wartość u siebie), • SSL=”0|1” [opcjonalnie, domyślnie 0] – użyć SSL czy też nie. Atrybuty taga <real>: • name=”string” [obligatoryjny] (max 31 znaków, z zakresu [a-zA-Z0-9_-]), • addr=”ip” [obligatoryjny] – adres IP reala, • port=”int16” [obligatoryjny] – port IP reala w IPVS, • weight=”int” [obligatoryjny] – waga reala w IPVS, • uthresh=”int” [opcjonalny, domyślnie 0 (brak limitu)] – górny limit połaczeń ˛ reala w IPVS, • lthresh=”int” [opcjonalny, domyślnie 0 (brak limitu)] – dolny limit połaczeń ˛ reala w IPVS, • testport=”int16” [opcjonalny] – nadpisuje atrybut testera ”testport” dla danego reala, • rt=”string” [opcjonalny] – nadpisuje atrybut testera ”rt” dla danego reala. 4.2.2 Tester HTTP Gdy chcemy użyć testera HTTP do przetestowania konkretnego reala, należy ustawić proto=”http” w tagu tester oraz atrybuty: ˛ odpytywany obiekt na serwerze, • url=”string” [obligatoryjny, max 4095 znaków] – określajacy • host=”string” [obligatoryjny, max 255 znaków] – określa nagłowek ”Host”, • retcode=”string” [opcjonalny, domyślnie ”200”] – kod powrotu określajacy, ˛ że test si˛e powiódł, • naive=”True|False” [opcjonalny, domyślnie ”False” (fałsz) – określa czy należy sciagać ˛ obiekt do końca, czy wystarczy otrzymać kod powrotu. Przykładowy plik XML: <surealived> <virtual name="onet" addr="192.168.0.1" port="80" proto="tcp" sched="wrr" rt="dr"> <tester loopdelay="1" timeout="2" retries2fail="1" retries2ok="1" proto="http" testport="80" url="/" host="www.onet.pl"/> <real name="sg" addr="213.180.146.27" port="80" weight="10"/> </virtual> </surealived> 13 4.2.3 Tester TCP Najprostszy tester, sprawdza tylko otwartość portu TCP. Wymaga proto=”tcp” w tagu tester. Nie wykorzystuje żadnych dodatkowych atrybutów. Przykładowy plik XML: <surealived> <virtual name="onet" addr="192.168.0.1" port="22" proto="tcp" sched="wrr" rt="dr"> <tester loopdelay="1" timeout="2" retries2fail="1" retries2ok="1" proto="tcp" testport="22" /> <real name="sg" addr="213.180.146.27" port="22" weight="10"/> </virtual> </surealived> 4.2.4 Tester DNS Tester UDP sprawdzacy ˛ SOA dla podanej domeny. Wymaga proto=”dns” w tagu tester. Wykorzystuje tylko jeden dodatkowy atrybut: • request=”string” [obligatoryjny, max 255 znaków] – określa domen˛e dla której tester odpyta o SOA. Przykładowy plik XML: <surealived> <virtual name="onetdns1" addr="192.168.0.1" port="53" proto="udp" sched="wrr" rt="dr"> <tester loopdelay="1" timeout="2" retries2fail="1" retries2ok="1" proto="dns" testport="53" request="onet.pl" logmicro="1"/> <real name="dns1" addr="213.180.128.240" port="53" weight="10"/> <real name="dns2" addr="217.97.201.240" port="53" weight="11"/> </virtual> </surealived> 4.2.5 Tester EXEC Tester który wywołuje dowolny zewn˛etrzny program. Wymaga proto=”exec” w tagu tester. Wykorzystuje dodatkowe atrybuty: • exec=”string” [obligatoryjny, max MAXPATHLEN-1 znaków czyli 1023] – nazwa programu do uruchomienia, • params=”string” [opcjonalny, max 1023 znaki] – dodatkowe argumenty przekazywane programowi separowane spacjami. W momencie wywołania lista argumentów z jaka˛ wywoływany jest program to: • arg0 – adres IP reala, • arg1 – port (testport) dla reala, • arg2 – params[0], • arg. – params[...], • argn – params[n]. 14 Oczywiście jeśli nie zostanie podany atrybut params aplikacja testujaca ˛ zostanie wywołana tylko z dwoma argumentami. Kod powrotu == 0 oznacza, że test si˛e powiódł. Dowolny inny kod powrotu traktowany jest jako bład ˛ testu. Przykładowy plik XML: <surealived> <virtual name="onetexec" proto="tcp" addr="192.168.0.1" port="80" sched="wrr" rt="dr"> <tester loopdelay="1" timeout="5" retries2fail="1" retries2ok="1" testport="80" proto="exec" exec="/usr/lib/surealived/scripts/testexec.pl" params="www.onet.pl /0" /> <real name="sg" addr="213.180.146.27" port="80" weight="10" rt="dr"/> </virtual> </surealived> 4.2.6 Pseudotester NO-TEST Pseudotester traktujacy ˛ serwer jako zawsze online. Wymaga proto=”no-test” w tagu tester. Przykładowy plik XML: <surealived> <virtual name="onet" addr="192.168.0.1" port="80" proto="tcp" sched="wrr" rt="dr"> <tester loopdelay="1" timeout="2" retries2fail="1" retries2ok="1" proto="no-test" testport="80" /> <real name="sg" addr="213.180.146.27" port="80" weight="10"/> </virtual> </surealived> 4.3 Interfejs CMD Aplikacja surealived umożliwia odczyt pewnych parametrów pracy programu oraz nadpisywanie niektórych ustawień serwerów real w locie bez konieczności modyfikacji pliku services.xml. Domyślnie na loopbacku (127.0.0.1) i porcie 1337 nasłuchuje interfejs cmd. Obecnie można wykonać nast˛epujace ˛ akcje: • vlist [pasywny] – wylistowuje wirtuale zdefiniowane w pami˛eci testera, • rlist [pasywny] – wylistowuje reale zdefiniowane dla konkretnego wirtuala w pami˛eci testera, • stats [pasywny] – pokazuje statystyki działania aplikacji, ilość zdefioniowanych wirtuali, reali i wiele innych, • rset [aktywny] – umożliwia dynamiczne zarzadzanie ˛ wagami oraz ustawiania serwera w stan OFFLINE (waga = 0) lub DOWN (serwer jest usuwany z IPVS). Przykłady: > printf "vlist\n" | nc -q 1 localhost 1337 0. vname=onet vproto=tcp vaddr=192.168.0.1 vport=80 vfwmark=0 vrt=dr vsched=wrr 1. vname=wp vproto=tcp vaddr=192.168.0.2 vport=80 vfwmark=0 vrt=dr vsched=wrr > printf "rlist vproto=tcp vaddr=192.168.0.2 vport=80\n" | nc -q 1 localhost 1337 1. raddr=212.77.100.101 rport=80 currwgt=11 confwgt=11 ronline=TRUE rstate=ONLINE > printf "rset vproto=tcp vaddr=192.168.0.2 vport=80 raddr=212.77.100.101 rport=80 rweight=1\%\%\n" \ | nc -q 1 localhost 1337 15 Set: rstate=ONLINE, weight=1, inpercent=TRUE > printf "rset vproto=tcp vaddr=192.168.0.2 vport=80 raddr=212.77.100.101 rport=80 rstate=OFFLINE\n" \ | nc -q 1 localhost 1337 Set: rstate=OFFLINE, weight=-1, inpercent=FALSE > printf "rlist vproto=tcp vaddr=192.168.0.2 vport=80\n" | nc -q 1 localhost 1337 1. raddr=212.77.100.101 rport=80 currwgt=0 confwgt=11 ronline=TRUE rstate=OFFLINE > printf "stats\n" | nc -q 1 localhost 1337 ... statistics here ... Polecenie aktywne rset umożliwia zmian˛e wagi również jako procent domyślnie skonfigurowanej wartości. Trzeba pami˛etać, że dla 1% zostanie ustawiona waga minimum równa 112 . Wszelkie zmiany modyfikowane z wykorzystaniem cmd zapisywane sa˛ w pliku override.dump. Takie podejście umożliwia przetrwanie nadpisanych przez nas ustawień w przypadku modyfikacji konfiguracji xml lub zrestartowaniu surealived. 12 Zakładajac, ˛ że wagi sa˛ ustawiane w zależności od wypełnienia cache, przy wadze ustawionej na 10 i pustym cache 1% zawsze równałby si˛e 0 i nigdy do takiego reala nie poszedłby ruch. 16