Archiviazione cluster per piccoli cluster Web basati su drbd+ocfs2

Di cosa parleremo:
Come distribuire rapidamente lo spazio di archiviazione condiviso per due server basato sulle soluzioni drbd+ocfs2.

Per chi sarà utile:
Il tutorial sarà utile agli amministratori di sistema e a chiunque scelga un metodo di implementazione dello storage o voglia provare la soluzione.

Quali decisioni abbiamo rifiutato e perché?

Spesso ci troviamo di fronte a una situazione in cui dobbiamo implementare uno storage condiviso con buone prestazioni di lettura e scrittura su un piccolo cluster web. Abbiamo provato varie opzioni per implementare l'archiviazione condivisa per i nostri progetti, ma poche sono state in grado di soddisfarci su più indicatori contemporaneamente. Ora ti diremo perché.

  • Glusterfs non ci ha soddisfatto con le prestazioni di lettura e scrittura; ci sono stati problemi con la lettura simultanea di un gran numero di file, e c'era un carico elevato sulla CPU. Il problema con la lettura dei file potrebbe essere risolto accedendovi direttamente da brick, ma questo non è sempre applicabile e generalmente non è corretto.

  • A Ceph non piaceva l'eccessiva complessità, che può essere dannosa su progetti con 2-4 server, soprattutto se il progetto viene successivamente mantenuto. Ancora una volta, ci sono gravi limitazioni prestazionali che ci costringono a creare cluster di archiviazione separati, come con glusterfs.

  • L'utilizzo di un server NFS per implementare lo storage condiviso solleva interrogativi in ​​termini di tolleranza agli errori.

  • s3 è un'eccellente soluzione popolare per una certa gamma di attività, ma non è un file system, il che ne restringe la portata.

  • lsyncd. Se abbiamo già iniziato a parlare di “non-file system”, vale la pena soffermarci su questa popolare soluzione. Non solo non è adatto per lo scambio bidirezionale (ma se lo desideri davvero, puoi farlo), inoltre non funziona stabilmente su un numero elevato di file. Una bella aggiunta al tutto è che è a thread singolo. Il motivo è nell'architettura del programma: utilizza inotify per monitorare gli oggetti di lavoro, che assegna all'avvio e durante la nuova scansione. rsync viene utilizzato come mezzo di trasferimento.

Tutorial: come distribuire lo storage condiviso basato su drbd+ocfs2

Una delle soluzioni più convenienti per noi è stato il collegamento ocfs2+drbd. Ora ti spiegheremo come distribuire rapidamente lo spazio di archiviazione condiviso per due server basato su un database della soluzione. Ma prima, parliamo un po’ dei componenti:

DRBD - un sistema di archiviazione della distribuzione Linux standard che consente di replicare i dati tra server in blocchi. L'applicazione principale è creare storage con tolleranza agli errori.

OCFS2 - un file system che consente l'uso condiviso dello stesso spazio di archiviazione da parte di più sistemi. Incluso nella distribuzione Linux ed è un modulo del kernel e strumenti dello spazio utente per lavorare con FS. OCFS2 può essere utilizzato non solo su DRBD, ma anche su iSCSI con connessioni multiple. Nel nostro esempio utilizziamo DRBD.

Tutte le azioni vengono eseguite sul server Ubuntu 18.04 in una configurazione minima.

Passaggio 1. Configura DRBD:

Nel file /etc/drbd.d/drbd0.res descriviamo il nostro dispositivo a blocchi virtuale /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-disco interno - utilizzare gli stessi dispositivi a blocchi per archiviare i metadati
dispositivo /dev/drbd0 — utilizzare /dev/drbd0 come percorso del volume drbd.
disco /dev/vdb1 - usa /dev/vdb1
sincronizzatore {velocità 1000M; } - utilizza la larghezza di banda del canale gigabit
consentire due primarie - un'opzione importante che consente di accettare le modifiche su due server primari
dopo-sb-0pri, dopo-sb-1pri, dopo-sb-2pri — opzioni responsabili delle azioni del nodo quando viene rilevato splitbrain. Maggiori dettagli possono essere trovati nella documentazione.
diventare primario su entrambi — imposta entrambi i nodi su primari.

Nel nostro caso abbiamo due VM assolutamente identiche, con una rete virtuale dedicata con un throughput di 10 gigabit.

Nel nostro esempio, i nomi di rete di due nodi del cluster sono drbd1 e drbd2. Per un funzionamento corretto, è necessario far corrispondere i nomi e gli indirizzi IP degli host in /etc/hosts.

10.10.10.192 drbd1
10.10.10.193 drbd2

Passaggio 2. Configura i nodi:

Su entrambi i server eseguiamo:

drbdadm create-md drbd0

Archiviazione cluster per piccoli cluster Web basati su drbd+ocfs2

modprobe drbd
drbdadm up drbd0
cat /proc/drbd

Otteniamo quanto segue:

Archiviazione cluster per piccoli cluster Web basati su drbd+ocfs2

Puoi avviare la sincronizzazione. Sul primo nodo è necessario eseguire:

drbdadm primary --force drbd0

Diamo un'occhiata allo stato:

cat /proc/drbd

Archiviazione cluster per piccoli cluster Web basati su drbd+ocfs2

Ottimo, la sincronizzazione è iniziata. Aspettiamo fino alla fine e vediamo l'immagine:

Archiviazione cluster per piccoli cluster Web basati su drbd+ocfs2

Passaggio 3. Avvia la sincronizzazione sul secondo nodo:

drbdadm primary --force drbd0

Otteniamo quanto segue:

Archiviazione cluster per piccoli cluster Web basati su drbd+ocfs2

Ora possiamo scrivere su drbd da due server.

Passaggio 4. Installa e configura ocfs2.

Utilizzeremo una configurazione abbastanza banale:

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

È necessario scriverlo /etc/ocfs2/cluster.conf su entrambi i nodi.

Creiamo un FS su drbd0 su qualsiasi nodo:

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

Qui abbiamo creato un file system con l'etichetta testVol su drbd0, utilizzando i parametri predefiniti.

Archiviazione cluster per piccoli cluster Web basati su drbd+ocfs2

In /etc/default/o2cb devi impostare (come nel nostro file di configurazione)

O2CB_ENABLED=true 
O2CB_BOOTCLUSTER=ocfs2cluster 

ed eseguire su ciascun nodo:

o2cb register-cluster ocfs2cluster

Quindi accendiamo e aggiungiamo tutte le unità di cui abbiamo bisogno per l'esecuzione automatica:

systemctl enable drbd o2cb ocfs2
systemctl start drbd o2cb ocfs2

Alcuni di questi saranno già in esecuzione durante il processo di installazione.

Passaggio 5. Aggiungi punti di montaggio a fstab su entrambi i nodi:

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

Direttorio /media/condiviso deve essere creato in anticipo.

Qui utilizziamo le opzioni noauto, il che significa che il file non verrà montato all'avvio (preferisco montare i file di rete tramite systemd) e heartbeat=local, il che significa utilizzare il servizio heartbeat su ciascun nodo. Esiste anche il battito cardiaco globale, più adatto ai cluster di grandi dimensioni.

Successivamente puoi montare /media/condiviso e controlla la sincronizzazione dei contenuti.

Fatto! Di conseguenza, otteniamo uno storage più o meno tollerante ai guasti con scalabilità e prestazioni decenti.

Fonte: habr.com

Aggiungi un commento