
Recentemente, il team di LINBIT ha presentato la sua nuova soluzione SDS — Linstor. Si tratta di uno storage completamente open source che utilizza tecnologie consolidate: DRBD, LVM, ZFS. Linstor combina semplicità e un'architettura ben progettata, il che consente di raggiungere stabilità e risultati piuttosto impressionanti.
Oggi vorrei parlare di Linstor in modo più dettagliato e mostrare quanto sia semplice integrarlo con OpenNebula utilizzando linstor_un — il nuovo driver che ho sviluppato appositamente per questo scopo.
Linstor, insieme a OpenNebula, consente di costruire un cloud veloce e affidabile, facilmente implementabile sulla propria infrastruttura.
Architettura di Linstor
Linstor non è né un file system né uno storage block da solo; Linstor è un orchestratore che fornisce uno strato di astrazione per automatizzare la creazione di volumi in LVM o ZFS e replicarli utilizzando DRBD9.
Sfidiamo gli stereotipi
Ma aspetta, DRBD? — Perché automatizzarlo e come può funzionare?
Ricordiamo il passato, quando DRBD8 era molto popolare. Il suo utilizzo standard implicava la creazione di un grande dispositivo di blocco e la suddivisione in molte piccole parti utilizzare lo stesso LVM. Una sorta di RAID-1 con mdadm, ma con replica in rete.
Questo approccio non è privo di difetti, e 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 di blocco indipendenti consente di utilizzare meglio lo spazio nel cluster e offre una serie di ulteriori funzionalità. Ad esempio, per ciascun dispositivo di questo tipo è possibile definire il numero di repliche, la loro posizione e impostazioni individuali. Sono facili da creare/eliminare, fare snapshot, modificare la dimensione, attivare la crittografia e molto altro. Vale la pena notare che DRBD9 supporta anche il quorum, che aiuta a evitare le situazioni di split-brain.
Risorse e backend
Creando un nuovo dispositivo di blocco, Linstor colloca 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 — sono dispositivi DRBD ospitati su nodi in un pool LVM o ZFS.
Attualmente sono supportati diversi backend e il loro numero è in costante crescita. Sono supportati LVM, ThinLVM e ZFS. Gli ultimi due consentono di creare e utilizzare snapshot. - Risorsa senza disco — è un dispositivo DRBD ospitato su un nodo senza backend, ma permette di trattarlo come un normale dispositivo a blocchi, tutte le operazioni di lettura/scrittura verranno reindirizzate alle risorse dati. L'analogo più vicino alle risorse senza disco è l'iSCSI LUN.
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, quindi si limiteranno a replicare i dati tra loro.
Montando un dispositivo DRBD nel sistema, esso diventa automaticamente Primaria, pertanto anche una risorsa senza disco, nella terminologia DRBD, può essere Primaria.
Allora, a cosa serve Linstor?
Delegando tutte le attività intensive di risorse al kernel, Linstor è fondamentalmente una normale applicazione Java che consente di automatizzare senza sforzo la creazione di risorse DRBD.
Ogni risorsa creata sarà un cluster DRBD indipendente, che funziona autonomamente, indipendentemente dallo stato del control-plane e delle altre risorse DRBD.
Linstor è composto da soli due componenti:
- Linstor-controller — Il controller principale fornisce un'API per creare e gestire le risorse. Comunica anche con i satelliti, controllando lo spazio disponibile su di essi, e invia compiti per creare ed eliminare nuove risorse. Viene eseguito in un'unica istanza e utilizza un database che può essere sia interno (H2) che esterno (PostgreSQL, MySQL, MariaDB).
- Linstor-satellite — Viene installato su tutti i nodi di archiviazione e fornisce al controller informazioni sullo spazio disponibile e svolge le operazioni ricevute dal controller per creare ed eliminare nuovi volumi e dispositivi DRBD su di essi.
Linstor opera sui seguenti concetti chiave:
- Node — server fisico su cui verranno create e utilizzate le risorse DRBD.
- Storage Pool — pool LVM o ZFS creato sul nodo in cui verranno collocate le risorse DRBD. È possibile anche il pool senza disco — un pool in cui verranno collocati solo risorse senza disco.
- Definizione della risorsa — La definizione della risorsa è, in sostanza, un prototipo che descrive il nome e tutte le sue proprietà.
- Definizione del volume — Definizione del volume. Ogni risorsa può consistere in più volumi, e ogni volume deve avere una dimensione.
- Risorsa — Un'istanza creata di un dispositivo di blocco, ogni risorsa deve essere collocata su un nodo specifico e in un pool di storage.
Installazione di Linstor
Consiglio di utilizzare Ubuntu come sistema, poiché 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-controllerNodi di storage
Attualmente nel kernel Linux viene fornito un modulo kernel in-tree DRBD8, sfortunatamente non ci adatta e dobbiamo installare DRBD9:
apt-get install drbd-dkmsCome dimostra la pratica, la maggior parte delle difficoltà si verificano proprio perché il modulo DRBD8 è caricato nel sistema, e non DRBD9. Fortunatamente, è facile verificarlo eseguendo:
modprobe drbd
cat /proc/drbdSe vedi version: 9 — significa che va tutto bene, se versione: 8 — significa che qualcosa è andato storto e dovete intraprendere ulteriori azioni per scoprire le cause.
Ora installeremo linstor-satellite e drbd-utils:
apt-get install linstor-satellite drbd-utils
systemctl enable linstor-satellite
systemctl start linstor-satelliteCreazione del cluster
Storage pool e nodi
Come backend utilizzeremo ThinLVM, poiché è il più semplice e supporta gli snapshot.
Installa lvm2, se non lo avete già fatto, e creiamo il pool ThinLVM su tutti i nostri nodi di storage:
sudo vgcreate drbdpool /dev/sdb
sudo lvcreate -L 800G -T drbdpool/thinpoolTutte le ulteriori operazioni 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 pool:
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 pool creati:
linstor storage-pool listSe tutto è stato fatto correttamente, dovremmo vedere qualcosa del tipo:
+-------------------------------------------------------------------------------------------------------+ | 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 2Controlliamo 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, potete ottenere ulteriori informazioni da .
Ora parlerò di come integrarlo con OpenNebula
Configurazione di OpenNebula
Non approfondirò troppo il processo di configurazione di OpenNebula, poiché tutti i passaggi sono descritti in dettaglio in , che vi consiglio di consultare; parlerò solo dell'integrazione tra OpenNebula e Linstor.
linstor_un
Per affrontare questa sfida ho scritto un driver personalizzato — , attualmente è disponibile come plugin e deve essere installato separatamente.
L'intera installazione avviene sui nodi frontend di OpenNebula e non richiede ulteriori azioni sui nodi di calcolo.
Per prima cosa, dobbiamo assicurarci di avere jq e linstor-client:
apt-get install jq linstor-clientTeam linstor node list dovrebbe restituire 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-masterAdesso dobbiamo aggiungerlo nella configurazione di OpenNebula, seguendo 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- Caratteristica
AUTO_PLACEindica il numero di repliche dei dati che verranno create per ogni nuova immagine in OpenNebula. - Caratteristica
CLONE_MODEspecifica come le immagini verranno clonate al momento della creazione delle nuove macchine virtuali,snapshot— creerà uno snapshot dell'immagine e avvierà la macchina virtuale dallo snapshot.copy— eseguirà una copia completa dell'immagine per ogni macchina virtuale. - In
BRIDGE_LISTÈ consigliabile specificare tutti i nodi che verranno utilizzati per le operazioni di clonazione delle immagini.
L'elenco completo dei parametri supportati è fornito in progetto.
A questo punto, la configurazione è completa, ora puoi caricare un appliance ufficiale dal e creare macchine virtuali da esso.
Link al progetto:
Fonte: habr.com
