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; } }
jpj@x1:~$ sudo drbdadm create-md disk0 jpj@x1:~$ sudo service drbd stop jpj@x1:~$ sudo service drbd start
jpj@x1:~$ sudo drbdsetup /dev/drbd0 primary -o
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
jpj@x1:~$ sudo apt-get install gfs-tools cman clvm
<?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>
jpj@x1:~$ sudo service cman stop jpj@x1:~$ sudo service cman start jpj@x1:~$ sudo service clvm stop jpj@x1:~$ sudo service clvm start
jpj@x1:~$ sudo gfs2_mkfs -p lock_dlm -t cluster1:gfs -j 2 /dev/drbd0 jpj@x1:~$ sudo gfs2_fsck /dev/drbd0
jpj@x1:~$ sudo mkdir /j0 jpj@x1:~$ sudo mount -t gfs2 /dev/drbd0 /j0
sleep 5 mount -t gfs2 /dev/drbd0 /j0
Hei,
En täysin ymmärrä mihin clvm:ää tässä konfiguraatiossa käytetään?
Lisäisin myös drbd.confiin jotain tämän tyylistä:
syncer {
rate 500M;
}
Ilman tuota Debian Squuezessä ja tämän ohjeen mukaan tehtynä olisi 100 G:n levyjen peilaus kestänyt monta päivää, ehkä jopa viikon. En tiedä kuinka Ubuntussa sitten…
Muuten on mahtavasti selvitetty asia. Kiitos!
LikeLike
Tuota CLVM:ää ei itseasiassa tässä konfiguraatiossa tosiaan tarvita, mutta kun tuota artikkelia lähdin rakentamaan niin mielessä oli hiukan toisenlainen kuvio, jossa olisi kahden koneen klusteri lokaalisti ja kolmas DR:nä, jolloin lokaaliklusterissa tuota CLVM:ää olisi tarvittu.
Tuo syncerin rate-arvon kasvatus on hyvä kommentti, olen sen toki lisännyt mutta en artikkeliin kirjoittanut. Ilman tuota tuo initial-sync vie tosiaan aika pitkään.
LikeLike