Storage LINSTOR e la sua integrazione con OpenNebula

Storage LINSTOR e la sua integrazione con OpenNebula

Non molto tempo fa, i ragazzi di LINBIT hanno presentato la loro nuova soluzione SDS: Linstor. Si tratta di uno storage completamente libero che utilizza tecnologie consolidate: DRBD, LVM, ZFS. Linstor combina semplicità e un'architettura ben progettata, che consente di raggiungere stabilità e risultati piuttosto significativi.

Oggi vorrei parlarne un po' più in dettaglio e mostrare quanto sia semplice integrarlo con OpenNebula utilizzando linstor_un, un nuovo driver che ho sviluppato appositamente per questo scopo.

Linstor, insieme a OpenNebula, consente di costruire un cloud veloce e affidabile, che può essere facilmente implementato sulla propria infrastruttura.

Architettura di Linstor

Linstor non è né un file system né uno storage a blocchi in sé, Linstor è un orchestratore che fornisce uno strato di astrazione che consente di automatizzare la creazione di volumi in LVM o ZFS e di replicarli utilizzando DRBD9.

Rompendo stereotipi

Ma aspetta, DRBD? — Perché automatizzarlo e come può funzionare?

Ricordiamo il passato, quando era molto in voga DRBD8. Il suo utilizzo standard prevedeva la creazione di un grande dispositivo a blocchi e la suddivisione in molti piccoli pezzi, utilizzando lo stesso LVM. Una sorta di RAID-1 mdadm, ma con replicazione sulla rete.

Questo approccio ha dei difetti, e quindi con l'arrivo di DRBD9 i principi di costruzione dello storage sono cambiati, ora per ogni macchina virtuale viene creato un dispositivo DRBD separato.

L'approccio con dispositivi a blocchi indipendenti consente di utilizzare meglio lo spazio nel cluster e aggiunge anche una serie di ulteriori possibilità. Ad esempio, per ogni dispositivo di questo tipo è possibile definire il numero di repliche, la loro posizione e le impostazioni individuali. Sono facili da creare/eliminare, creare snapshot, modificare le dimensioni, abilitare la crittografia e molto altro. Vale la pena notare che DRBD9 supporta anche il quorum, che consente di evitare situazioni di split-brain.

Risorse e backend

Creando un nuovo dispositivo a blocchi, Linstor posiziona il numero necessario di repliche su nodi diversi nel cluster. Ognuna di queste repliche sarà chiamata risorsa DRBD.

Le risorse sono di due tipi:

  • Risorsa dati — rappresentano un dispositivo DRBD collocato su un nodo in un pool LVM o ZFS.
    Attualmente c'è supporto per diversi backend e il loro numero è in continua crescita. È supportato LVM, ThinLVM e ZFS. Gli ultimi due consentono di creare e utilizzare snapshot.
  • Risorsa senza disco — rappresenta un dispositivo DRBD collocato su un nodo senza backend, ma che permette di essere trattato come un normale dispositivo a blocchi, tutte le operazioni di lettura/scrittura saranno reindirizzate verso le risorse dati. L'analogo più vicino alle risorse senza disco sono gli LUN iSCSI.

Ogni risorsa DRBD può avere fino a 8 repliche, e solo una di esse può essere attiva per impostazione predefinita — Primaria, tutte le altre saranno Secondarie e il loro utilizzo sarà impossibile finché c'è almeno una Primaria, ossia replicheranno semplicemente i dati tra di loro.

Montando un dispositivo DRBD nel sistema, esso diventa automaticamente Primaria, in questo modo anche una risorsa senza disco, nella terminologia DRBD, può essere Primaria.

Allora, a cosa serve Linstor?

Affidando tutte le operazioni intensive al kernel, Linstor è essenzialmente un'applicazione Java che consente di automatizzare senza fatica la creazione di risorse DRBD.
Ogni risorsa creata sarà un cluster DRBD indipendente che opera autonomamente, indipendentemente dallo stato del control-plane e delle altre risorse DRBD.

Linstor è composto da soli due componenti:

  • Linstor-controller — Il controller principale che fornisce un'API per la creazione e gestione delle risorse. Comunica anche con i satelliti, controllando lo spazio libero su di essi, e invia compiti per la creazione e cancellazione di nuove risorse. Viene eseguito in un'unica istanza e utilizza un database, che può essere interno (H2) o esterno (PostgreSQL, MySQL, MariaDB)
  • Linstor-satellite — Installato su tutti i nodi di storage, fornisce al controller informazioni sullo spazio libero e svolge compiti ricevuti dal controller per la creazione e cancellazione di nuovi volumi e dispositivi DRBD sopra di essi.

Linstor opera con i seguenti concetti chiave:

  • Node — server fisico su cui saranno create e utilizzate le risorse DRBD.
  • Storage Pool — pool LVM o ZFS creato su un nodo in cui saranno collocate le risorse DRBD. È anche possibile un pool senza disco — un pool in cui saranno collocate solo risorse senza disco.
  • Definizione della risorsa — Definizione della risorsa, essenzialmente è un prototipo che descrive il nome e tutte le sue proprietà.
  • Definizione del Volume — Definizione del volume. Ogni risorsa può consistere di diversi volumi, e ogni volume deve avere una dimensione.
  • Risorsa — Un'istanza creata di un dispositivo di blocco, ogni risorsa deve essere posizionata su un nodo specifico e in qualche storage pool.

Installazione di Linstor

Raccomando di usare Ubuntu come sistema, poiché per esso esiste un PPA pronto:

add-apt-repository ppa:linbit/linbit-drbd9-stack
apt-get update

Oppure Debian, dove Linstor può essere installato dal repository ufficiale per Proxmox:

wget -O- https://packages.linbit.com/package-signing-pubkey.asc | apt-key add -
PVERS=5 && echo "deb http://packages.linbit.com/proxmox/ proxmox-$PVERS drbd-9.0" > 
    /etc/apt/sources.list.d/linbit.list
apt-get update

Controller

Qui è tutto semplice:

apt-get install linstor-controller linstor-client
systemctl enable linstor-controller
systemctl start linstor-controller

Storage-node

Attualmente nel kernel Linux viene fornito un modulo kernel in-tree DRBD8, purtroppo non ci serve e dobbiamo installare DRBD9:

apt-get install drbd-dkms

Come mostra la pratica, la maggior parte delle difficoltà sorgono proprio dal fatto che nel sistema è caricato il modulo DRBD8, e non DRBD9. Fortunatamente, è facile verificarlo eseguendo:

modprobe drbd
cat /proc/drbd

Se vedi version: 9 — allora tutto è a posto, se version: 8 — allora qualcosa è andato storto e devi prendere ulteriori provvedimenti per chiarire le cause.

Ora installiamo linstor-satellite e drbd-utils:

apt-get install linstor-satellite drbd-utils
systemctl enable linstor-satellite
systemctl start linstor-satellite

Creazione del cluster

Storage pools e nodi

Come backend utilizzeremo ThinLVM, in quanto è il più semplice e supporta gli snapshot.
Installare lvm2, se non lo hai già fatto, e creiamo un ThinLVM pool su tutti i nostri storage-node:

sudo vgcreate drbdpool /dev/sdb
sudo lvcreate -L 800G -T drbdpool/thinpool

Tutte le azioni successive possono essere eseguite direttamente sul controller:

Aggiungiamo i nostri nodi:

linstor node create node1 127.0.0.11
linstor node create node2 127.0.0.12
linstor node create node3 127.0.0.13

Creiamo gli storage pools:

linstor storage-pool create lvmthin node1 data drbdpool/thinpool
linstor storage-pool create lvmthin node2 data drbdpool/thinpool
linstor storage-pool create lvmthin node3 data drbdpool/thinpool

Ora verifichiamo i pools creati:

linstor storage-pool list

Se tutto è stato eseguito correttamente, dovremmo vedere qualcosa del genere:

+-------------------------------------------------------------------------------------------------------+
| StoragePool | Node  | Driver   | PoolName          | FreeCapacity | TotalCapacity | SupportsSnapshots |
|-------------------------------------------------------------------------------------------------------|
| data        | node1 | LVM_THIN | drbdpool/thinpool |       64 GiB |        64 GiB | true              |
| data        | node2 | LVM_THIN | drbdpool/thinpool |       64 GiB |        64 GiB | true              |
| data        | node3 | LVM_THIN | drbdpool/thinpool |       64 GiB |        64 GiB | true              |
+-------------------------------------------------------------------------------------------------------+

Risorse DRBD

Ora proviamo a creare la nostra nuova risorsa DRBD:

linstor resource-definition create myres
linstor volume-definition create myres 1G
linstor resource create myres --auto-place 2

Verifichiamo le risorse create:

linstor resource list 

+------------------------------------------------------------------------------------------------------+
| Node  | Resource | StoragePool | VolumeNr | MinorNr | DeviceName    | Allocated  | InUse  |    State |
|------------------------------------------------------------------------------------------------------|
| node1 | myres    | data        | 0        | 1084    | /dev/drbd1084 | 52 KiB     | Unused | UpToDate |
| node2 | myres    | data        | 0        | 1084    | /dev/drbd1084 | 52 KiB     | Unused | UpToDate |
+------------------------------------------------------------------------------------------------------+

Ottimo! — vediamo che la risorsa è stata creata sui primi due nodi, possiamo anche provare a creare una risorsa senza disco sul terzo:

linstor resource create --diskless node3 myres

Sui nodi troverete sempre questo dispositivo come /dev/drbd1084 o /dev/drbd/by-res/myres/0

Ecco come funziona Linstor, puoi ottenere ulteriori informazioni da documentazione ufficiale.

Ora ti parlerò di come integrarlo con OpenNebula

Configurazione di OpenNebula

Non approfondirò molto il processo di configurazione di OpenNebula, poiché tutti i passaggi sono dettagliatamente descritti in documentazione ufficiale, a cui ti consiglio di fare riferimento, parlerò solo dell'integrazione di OpenNebula con Linstor.

linstor_un

Per risolvere questo problema, ho scritto un driver personalizzato — linstor_un, attualmente è disponibile come plugin e deve essere installato separatamente.

Tutta l'installazione viene effettuata sui nodi frontend di OpenNebula e non richiede ulteriori azioni sui nodi di calcolo.

Innanzitutto dobbiamo assicurarci di avere jq e linstor-client:

apt-get install jq linstor-client

Team linstor node list dovrebbe mostrare l'elenco dei nodi. Tutti i nodi di calcolo di OpenNebula devono essere aggiunti al cluster Linstor.

Scarichiamo e installiamo il plugin:

curl -L https://github.com/OpenNebula/addon-linstor_un/archive/master.tar.gz | tar -xzvf - -C /tmp

mv /tmp/addon-linstor_un-master/vmm/kvm/* /var/lib/one/remotes/vmm/kvm/

mkdir -p /var/lib/one/remotes/etc/datastore/linstor_un
mv /tmp/addon-linstor_un-master/datastore/linstor_un/linstor_un.conf /var/lib/one/remotes/etc/datastore/linstor_un/linstor_un.conf

mv /tmp/addon-linstor_un-master/datastore/linstor_un /var/lib/one/remotes/datastore/linstor_un
mv /tmp/addon-linstor_un-master/tm/linstor_un /var/lib/one/remotes/tm/linstor_un

rm -rf /tmp/addon-linstor_un-master

Ora dobbiamo aggiungerlo alla configurazione di OpenNebula, per fare ciò eseguiamo i semplici passaggi descritti qui.

Dopo di che riavvieremo OpenNebula:

systemctl restart opennebula

E aggiungeremo i nostri datastore, quello di sistema:

cat > system-ds.conf <<EOT
NAME="linstor-system"
TYPE="SYSTEM_DS"
STORAGE_POOL="data"
AUTO_PLACE="2"
CLONE_MODE="snapshot"
CHECKPOINT_AUTO_PLACE="1"
BRIDGE_LIST="node1 node2 node3"
TM_MAD="linstor_un"
EOT

onedatastore create system-ds.conf

E lo storage delle immagini:

cat > images-ds.conf <<EOT
NAME="linstor-images"
TYPE="IMAGE_DS"
STORAGE_POOL="data"
AUTO_PLACE="2"
BRIDGE_LIST="node1 node2 node3"
DISK_TYPE="BLOCK"
DS_MAD="linstor_un"
TM_MAD="linstor_un"
EOT

onedatastore create images-ds.conf

  • Parametro AUTO_PLACE indica il numero di repliche di dati che saranno create per ogni nuova immagine in OpenNebula.
  • Parametro CLONE_MODE indica come saranno clonati le immagini al momento di creare nuove macchine virtuali, snapshot — creerà uno snapshot dell'immagine e da quello si avvierà la macchina virtuale, copy — creerà una copia completa dell'immagine per ogni macchina virtuale.
  • In BRIDGE_LIST si consiglia di elencare tutti i nodi che verranno utilizzati per eseguire le operazioni di clonazione delle immagini.

L'elenco completo dei parametri supportati è riportato in README del progetto.

A questo punto, la configurazione è completata, ora possiamo caricare qualche appliance dal OpenNebula Marketplace e creare macchine virtuali da esso.

Link al progetto:
https://github.com/OpenNebula/addon-linstor_un

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster