Taustaa
Ensimmäisessä osassa artikkelia rakensimme ympäristön jossa kahdella erillisellä Linux-palvelimella on yksi yhteinen, DRBD:llä peilattu levy sekä sen päällä GFS2:lla toteutettu klusteroitu tiedostojärjestelmä. Kun perusteet on tehty voidaan ympäristöön ottaa käyttöön erilaisia palveluita. Periaatteessa melkein kaikki normaalit palvelut voidaan toteuttaa DRBD:n päällä, mutta esim. tietokannat vaativat hieman asetusten muuttamista ja niitä ei tässä artikkelissa nyt käsitellä.
Tässä artikkelissa esitän tavan toteuttaa DNS-palvelimen avulla kuormantasausta sekä keinon jolla DNS-palvelun avulla voidaan toteuttaa käytettävyyden kannalta yksi olennainen asia, nimellä voidaan tarjota palvelua kahden eri operaattorin kautta ja kun toinen operaattori ei toimi tarjotaan palvelua automaattisesti jäljellä olevan kautta. Ratkaisu ei kuitenkaan ole täysin katastrofivarma, koska jos ympäristössämme on esimerkkinä palvelin a joka on kytketty internet-yhteys a:n sekä palvelin b kytkettynä internet-yhteys b:n voi käytännössä tapahtua tilanne jossa sekä internet-yhteys a että palvelin b ovat poissa käytöstä laitevikojen vuoksi, tällöin palvelut eivät toimi. Antamani esimerkki kuitenkin tarjoaa tavan toteuttaa parempaa käytettävyyttä, koska on kuitenkin epätodennäköisempää että internet-yhteys toisesta konesalista ja palvelin toisesta on rikki.
Tässä artikkelissa tulen näyttämään miten voit parantaa käytettävyyttä www-palveluille DNS-kuormantasauksella.
DNS-palvelun avulla toteutettava kuormantasaus
Homma aloitetaan asentamalla kumpaankin palveliemen bind9-nimipalvelut. Esimerkissä käytettävät IP-osoitteet tulee korvata oikeilla, 1.2.2.1 on master-palvelimen julkinen IP-osoite sekä 1.2.3.4 on slave-palvelimen julkinen IP-osoite:
jpj@x1:~$ sudo apt-get install bind9
Seuraavaksi luomme itse nimipalvelumääritykset lisäämällä /etc/bind/named.conf-tiedostoon (master-koneella):
zone "failsafe.fi" { type master; file "/etc/bind/failsafe.fi.zone"; notify yes; allow-update { 1.2.3.4;}; allow-transfer { 1.2.3.4;}; };
zone "failsafe.fi" { type slave; file "failsafe.fi.zone"; masters { 1.2.1.1; }; };
Tämän jälkeen itse master-palvelimelle luomme zone-määrittelyt failsafe.fi-domainille lisäämällä master-koneelle tiedostoon /etc/bind/failsafe.fi.zone:
; ; SOA ; $TTL 86400 @ IN SOA x1.failsafe.fi. hostmaster.failsafe.fi. ( 2011012001 ; serial 28800 ; refresh (8 hours) 7200 ; retry (2 hours) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) NS x1.failsafe.fi. NS x2.failsafe.fi. A 1.2.2.1 MX 10 x1.failsafe.fi MX 20 x2.failsafe.fi ORIGIN failsafe.fi. x1 1.2.2.1 x2 1.2.3.4 www CNAME www.x.failsafe.fi. x NS x1 x NS x2
Määrittelyissä ei ole mitään erikoisempaa, paitsi että http://www.failsafe.fi on osoitettu CNAME-määritykseksi http://www.x.failsafe.fi:lle ja x.failsafe.fi:lle on määritelty nimipalvelimiksi kummatkin noodimme (x1 ja x2).
Itse x.failsafe.fi pitää myös määritellä nimipalveluihin, joten lisäämme kummankin palvelimen /etc/bind/named.conf-tiedostoon seuraavan määrittelyn:
zone "x.failsafe.fi" { type master; file "/etc/bind/x.failsafe.fi.zone"; };
Sama määrittely tehdään kummallekin noodille, koska haluamme että kumpikin noodi palauttaa vain oman IP-osoitteensa. Näin kun loppukäyttäjä yrittää ottaa yhteyttä http://www.failsafe.fi-osoitteeseen ohjautuu kysely http://www.x.failsafe.fi-nimelle jota loppukäyttäjän kone kysyy nimipalveluista, nimipalvelimia on kaksi ja osoitetta kysytään jommasta kummasta, mikäli ensimmäinen nimipalvelu ei palauta IP:tä, kysytään sitä toiselta. Tällä voidaan varmistaa että loppukäyttäjä saa IP-osoitteen palvelulle, vaikka jompi kumpi yhteys olisikin alhaalla, tai jompi kumpi palvelimista. Nimipalvelimet kuitenkin säilövät IP-osoitetietoja välimuistissaan ja päivittävät niitä vain aika ajoin itse palvelimelta, tässä tapauksessa homman juju perustuukin siihen että määrittelemme tuon säilöntäajan niin lyhyeksi että käytännössä IP-osoite selvitetään joka kerta kun käyttäjä ottaa yhteyden palveluun.
Master koneella /etc/bind/x.failsafe.fi.zone-tiedostoon lisätään:
; ; SOA ; $TTL 86400 @ IN SOA x1.failsafe.fi. hostmaster.failsafe.fi. ( 2011012001 ; serial 28800 ; refresh (8 hours) 7200 ; retry (2 hours) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) NS x1.failsafe.fi. NS x2.failsafe.fi. IN 60 A 1.2.2.1 * IN 60 A 1.2.2.1
ja vastaavasti slave-koneella samaan tiedostoon lisätään:
; ; SOA ; $TTL 86400 @ IN SOA x2.failsafe.fi. hostmaster.failsafe.fi. ( 2011012001 ; serial 28800 ; refresh (8 hours) 7200 ; retry (2 hours) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) NS x1.failsafe.fi. NS x2.failsafe.fi. IN 60 A 1.2.3.4 * IN 60 A 1.2.3.4
Nyt nimipalvelimien osalta palvelu on määritelty. Käynnistä nimipalvelimet uusiksi kummallakin noodilla ja tarkista toiminta kysymymällä host-käskyllä ip:tä http://www.failsafe.fi:lle. Kummankin noodin tulisi palauttaa palvelulle oma ip-osoitteensa.
WWW-palveluiden määrittelyt
Kummallekin noodille asennetaan www-palvelut, esimerkissä käytän lighttpd:tä koska olen todennut sen varsin toimivaksi ja yksinkertaiseksi. Vastaavat määrittelyt voidaan kuitenkin tehdä myös apachella ja monella muullakin palvelulla.
Asennetaan noodeille lighttpd:
jpj@x2:/etc/bind$ sudo apt-get install lighttpd
Jonka jälkeen jommalla kummalla noodilla siirretään /var/www-hakemiston sisältö sekä /etc/lighttpd-hakemiston sisältö yhteiselle levylle ja muutetaan lokaali hakemisto osoittamaan yhteiseen:
jpj@x2:/etc/bind$ sudo mkdir /j0/var jpj@x2:/etc/bind$ sudo mkdir /j0/etc jpj@x2:/etc/bind$ sudo mv /etc/lighttpd /j0/etc jpj@x2:/etc/bind$ sudo mv /var/www /j0/var jpj@x2:/etc/bind$ sudo ln -s /j0/var/www /var/www jpj@x2:/etc/bind$ sudo ln -s /j0/etc/lighttpd /etc/lighttpd
Toisella noodilla poistetaan hakemistot ja tehdään samat määritykset:
jpj@x2:/etc/bind$ sudo rm -rf /etc/lighttpd jpj@x2:/etc/bind$ sudo rm -rf /var/www jpj@x2:/etc/bind$ sudo ln -s /j0/var/www /var/www jpj@x2:/etc/bind$ sudo ln -s /j0/etc/lighttpd /etc/lighttpd
Ja lopuksi itse lighttpd-palvelu käynnistetään kummallakin noodilla uudelleen. Lighttpd-palvelu käynnistyy automaattisesti koneiden käynnistyksessä, mutta DRBD-palvelun tarjoama levy ei välttämättä ole vielä pystyssä joten palvelu käynnistetään uudelleen lisäämällä /etc/rc.local-tiedoston loppuun:
service lighttpd restart
Koska yhteinen www-hakemisto ja konfiguraatiot on jaetulla levyllä, riittää että määrittelyt tehdään vain toisella noodilla ja www-sivut tallennetaan toisen koneen kautta, tai editoidaan toisen koneen kautta.
Loppuhuomiot
Näiden esimerkkien avulla voidaan siis helposti ja nopeasti parantaa erilaisten palveluiden käytettävyyttä, mm. sähköpostipalvelut on helppo toteuttaa tällä sijoittamalla tarpeelliset hakemistot yhteiselle levylle. Useimmilla sähköpostipalveluilla riittää että käyttäjien kotihakemistot on jaetulla levyllä, näin palvelu toimii käytännössä ilman mitään lisämäärittelyitä.