Stocare cluster pentru mici web-clustere bazate pe drbd+ocfs2

Despre ce vom vorbi:
Cum să implementați rapid un sistem de stocare comun pentru două servere bazate pe soluții drbd+ocfs2.

Pentru cine va fi util:
Acest tutorial va fi util administratorilor de sistem și tuturor celor care aleg o modalitate de implementare a stocării sau doresc să încerce soluția.

Ce soluții am abandonat și de ce

Adesea ne confruntăm cu situația în care trebuie să implementăm un sistem de stocare comun pe un cluster web mic, cu o bună performanță la citire și scriere. Am încercat diverse variante pentru a implementa un sistem de stocare comun pentru proiectele noastre, dar puține au reușit să ne satisfacă din mai multe puncte de vedere. Acum vă vom explica de ce.

  • Glusterfs nu ne-a satisfăcut în ceea ce privește performanța la citire și scriere, am avut probleme cu citirea simultană a unui număr mare de fișiere, iar încărcarea CPU-ului era ridicată. Problema citirii fișierelor ar fi putut fi rezolvată prin accesarea directă în brick-uri, dar aceasta nu este întotdeauna aplicabilă și, în general, nu este corect.

  • Ceph nu ne-a plăcut din cauza complexității excesive, care poate fi dăunătoare în proiecte cu 2-4 servers, în special dacă proiectul este întreținut ulterior. Din nou, există restricții serioase de performanță, ceea ce obligă la construirea de clustere de stocare separate, la fel ca și cu glusterfs.

  • Utilizarea unui singur server NFS pentru implementarea unui sistem de stocare comun ridică întrebări privind reziliența.

  • s3 este o soluție excelentă și populară pentru anumite tipuri de sarcini, dar nu este un sistem de fișiere, ceea ce restrânge domeniul de aplicare.

  • lsyncd. Dacă am început deja să discutăm despre „nestoase dosare”, atunci ar trebui să trecem și prin această soluție populară. Nu doar că nu este potrivită pentru schimbul bidirecțional (dar dacă chiar doriți, se poate), dar funcționează de asemenea instabil cu un număr mare de fișiere. Un detaliu plăcut este că este unică în fir. Motivul este arhitectura programului: folosește inotify pentru a monitoriza obiectele de lucru, pe care le leagă la pornire și cu fiecare rescanare. Ca mijloc de transmitere se folosește rsync.

Tutorial: cum să implementați un sistem de stocare comun bazat pe drbd+ocfs2

Una dintre soluțiile cele mai convenabile pentru noi a fost combinația ocfs2+drbd. Acum vă vom explica cum se poate implementa rapid un sistem de stocare comun pentru două servere pe baza soluțiilor. Dar mai întâi, câteva cuvinte despre componente:

DRBD — un sistem de stocare standard disponibil în Linux, care permite replicarea datelor între servere în blocuri. Principala utilizare este construirea de stocări rezistente la defecțiuni.

OCFS2 — un sistem de fișiere care permite utilizarea comună a aceluiași stocare de către mai multe sisteme. Este inclus în distribuțiile Linux și constă dintr-un modul de nucleu și un set de instrumente utilizator pentru a lucra cu FS. OCFS2 poate fi folosit nu doar deasupra DRBD, ci și deasupra iSCSI cu conectivitate multiplă. În exemplul nostru, folosim DRBD.

Toate acțiunile sunt realizate pe Ubuntu server 18.04 în configurație minimă.

Pasul 1. Configurarea DRBD:

În fișierul /etc/drbd.d/drbd0.res descriem dispozitivul nostru bloc virtual /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 — folosește aceleași dispozitive bloc pentru stocarea metadatelor
device /dev/drbd0 — folosește /dev/drbd0 ca cale către drbd.
disk /dev/vdb1 — folosește /dev/vdb1
syncer { rate 1000M; } — utilizează lățimea de bandă de 1 gigabit
allow-two-primaries — o opțiune importantă care permite modificările pe două servere primare
after-sb-0pri, after-sb-1pri, after-sb-2pri — opțiuni care determină comportamentul nodului la detectarea unui split-brain. Detalii suplimentare pot fi găsite în documentație.
become-primary-on both — stabilește ambele noduri ca primare.

În cazul nostru, avem două VM-uri complet identice, cu o rețea virtuală dedicată cu capacitate de 10 gigabiți.

În exemplul nostru, numele rețelei celor două noduri ale clusterului sunt drbd1 și drbd2. Pentru o funcționare corectă, este necesară maparea numelui și adreselor IP în /etc/hosts.

10.10.10.192 drbd1
10.10.10.193 drbd2

Pasul 2. Configurarea nodurilor:

Pe ambele servere, executăm:

drbdadm create-md drbd0

Stocare cluster pentru mici web-clustere bazate pe drbd+ocfs2

modprobe drbd
drbdadm up drbd0
cat /proc/drbd

Obținem următorul rezultat:

Stocare cluster pentru mici web-clustere bazate pe drbd+ocfs2

Putem începe sincronizarea. Pe primul nod, trebuie să executați:

drbdadm primary --force drbd0

Verificăm statusul:

cat /proc/drbd

Stocare cluster pentru mici web-clustere bazate pe drbd+ocfs2

Minunat, sincronizarea a început. Așteptăm finalizarea acesteia și vedem următoarea situație:

Stocare cluster pentru mici web-clustere bazate pe drbd+ocfs2

Pasul 3. Începem sincronizarea pe al doilea nod:

drbdadm primary --force drbd0

Obținem următorul rezultat:

Stocare cluster pentru mici web-clustere bazate pe drbd+ocfs2

Acum putem scrie în drbd de pe ambele servere.

Pasul 4. Instalarea și configurarea ocfs2.

Vom folosi o configurație destul de banală:

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

Trebuie să îl salvăm în /etc/ocfs2/cluster.conf pe ambele noduri.

Creăm FS pe drbd0 pe oricare nod:

mkfs.ocfs2 -L "testVol" /dev/drbd0

Aici am creat FS cu eticheta testVol pe drbd0, folosind parametrii impliciți.

Stocare cluster pentru mici web-clustere bazate pe drbd+ocfs2

În /etc/default/o2cb trebuie setat (așa cum este în fișierul nostru de configurație)

O2CB_ENABLED=true 
O2CB_BOOTCLUSTER=ocfs2cluster 

și să executăm pe fiecare nod:

o2cb register-cluster ocfs2cluster

După aceea, activăm și adăugăm la pornire toate unitățile necesare:

systemctl enable drbd o2cb ocfs2
systemctl start drbd o2cb ocfs2

O parte din aceasta va fi deja pornită în timpul configurării.

Pasul 5. Adăugăm puncte de montare în fstab pe ambele noduri:

/dev/drbd0 /media/shared ocfs2 defaults,noauto,heartbeat=local 0 0

Directorul /media/shared de asemenea, ar trebui să fie create dinainte.

Aici folosim opțiunile noauto, care înseamnă că FS nu va fi montat la pornire (prefer să montez FS-uri de rețea prin systemd) și heartbeat=local, ceea ce înseamnă utilizarea serviciului heartbeat pe fiecare nod. Există și heartbeat global, care este mai potrivit pentru clustere mari.

Apoi, putem monta /media/shared și verifica sincronizarea conținutului.

Gata! În rezultat, obținem un stocare relativ tolerantă la defecte, cu posibilitate de scalare și performanță decentă.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster