DRBD kalandok – 2. rész

DRBD logó

Az első rész elkészülte után három nappal „végre” lett egy kis akció is. Történetesen volt egy hosszabb áramszünet. Olyannyira hosszabb, hogy a gépeket tápláló szünetmenteseket sikerült lemeríteni. Természetesen mindez munkaidőn kívül történt, így minden reakció az automatikára lett (volna) bízva.

Még mielőtt belecsapnánk a lecsóba, fontos tudnod, hogy nem célom a DRBD a-tól z-ig történő ismertetése, aka. rizsát eddigi (jó?) szokásomhoz híven természetesen kihagyom, továbbra is igyekszek a lényegre törekedni. Aki a szükséges körítésre kíváncsi, az nézze meg a DRBD dokumentációt. Más szóval, ha elolvastad az első részt és átlapoztad már a doksit, akkor fogod igazán értékelni a cikket.

Nos, ami ebből az áramszünetből minket érint, az a DRBD node-ok reakciója. Nos, mindig kell egy első teszt. :) Miután visszatért az áram, „meglepő módon” nem indultak el a gépek. Az egyik elfelejtette, hogy melyik merevlemezről is kellene bootolnia, így megpróbált a legelsőnek detektáltról, sikertelenül persze.
A második elindult, de csak a RAID fele gondolta úgy, hogy neki dolgoznia kellene. Természetesen, pont az a fele, melyik darabolva volt és nem az, melyik tükrözött. Így szintén nem volt sikeres az indítás. Öröm az ürömben, hogy „mindössze” ennyi volt a gond. Az elsődleges csomóponton a RAID-et összerakva, DRBD-t élesítve minden adat sértetlen maradt. Felcsatolás után a virtuális gépet elindítva mindent ment szépen. A második node ugyanígy.

Mivel teszt környezetről beszélünk, ezért történt kísérletezés minden irányba, ami olykor a kifejezetten nem támogatott megoldásokat is magában foglalja.

Primary–Primary

Az alapértelmezett felállás eddig az volt, hogy két csomópont van: egy elsődleges és egy másodlagos. Az elsődlegesen fel lehet csatolni a fájlrendszert, lehet rá írni. A másodlagost viszont nem lehet felcsatolni, még csak olvasásra sem. Így tartja meg a rendszer a konzisztenciát, nagyon helyesen.

A DRBD azonban ismeri a Primary–Primary felállást, amikor mind a két csomópont elsődleges, így mindketten tudnak a fájlrendszerre írni. Ez egyértelműen azt a problémát vonja maga után, hogy a gépeknek tudniuk kell arról, éppen melyik állományhoz fér hozzá a másik. Ugyanis mi történik akkor, ha valaki olvas egy állományt, amíg a másik ír rá? Vagy mindketten írnak bele? Melyik maradna meg? Nos, erre találták ki az olyan speciális fájlrendszereket, mint a GVFS vagy a OCFS2. Itt a gépek értesítik egymást, hogy ki mit csinál, megadott módon zárolják az állományokat és biztosítják, hogy nem lesz ütközés. Egy ilyen összeállítása a DRBD dokumentáció alapján nem vészes.

Azt tudni kell, hogy ilyen esetben, ha mindkét rendszer komolyabb I/O műveletet végez, akkor feleződik az I/O teljesítmény. Ez kisebb állományok esetén nem vészes és egész jól optimalizálható, ugyanakkor ha két operációs rendszert telepítesz ugyanarra a kötetre, az bajos. Tudom, mert megcsináltam. :) Szóval csak csínján a rendszerekkel, érdemes átgondolni.

Mint említettem, a konkurens hozzáférés a hagyományos fájlrendszereknél gond. Eszedbe se jusson, primary–primary módban hagyományos, ext* vagy bármilyen más rendszert használni, mert nem fog menni. Tudom, mert ezt is kipróbáltam. :)

Primary–Secondory && Secondory–Primary

Ha nem szükséges a két csomópontnak egymás adatait elérni, és jól tervezhető a replikálandó adatmennyiség, akkor a klaszter helyett bármelyik, hagyományos fájlrendszer megteszi. „Mindössze” a tervezett adatmennyiségnek megfelelő méretű helyet kell megadnunk a DRBD-nek. Fontos, hogy ha egy kötet(csoport)on van az olvasható és a replikált adat, akkor ugyanúgy feleződik az I/O nagyobb műveleteknél.

Gentoo + Friss kernel + DRBD

Ha most ismerkedsz a DRBD-vel, akkor semmiképp se Gentoo-n kezdd a barátkozást. Jelenleg elég kaotikus a helyzet, ugyanis a Linux 4.0 a DRBD 8.4.5-öt tartalmazza, de a hozzákapcsolódó eszközökből a 8.4.2-es a stabil és 8.4.3-as a tesztelés alatt álló. Bár 8.4.3-as eszközökkel is sikeresen összeállít rendszer és működött is, lehet csak szerencsém volt. Szóval melegen ajánlott verzióazonos eszközöket használni, amire amúgy figyelmeztet is a rendszer.

Ha rám hallgatsz, a kezdeti lépéseket Ubuntu szerverrel teszed meg. Máshol sem bonyolultabb a dolog, de itt apt-get install és minden járulékos teher, mint a kernel modul automatikus betöltése és hasonlók megtörténnek. Automatikusan, ami kényelmes, mert mi tesztelünk és eredményeket akarunk. Most és azonnal! :)

Különböző verziójú DRBD csomópontok

A fenti Gentoo-s élményt „természetesen” összekötöttem azzal, hogy a másik oldalon egy Ubuntu 14.04.2 szerver volt, azaz szinte semmilyen verzióazonosság nem volt a két DRBD között, mégis működött. Ennek ellenére ha jót akarsz magadnak, törekedsz a verzióazonosságra.

Gyakorlatban ez úgy néz ki, hogy…

Ennyi elég is volt az elméletből és a próbálkozásokból, lássuk azt, hogy mi is működik és hogyan.

Struktúra és konfigurálás

A DRBD erőforrásokat definiál. Egy gépen lehet több erőforrás is. Ezeket az erőforrásokat a /etc/drbd.d/erőforrás-neve.res állományban definiáljuk. Működő konfigurációt fogok mutatni, ezért esetünkben a neve legyen database.res. Egy erőforráson belül értelmezünk Primary, azaz elsődleges (aki írhat & felcsatolhat) és Secondory, azaz másodlagos csomópontot. Az erőforrások függetlenek egymástól, tehát lehet az adott gép 20 erőforrásnál elsődleges és 30-nál másodlagos. Nem érdekes. Csak azokat a változásokat emelem ki, melyek az alapértelmezett konfigurációhoz képest változtak (vagy értelme van beszélni róla).

resource datatabase {

Definiáljuk a database erőforrást. Ilyen néven fogunk rá később hivatkozni.

protocol A;

Háromféle protokoll létezik. A, B és C.
Visszafele haladva, a C protokoll a legszigorúbb és egyben a legbiztonságosabb. Ha ezt használod, akkor biztos lehetsz abban, hogy az adat a helyi és a távoli csomóponton is háttértárra íródott. Ez azzal jár, hogy az elsődleges gép addig vár a másodlagosra, amíg az be nem fejezi az írást. Biztonságos, de lassú. Ha primary–primary felállásban gondolkozol, csak ez jöhet szóba.

A B protokoll esetén a DRBD megvárja, amíg az adat elér a másik gépig, de nem várja meg, amíg az ki is írja. Természetesen helyben már ki kellett írni.

Az A protokoll mindössze annyit vár, hogy kiíródjon az adat a helyi háttértárra és az adat másolata készen álljon a küldésre.

data-integrity-alg crc32c;

Gép tesztelésére, hogy bírja-e a (és elég stabil-e) a DRBD megpróbáltatásait. Ha a naplózásban Digest integrity check FAILED jellegű üzeneteket kapsz, akkor valami gáz van, mindenképp vizsgáld ki. Lehet válogatni md5, sha1 és crc32c között alapértelmezetten, de bármelyik, a kernel által támogatott algoritmust lehet integritás ellenőrzésre használni. Kikapcsolható. A crc32c tökéletes nekem, mert jelzi a hibát, ugyanakkor elég gyorsan fut az öreg CPU-kon is.

 cram-hmac-alg md5;
shared-secret "jóhosszústring";

Mikor a felek azonosítják egymást a shared-secret értékét ezzel a HMAC algoritmussal ellenőrzik az értékeket.

A teljes konfigurációs állomány egyben:

resource database {
        startup {
                wfc-timeout  15;
                degr-wfc-timeout 60;
                become-primary-on database-host;
        }
        net {
                protocol A;
 
                cram-hmac-alg md5;
                shared-secret "jóhosszústring";
                data-integrity-alg crc32c;
 
                after-sb-0pri discard-zero-changes;
                after-sb-1pri discard-secondary;
                after-sb-2pri disconnect;
        }
 
        on database-host {
                device /dev/drbd0;
                disk /dev/md0;
                address 10.10.91.21:7788;
                meta-disk internal;
        }
        on Ingvildr {
                device /dev/drbd0;
                disk /dev/md1;
                address 10.10.91.3:7788;
                meta-disk internal;
        }
}

Ennyi lenne, amit pluszban, az alapértelmezett beállításokhoz képest érdemes tudni & meglépni.

Buktatók

A /etc/hosts állományban rögzíteni kell a host neveket. Nincs ezzel gond, de egyszerű benézni a kisbetű-nagybetű különbségeket, ha az ember fáradt. Ugyanez igaz az erőforrás csomópontjainak a megadásakor: kisbetű-nagybetű érzékeny! Igen, én is benéztem. Van ez így. :)

Mindenképp egyezzenek a méretek a két oldalon. Ha a secondary nagyobb, az nem baj, de kisebb ne legyen. Jah, igen: ha virtuális gép(ek)kel dolgozol és nem foglalod le előre a tárhelyet, hanem dinamikusan, szükség szerint allokálod, akkor figyelj oda, hogy a lemezkép ne legyen nagyobb, mint a DRBD helye, különben megint hülyén nézés van. Nekem kb. 1 MB-tal volt nagyobb a lemezkép a kelleténél, ami ugye df -h esetén már kerekítési nagyságrend. Szóval ne centizdbyte-old ki a méreteket, ha nem muszáj. Amúgy megéri előre lefoglalni, mert jót tesz I/O-nak, de az már egy más téma.

Ha azt mondom, hogy a drbdadm nem viszi túlzásba a panaszkodást, ha hiba van, akkor még igen finoman fogalmazok. Szóval kedvenc parancsod a dmesg, mert a rémek onnan jönnek. Izé logok. Amúgy ha már rávetted a drbd-t, hogy fusson, akkor egész sokat naplóz. Figyelmesen olvasd, mert néha nem elég feltűnően szól, hogy „töki, a secondary túl kicsi!”

Jó tesztelést! Kihagytam valamit?

Azt hiszem, mindent elmondtam, amit szerettem volna. Ha úgy érzed, hogy elnagyoltam ezt & azt, akkor írj bátran! Akár kommentben, akár közvetlenül az „Írj” menüpontból.