
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 :
add-apt-repository ppa:linbit/linbit-drbd9-stack
apt-get updateOppure 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 updateController
Qui è tutto semplice:
apt-get install linstor-controller linstor-client
systemctl enable linstor-controller
systemctl start linstor-controllerStorage-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-dkmsCome 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/drbdSe 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-satelliteCreazione 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/thinpoolTutte 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.13Creiamo 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/thinpoolOra verifichiamo i pools creati:
linstor storage-pool listSe 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 2Verifichiamo 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 myresSui nodi troverete sempre questo dispositivo come /dev/drbd1084 o /dev/drbd/by-res/myres/0
Ecco come funziona Linstor, puoi ottenere ulteriori informazioni da .
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 , 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 — , 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-clientTeam 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-masterOra dobbiamo aggiungerlo alla configurazione di OpenNebula, per fare ciò eseguiamo i semplici passaggi descritti .
Dopo di che riavvieremo OpenNebula:
systemctl restart opennebulaE 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.confE 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_PLACEindica il numero di repliche di dati che saranno create per ogni nuova immagine in OpenNebula. - Parametro
CLONE_MODEindica 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_LISTsi 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 del progetto.
A questo punto, la configurazione è completata, ora possiamo caricare qualche appliance dal e creare macchine virtuali da esso.
Link al progetto:
Fonte: habr.com
