O čem budeme mluvit:
Jak rychle nasadit sdílené úložiště pro dva servery na bázi řešení drbd+ocfs2.
Pro koho to bude užitečné:
Tento tutoriál bude užitečný systémovým administrátorům a všem, kteří vybírají způsob realizace úložiště nebo chtějí vyzkoušet toto řešení.
Od jakých řešení jsme upustili a proč
Často se setkáváme se situací, kdy je třeba realizovat na malém webovém clusteru sdílené úložiště s dobrou výkonností pro čtení i zápis. Zkoušeli jsme různé varianty realizace sdíleného úložiště pro naše projekty, ale málo co bylo schopno uspokojit nás najednou podle několika ukazatelů. Nyní vám povíme proč.
- Glusterfs nám nevyhovoval výkonností pro čtení a zápis, objevovaly se problémy s současným čtením velkého počtu souborů, bylo to s vysokou zátěží CPU. Problém s čtením souborů by se dal vyřešit přímým přístupem k brickům, ale to není vždy možné a celkově je to nepřijatelné.
- Ceph nás neoslovil přehnanou složitostí, která může být škodlivá u projektů se 2-4 servery, servery, zejména pokud projekt pak spravují. Opět jsou zde vážná omezení výkonnosti, která nutí budovat samostatné úložišťové clustery, stejně jako u glusterfs.
- Použití jednoho nfs serveru pro realizaci sdíleného úložiště vyvolává otázky z hlediska odolnosti proti výpadkům.
- s3 — skvělé populární řešení pro určité úkoly, ale není to souborový systém, což omezuje oblast použití.
- lsyncd. Pokud už jsme začali mluvit o „ne-souborových systémech“, stojí za to se podívat i na toto populární řešení. Nejenže není vhodné pro obousměrnou synchronizaci (ale pokud se moc chce, tak to lze), ale také nestabilně funguje na velkém počtu souborů. Příjemným doplněním je, že je jednovláknové. Důvodem je architektura programu: využívá inotify pro monitorování objektů práce, které se zapíná při spuštění a při opětovném skenování. Jako prostředek přenosu se používá rsync.
Tutoriál: jak nasadit sdílené úložiště na bázi drbd+ocfs2
Jedním z nejpohodlnějších řešení pro nás byl spojení ocfs2+drbd. Nyní vám povíme, jak rychle nasadit sdílené úložiště pro dva servery na bázi databázových řešení. Ale nejdříve něco o komponentech:
DRBD — úložný systém z standardní dodávky Linuxu, který umožňuje replikaci dat mezi servery po blocích. Hlavní použití spočívá v budování odolných úložišť.
OCFS2 — souborový systém, který umožňuje sdílené používání stejného úložiště více systémy. Je součástí dodávky Linuxu a představuje jádrový modul a uživatelský nástroj pro práci s FS. OCFS2 lze použít nejen nad DRBD, ale také nad iSCSI s vícero připojeními. V našem příkladu používáme DRBD.
Všechny akce se provádějí na ubuntu serveru 18.04 v minimální konfiguraci.
Krok 1. Nastavujeme DRBD:
V souboru /etc/drbd.d/drbd0.res popisujeme naše virtuální blokové zařízení /dev/drbd0:
resource drbd0 {
syncer { rate 1000M; }
net {
allow-two-primaries;
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
}
startup { become-primary-on both; }
on drbd1 {
meta-disk internal;
device /dev/drbd0;
disk /dev/vdb1;
address 10.10.10.192:7789;
}
on drbd2 {
meta-disk internal;
device /dev/drbd0;
disk /dev/vdb1;
address 10.10.10.193:7789;
}
} meta-disk internal — používat stejné blokové zařízení pro ukládání metadat
device /dev/drbd0 — používat /dev/drbd0 jako cestu k drbd.
disk /dev/vdb1 — používat /dev/vdb1
syncer { rate 1000M; } — používat gigabitovou propustnost kanálu
allow-two-primaries — důležitá volba, která umožňuje přijímat změny na dvou primárních serverech
after-sb-0pri, after-sb-1pri, after-sb-2pri — volby odpovídající za akce uzlu při zjištění splitbrain. Podrobnosti lze nalézt v dokumentaci.
become-primary-on both — nastavuje obě uzly na primární.
V našem případě máme dvě naprosto identické VM s vyhrazenou virtuální sítí s propustností 10 gigabitů.
V našem příkladu jsou síťové názvy dvou uzlů clusteru — drbd1 a drbd2. Pro správnou funkci je nutné přiřadit v /etc/hosts názvy a IP adresy uzlů.
10.10.10.192 drbd1
10.10.10.193 drbd2Krok 2. Nastavujeme uzly:
Na obou serverech provádíme:
drbdadm create-md drbd0 
modprobe drbd
drbdadm up drbd0
cat /proc/drbdDostaneme následující:

Můžeme spustit synchronizaci. Na prvním uzlu je potřeba provést:
drbdadm primary --force drbd0Díváme se na stav:
cat /proc/drbd 
Skvěle, synchronizace začala. Čekáme na dokončení a vidíme obrázek:

Krok 3. Spouštíme synchronizaci na druhém uzlu:
drbdadm primary --force drbd0
Dostaneme následující:

Nyní můžeme zapisovat do drbd ze dvou serverů.
Krok 4. Instalace a nastavení ocfs2.
Použijeme dost triviální konfiguraci:
cluster:
node_count = 2
name = ocfs2cluster
node:
number = 1
cluster = ocfs2cluster
ip_port = 7777
ip_address = 10.10.10.192
name = drbd1
node:
number = 2
cluster = ocfs2cluster
ip_port = 7777
ip_address = 10.10.10.193
name = drbd2
Je potřeba ji zapsat do /etc/ocfs2/cluster.conf na obou nodech.
Vytváříme FS na drbd0 na libovolném nodu:
mkfs.ocfs2 -L "testVol" /dev/drbd0
Tady jsme vytvořili FS s označením testVol na drbd0 s použitím výchozích parametrů.

V /etc/default/o2cb je nutné nastavit (jak v našem konfiguračním souboru)
O2CB_ENABLED=true
O2CB_BOOTCLUSTER=ocfs2cluster a provést na každém nodu:
o2cb register-cluster ocfs2clusterPoté zapneme a přidáme k automatickému spouštění všechny potřebné jednotky:
systemctl enable drbd o2cb ocfs2
systemctl start drbd o2cb ocfs2Část z toho již bude spuštěna během nastavení.
Krok 5. Přidání mount pointů do fstab na obou nodech:
/dev/drbd0 /media/shared ocfs2 defaults,noauto,heartbeat=local 0 0Adresář /media/shared musí být vytvořen předem.
Tady používáme volby noauto, což znamená, že FS nebude připojena při startu (preferuji připojovat síťové FS pomocí systemd) a heartbeat=local, což znamená, že používáme službu heartbeat na každém nodu. Existuje také global heartbeat, který je více vhodný pro velké clustery.
Dále můžeme připojit /media/shared a zkontrolovat synchronizaci obsahu.
Hotovo! V důsledku toho získáváme více-méně odolné úložiště s možností škálování a slušným výkonem.
Zdroj: habr.com
