Taustaa
Tämän päivän tietotekniset ympäristöt ovat yhä kriittisempiä ympäristöjä ja niiden käytettävyyden tulee olla korkeaa. Korkean käytettävyyden saavuttaminen ei kuitenkaan ole mitenkään yksiselitteistä eikä helppoa. Usein tämä tarkoittaa investointeja kahdennettuihin yhteyksiin dynaamisella reitityksellä, kahdennettuihin palvelimiin sekä kahdennettuun levyjärjestelmään.
Avoin lähdekoodi on kuitenkin tuonut mahdollisuuksia toteuttaa korkeaa (tai ainakin korkeampaa) käytettävyyttä ilman valtavia investointeja. Esitän tässä nyt yhden esimerkin siitä miten innovatiivisuus ja oikeiden työkalujen käyttö voi tuoda valtavia säästöjä.
Ympäristö
Tässä esimerkissä toteutetaan kahden Linux-palvelimen klusteri ilman kalliita dynaamisia reitityksiä ja keskitettyjä levyjärjestelmiä. Tämä ei ole perusteista lähtevä opas siihen miten ratkaisu pitäisi toteuttaa, eikä tämän tarkoituksena ole esittää ratkaisua joka on liiketoimintakriittinen vaan herättää ajatuksia siitä miten avoimen lähdekoodin ratkaisuilla voidaan oikeasti löytää etuja.
Alkuvaiheessa minulla oli kaksi Ubuntu Server 10.04 -palvelinta, asennettuna ja toimintakunnossa. Kumpikin palvelin on virtualisoitu ja kummankin palvelimen internetyhteys tulee eri operaattorilta. Koska koneet sijaitsevat samassa konesalissa, on niiden välillä myös privaattiverkko, tosin tämä ei ole välttämätön ratkaisun kannalta, mutta nopeuttaa levyjen synkronointia.
Vaihe yksi – Ratkaisu datan kahdennukseen
Jotta ratkaisu voisi toimia oikein, ja tarjota palveluita kummankin koneen kautta, on itse palvelulla näytettävän datan oltava kahdennettu. Perinteisesti tähän käytetään keskitettyjä levyjärjestelmiä ja niiden peilauksia mutta tässä tapauksessa turvaudumme avoimen lähdekoodin tuotteeseen DRBD. Tuote ei ole uusi ja sitä on käytetty jo varsin pitkään erilaisissa ympäristöissä. Lyhyesti kerrottuna DRBD peilaa sille annetun blokkidatan kahden koneen välillä, tässä tapauksessa tulemme peilaamaan yhden levyosion kahden koneen välillä. Tuotetta voisi verrata verkkotasoiseksi RAID1:ksi koska toimintaperiaate on aika pitkälle sama. Perinteisesti tuotetta käytetään aktiivinen/passiivinen-asetelmalla, mutta esimerkissäni rakennetaan ratkaisu jossa tarjottava palvelu on käytettävissä kumman tahansa yhteyden kautta.
DRBD:na sennus on Ubuntun 10.04:n varsin nopea ja triviaali toimenpide. Ennen tuotteen asennusta kummallekin koneelle on lisätty yksi levy joka ei ole vielä missään käytössä, esimerkin tapauksesas virtuaalikoneilel lisättiin 8 gigan kokoinen virtuaalilevy ja sille tehtiin koko levyn kokoinen osio Linux-tyypillä (Levy on kummallakin koneella /dev/sdb1 konfiguroinnin helppouden vuoksi, levy voi olla eri niminen todellisuudessa). Itse tuote asennetaan:
jpj@x1:~$ sudo apt-get install drbd8-utils
Paketti hakee lisäksi muita riippuvuuksia ja hetken kuluttua itse tuote on asennettu. Tämän lisäksi lisäämme /etc/hosts-tiedostoon:
192.168.1.251 x1
192.168.1.250 x2
ja /etc/drbd.d/disk0.res-tiedostoon:
resource disk0 {
protocol C;
net {
cram-hmac-alg sha1;
shared-secret "yhteinensalasana";
allow-two-primaries;
}
startup {
become-primary-on both;
}
on x1 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.1.251:7788;
meta-disk internal;
}
on x2 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.1.250:7788;
meta-disk internal;
}
}
Tällä konfiguroinnilla tehdään perusteet levypeilaukseen, määrittelyyn annetaan kummankin koneen IP-osoite, sekä kummankin koneen peilattava levy.
Seuraavaksi käynnistellään tarvittavat palvelut ja tehdään DRBD:lle käytettävä levy disk0 (Ajetaan kummallakin koneella).
jpj@x1:~$ sudo drbdadm create-md disk0
jpj@x1:~$ sudo service drbd stop
jpj@x1:~$ sudo service drbd start
Kumpikin noodi määritellään meidän haluamassamme esimerkissä primääriksi, ts. kumpikin noodi voi kirjoittaa levylle (kunhan levyllä käytetään siis klusteriin soveltuvaa tiedostojärjestelmää kuten esimerkissämme käytettävää GFS). Tämä tehdään taas kummallakin noodilla.
jpj@x1:~$ sudo drbdsetup /dev/drbd0 primary -o
Nyt voimmekin seurata levyjen synkronointia, joka vie aikaa jonkin verran (Riippuen peilattavasta levystä).
jpj@x1:~$ cat /proc/drbd
version: 8.3.7 (api:88/proto:86-91)
GIT-hash: ea9e28dbff98e331a62bcbcc63a6135808fe2917 build by root@x1, 2011-01-08 17:46:15
0: cs:SyncSource ro:Primary/Primary ds:UpToDate/Inconsistent C r----
ns:1064252 nr:140 dw:6092 dr:1080376 al:0 bm:78 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:3131908
[===>................] sync'ed: 22.5% (3131908/4031556)K
finish: 2:10:29 speed: 336 (320) K/sec
Levyn valmistumista voi seurata, suosituksena on odottaa että synkronointi valmistuu, mutta tässä esimerkissä jatkamme suoraa eteenpäin.
Vaihe kaksi – Klusteriin soveltuva tiedostojärjestelmä
DRBD toimisi mainiosti ilman lisäominaisuuksia siten että toinen noodi on passiivinen, eli kun haluat tiedostojärjestelmän käyttöön toisella koneella (Esimerkiksi kun pääasiallinen kone on hajonnut), ajat kakkosnoodilla vain komennon jolla siitä tehdään aktiivinen ja mounttaat levyn käyttöön. Haluamme kuitenkin toteuttaa ratkaisun joka on aktiivinen kummankin noodin osalta ja tämä aiheuttaa pientä lisähaastetta. Yleisimmät tiedostojärjestelmät (XFS, EXT3, EXT4, JFS) on suunniteltu käytettäväksi vain yhdellä noodilla kerrallaan ja tähän haasteeseene on kehitetty tiedostojärjestelmiä jotka ovat tarkoitettu nimenomaan klusterien käyttöön, kuten esimerkiksi käyttämämme GFS2 ja VMware-ympäristöissä käytetty VMFS.
GFS2 on Red Hatin tekemä, avoimen lähdekoodin tiedostojärjestelmä ja sen käyttö on varsin helppoa myös Ubuntu Server 10.04:ssä. Aluksi asennetaan kumpaankin koneeseen tarvittavat paketit:
jpj@x1:~$ sudo apt-get install gfs-tools cman clvm
Jotta GFS2-tiedostojärjestelmä toimii (Eli että se voidaan mountata käyttöön) tarvitsee meidän määritellä sitä varten klusteri, klusterin asetusten tulee olla yhteneväiset, joten helpointa tehdä taas toisella koneella ja kopioida konfiguraariot suoraan toiselle. Luodaan /etc/cluster/cluster.conf-tiedosto ja muokataan se seuraavan näköiseksi
<?xml version="1.0"?>
<cluster name="cluster1" config_version="3">
<totem consensus="6000" token="3000"/>
<cman two_node="1" expected_votes="1"/>
<clusternodes>
<clusternode name="x1" votes="1" nodeid="1">
<fence>
<method name="single">
<device name="manual" ipaddr="192.168.1.251"/>
</method>
</fence>
</clusternode>
<clusternode name="x2" votes="1" nodeid="2">
<fence>
<method name="single">
<device name="manual" ipaddr="192.168.1.250"/>
</method>
</fence>
</clusternode>
</clusternodes>
<fence_daemon clean_start="1" post_fail_delay="0" post_join_delay="3"/>
<fencedevices>
<fencedevice name="manual" agent="fence_manual"/>
</fencedevices>
</cluster>
Seuraavaksi käynnistämme tarvittavat palvelut uudelleen kummallakin koneella
jpj@x1:~$ sudo service cman stop
jpj@x1:~$ sudo service cman start
jpj@x1:~$ sudo service clvm stop
jpj@x1:~$ sudo service clvm start
Ja lopuksi luodaan itse tiedostojärjestelmä levyille
jpj@x1:~$ sudo gfs2_mkfs -p lock_dlm -t cluster1:gfs -j 2 /dev/drbd0
jpj@x1:~$ sudo gfs2_fsck /dev/drbd0
Lopuksi dataosiot voidaan mountata kumpaankin koneeseen
jpj@x1:~$ sudo mkdir /j0
jpj@x1:~$ sudo mount -t gfs2 /dev/drbd0 /j0
Haluamme luonnollisesti että nämä mountataan myös käynnistyksen yhteydessä, ja tähän luonnollisesti paras olisi fstab, mutta klusterin levyt voidaan mountata vasta kun itse klusteri on pystyssä, ja tämä voi joskus hidastaa turhaan käynnistymistä joten helpoin tapa on tehdä tämä on lisätä /etc/rc.local -tiedostoon (Ennen exit 0-riviä):
sleep 5
mount -t gfs2 /dev/drbd0 /j0
Nyt olemme luoneet tarvittavat asiat ja sinulla pitäisi olla käytettävissä klusteroitu ja peilattu levy kahden koneen välillä. Seuraavassa osassa jatkan artikkelia kertomalla miten voit tarjota tiettyjä palveluita helposti kahden eri operaattorin kautta ilman dynaamisia reitityksiä, käyttäen normaaleja työkaluja sekä viimeistelemme ympäristön siten että sähköposti ja www-palvelut ovat käytettävissä kummankin koneen kautta.