Vai al contenutoNaviga tra le pagine: pagina precedente [tasto di scelta p]/pagina successiva [tasto di scelta n]
documentation.suse.com / Documentazione di SUSE Enterprise Storage 7.1 / Guida all'amministrazione e alle operazioni / Memorizzazione dei dati in un cluster / Dispositivo di blocco RADOS (RADOS Block Device, RBD)
Si applica a SUSE Enterprise Storage 7.1

20 Dispositivo di blocco RADOS (RADOS Block Device, RBD)

Un blocco è una sequenza di byte, ad esempio un blocco di dati da 4 MB. Le interfacce di memorizzazione basate su blocchi rappresentano il modo più comune per memorizzare i dati con supporti rotanti, come dischi rigidi, CD, dischi floppy. L'ubiquità delle interfacce dei dispositivi di blocco rende un dispositivo di blocco virtuale un candidato ideale per interagire con un sistema di memorizzazione di massa come Ceph.

I dispositivi di blocco Ceph consentono la condivisione di risorse fisiche e sono ridimensionabili. Questi dispositivi memorizzano i dati suddivisi in più OSD in un cluster Ceph. I dispositivi di blocco Ceph sfruttano le funzionalità RADOS come la creazione di snapshot, replica e coerenza. I RADOS Block Device (RBD, dispositivi di blocco RADOS) di Ceph interagiscono con gli OSD utilizzando i moduli del kernel o la libreria librbd.

Protocollo RADOS
Figura 20.1: Protocollo RADOS

I dispositivi di blocco Ceph offrono prestazioni elevate con scalabilità infinita ai moduli del kernel. Supportano soluzioni di virtualizzazione come QEMU o sistemi di calcolo basati su cloud come OpenStack che fanno affidamento su libvirt. È possibile utilizzare lo stesso cluster per attivare Object Gateway, CephFS e RADOS Block Device (dispositivi di blocco RADOS) simultaneamente.

20.1 Comandi dei dispositivi di blocco

Il comando rbd consente di creare, elencare, analizzare e rimuovere immagini dei dispositivi di blocco. È inoltre possibile utilizzarlo per clonare immagini, creare snapshot, eseguire il rollback di un'immagine in uno snapshot o visualizzare uno snapshot.

20.1.1 Creazione di un'immagine del dispositivo di blocco in un pool replicato

Prima che sia possibile aggiungere un dispositivo di blocco a un client, è necessario creare un'immagine correlata in un pool esistente (vedere il Capitolo 18, Gestione dei pool di memorizzazione):

cephuser@adm > rbd create --size MEGABYTES POOL-NAME/IMAGE-NAME

Ad esempio, per creare un'immagine da 1 GB denominata "myimage" le cui informazioni vengono memorizzate in un pool denominato "mypool", eseguire quanto riportato di seguito:

cephuser@adm > rbd create --size 1024 mypool/myimage
Suggerimento
Suggerimento: unità di dimensioni immagine

Se si omette la scorciatoia dell'unità di dimensioni ("G" o "T"), le dimensioni dell'immagine vengono indicate in megabyte. Utilizzare "G" o "T" dopo le dimensioni per specificare gigabyte o terabyte.

20.1.2 Creazione di un'immagine del dispositivo di blocco in un pool con codice di cancellazione

È possibile memorizzare i dati dell'immagine di un dispositivo di blocco direttamente nei pool con codice di cancellazione (EC, Erasure Coded). L'immagine di un dispositivo di blocco RADOS è costituita da due parti, dati e metadati. È possibile memorizzare solo la parte dati dell'immagine di un dispositivo di blocco RADOS (RADOS Block Device, RBD) in un pool EC. Il flag overwrite del pool deve essere impostato su true e ciò è possibile soltanto se tutti gli OSD in cui è memorizzato il pool utilizzano BlueStore.

Non è possibile memorizzare la parte metadati dell'immagine in un pool EC. È necessario specificare il pool replicato per memorizzare i metadati dell'immagine con l'opzione --pool= del comando rbd create oppure aggiungendo pool/ come prefisso del nome dell'immagine.

Creare un pool EC:

cephuser@adm > ceph osd pool create EC_POOL 12 12 erasure
cephuser@adm > ceph osd pool set EC_POOL allow_ec_overwrites true

Specificare il pool replicato per la memorizzazione dei metadati:

cephuser@adm > rbd create IMAGE_NAME --size=1G --data-pool EC_POOL --pool=POOL

Oppure:

cephuser@adm > rbd create POOL/IMAGE_NAME --size=1G --data-pool EC_POOL

20.1.3 Elenco delle immagini dei dispositivi di blocco

Per visualizzare un elenco dei dispositivi di blocco in un pool denominato "mypool", eseguire quanto riportato di seguito:

cephuser@adm > rbd ls mypool

20.1.4 Recupero delle informazioni sull'immagine

Per recuperare le informazioni da un'immagine "myimage" in un pool denominato "mypool", eseguire quanto riportato di seguito:

cephuser@adm > rbd info mypool/myimage

20.1.5 Ridimensionamento di un'immagine del dispositivo di blocco

Le immagini del RADOS Block Device (dispositivo di blocco RADOS) sono sottoposte a thin provisioning, non utilizzano effettivamente alcuno spazio di memorizzazione fisico fino a quando non si inizia a salvare i dati in esse. Dispongono tuttavia di una capacità massima che è possibile impostare con l'opzione --size. Se si desidera aumentare (o diminuire) le dimensioni massime di un'immagine, eseguire quanto riportato di seguito:

cephuser@adm > rbd resize --size 2048 POOL_NAME/IMAGE_NAME # to increase
cephuser@adm > rbd resize --size 2048 POOL_NAME/IMAGE_NAME --allow-shrink # to decrease

20.1.6 Rimozione di un'immagine del dispositivo di blocco

Per rimuovere un dispositivo di blocco che corrisponde a un'immagine "myimage" in un pool denominato "mypool", eseguire quanto riportato di seguito:

cephuser@adm > rbd rm mypool/myimage

20.2 Montaggio e smontaggio

Dopo aver creato un dispositivo di blocco RADOS, è possibile utilizzarlo come qualsiasi altro dispositivo disco: formattarlo, montarlo in modo che sia in grado di scambiare file e smontarlo al termine dell'operazione.

L'impostazione di default del comando rbd è configurata sull'accesso al cluster tramite l'account utente admin di Ceph, che dispone dell'accesso amministrativo completo al cluster. Con questa impostazione vi è il rischio che gli utenti possano causare involontariamente danni, come quando si esegue il login come root a una workstation Linux. Pertanto, è preferibile creare account utente con meno privilegi e utilizzare tali account per il normale accesso in lettura/scrittura al dispositivo di blocco RADOS (RADOS Block Device, RBD).

20.2.1 Creazione di un account utente Ceph

Per creare un nuovo account utente con le funzionalità Ceph Manager, Ceph Monitor e Ceph OSD, utilizzare il comando ceph con il sottocomando auth get-or-create:

cephuser@adm > ceph auth get-or-create client.ID mon 'profile rbd' osd 'profile profile name \
  [pool=pool-name] [, profile ...]' mgr 'profile rbd [pool=pool-name]'

Ad esempio, per creare un utente denominato qemu con accesso in lettura-scrittura al pool vms e accesso in sola lettura al pool images, eseguire quanto riportato di seguito:

ceph auth get-or-create client.qemu mon 'profile rbd' osd 'profile rbd pool=vms, profile rbd-read-only pool=images' \
  mgr 'profile rbd pool=images'

L'output del comando ceph auth get-or-create sarà il portachiavi dell'utente specificato ed è possibile scriverlo in /etc/ceph/ceph.client.ID.keyring.

Nota
Nota

Quando si utilizza il comando rbd, è possibile specificare l'ID utente fornendo l'argomento facoltativo --id ID.

Per ulteriori dettagli sulla gestione degli account utente Ceph, fare riferimento al Capitolo 30, Autenticazione con cephx.

20.2.2 Autenticazione utente

Per specificare un nome utente, utilizzare --id user-name. Se si utilizza l'autenticazione cephx, è necessario specificare anche un segreto. Quest'ultimo potrebbe essere ricavato da un portachiavi o da un file contenente il segreto:

cephuser@adm > rbd device map --pool rbd myimage --id admin --keyring /path/to/keyring

oppure

cephuser@adm > rbd device map --pool rbd myimage --id admin --keyfile /path/to/file

20.2.3 Preparazione di un dispositivo di blocco RADOS (RADOS Block Device, RBD) per l'uso

  1. Accertarsi che nel cluster Ceph sia incluso un pool con l'immagine disco che si desidera mappare. Presupporre che il pool sia denominato mypool e l'immagine myimage.

    cephuser@adm > rbd list mypool
  2. Mappare l'immagine nel nuovo dispositivo di blocco:

    cephuser@adm > rbd device map --pool mypool myimage
  3. Elencare tutti i dispositivi mappati:

    cephuser@adm > rbd device list
    id pool   image   snap device
    0  mypool myimage -    /dev/rbd0

    Il dispositivo che si desidera utilizzare è /dev/rbd0.

    Suggerimento
    Suggerimento: percorso di dispositivo RBD

    Al posto di /dev/rbdDEVICE_NUMBER, è possibile utilizzare /dev/rbd/POOL_NAME/IMAGE_NAME come percorso di dispositivo permanente. Esempio:

           /dev/rbd/mypool/myimage
  4. Creare un file system XFS sul dispositivo /dev/rbd0:

    # mkfs.xfs /dev/rbd0
          log stripe unit (4194304 bytes) is too large (maximum is 256KiB)
          log stripe unit adjusted to 32KiB
          meta-data=/dev/rbd0              isize=256    agcount=9, agsize=261120 blks
          =                       sectsz=512   attr=2, projid32bit=1
          =                       crc=0        finobt=0
          data     =                       bsize=4096   blocks=2097152, imaxpct=25
          =                       sunit=1024   swidth=1024 blks
          naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
          log      =internal log           bsize=4096   blocks=2560, version=2
          =                       sectsz=512   sunit=8 blks, lazy-count=1
          realtime =none                   extsz=4096   blocks=0, rtextents=0
  5. Sostituire /mnt con il proprio punto di montaggio, montare il dispositivo e verificare che sia montato correttamente:

    # mount /dev/rbd0 /mnt
          # mount | grep rbd0
          /dev/rbd0 on /mnt type xfs (rw,relatime,attr2,inode64,sunit=8192,...

    Adesso è possibile spostare i dati nel e dal dispositivo come se questo fosse una directory locale.

    Suggerimento
    Suggerimento: aumento delle dimensioni del dispositivo RBD

    Se le dimensioni del dispositivo RBD non sono più sufficienti, è possibile aumentarle.

    1. Aumentare le dimensioni dell'immagine RBD, ad esempio fino a 10 GB.

      cephuser@adm > rbd resize --size 10000 mypool/myimage
               Resizing image: 100% complete...done.
    2. Accrescere il file system in modo da riempire le nuove dimensioni del dispositivo:

      # xfs_growfs /mnt
      [...]
      data blocks changed from 2097152 to 2560000
  6. Una volta terminato l'accesso al dispositivo, è possibile annullare la mappatura e smontarlo.

    cephuser@adm > rbd device unmap /dev/rbd0
    # unmount /mnt
Suggerimento
Suggerimento: montaggio e smontaggio manuali

Per semplificare i processi di mappatura e montaggio degli RBD dopo l'avvio e di smontaggio dopo l'arresto, vengono forniti uno script rbdmap e un'unità systemd. Vedere Sezione 20.2.4, «rbdmap: mappatura dei dispositivi RBD all'avvio».

20.2.4 rbdmap: mappatura dei dispositivi RBD all'avvio

rbdmap è uno script della shell che consente di automatizzare le operazioni rbd map e rbd device unmap in una o più immagini RBD. Sebbene sia possibile eseguire manualmente lo script in qualsiasi momento, i principali vantaggi sono la mappatura automatica e il montaggio di immagini RBD all'avvio (e lo smontaggio e l'annullamento della mappatura all'arresto), attivati dal sistema Init. A tal fine è incluso un file di unità systemd, rbdmap.service con il pacchetto ceph-common.

Lo script impiega un singolo argomento, che può essere map o unmap. In entrambi i casi lo script analizza sintatticamente un file di configurazione. Il valore di default è /etc/ceph/rbdmap, ma è possibile ignorarlo tramite una variabile di ambiente RBDMAPFILE. Ciascuna riga del file di configurazione corrisponde a un'immagine RBD che deve anche essere mappata o non mappata.

Il file di configurazione presenta il seguente formato:

image_specification rbd_options
image_specification

Percorso di un'immagine in un pool. Specificare come pool_name/image_name.

rbd_options

Elenco di parametri facoltativo da passare al comando rbd device map sottostante. Questi parametri e i rispettivi valori devono essere specificati come stringa separata da virgola, ad esempio:

PARAM1=VAL1,PARAM2=VAL2,...

Nell'esempio con lo script rbdmap viene eseguito il seguente comando:

cephuser@adm > rbd device map POOL_NAME/IMAGE_NAME --PARAM1 VAL1 --PARAM2 VAL2

Nell'esempio seguente è possibile vedere come specificare un nome utente e un portachiavi con un segreto corrispondente:

cephuser@adm > rbdmap device map mypool/myimage id=rbd_user,keyring=/etc/ceph/ceph.client.rbd.keyring

Quando viene eseguito come rbdmap map, lo script analizza sintatticamente il file di configurazione e, per ogni immagine RBD specificata, prima tenta di mappare l'immagine (con il comando rbd device map), quindi ne esegue il montaggio.

Quando eseguito come rbdmap unmap, le immagini elencate nel file di configurazione il montaggio e la mappatura verranno annullati.

rbdmap unmap-all tenta di smontare e successivamente di annullare la mappatura di tutte le immagini RBD attualmente mappate, indipendentemente dalla loro presenza nell'elenco del file di configurazione.

Se ha esito positivo, l'operazione rbd device map mappa l'immagine a un dispositivo /dev/rbdX, quindi viene attivata una regola udev per creare un collegamento simbolico del nome del dispositivo /dev/rbd/pool_name/image_name che punta al dispositivo realmente mappato.

Affinché il montaggio e lo smontaggio abbiano esito positivo, il nome del dispositivo "intuitivo" deve avere una voce corrispondente in /etc/fstab. Quando si scrivono voci /etc/fstab per le immagini RBD, specificare l'opzione di montaggio "noauto" (o "nofail"). In tal modo si impedisce al sistema Init di tentare di montare il dispositivo troppo presto, perfino prima dell'esistenza del dispositivo in questione, poiché di norma rbdmap.service viene attivato piuttosto tardi nella sequenza di avvio.

Per un elenco completo di opzioni rbd, vedere la documentazione relativa a rbd (man 8 rbd).

Per alcuni esempi di utilizzo di rbdmap, vedere la documentazione relativa a rbdmap (man 8 rbdmap).

20.2.5 Aumento delle dimensioni dei dispositivi RBD

Se le dimensioni del dispositivo RBD non sono più sufficienti, è possibile aumentarle.

  1. Aumentare le dimensioni dell'immagine RBD, ad esempio fino a 10 GB.

    cephuser@adm > rbd resize --size 10000 mypool/myimage
     Resizing image: 100% complete...done.
  2. Accrescere il file system in modo da riempire le nuove dimensioni del dispositivo.

    # xfs_growfs /mnt
     [...]
     data blocks changed from 2097152 to 2560000

20.3 Snapshot

Uno snapshot RBD è uno snapshot di un'immagine del RADOS Block Device (dispositivo di blocco RADOS). Gli snapshot consentono di conservare la cronologia dello stato dell'immagine. Ceph supporta anche il layering di snapshot, che consente di clonare rapidamente e facilmente immagini VM. Ceph supporta gli snapshot dei dispositivi di blocco mediante l'uso del comando rbd e molte interfacce di livello superiore, tra cui QEMU, libvirt, OpenStack e CloudStack.

Nota
Nota

Interrompere le operazioni di input e output e svuotare tutte le operazioni di scrittura in sospeso prima di creare una snapshot di un'immagine. Se l'immagine contiene un file system, questo deve presentare uno stato coerente al momento della creazione della snapshot.

20.3.1 Abilitazione e configurazione di cephx

Quando cephx è abilitato, è necessario specificare un nome o un ID utente e un percorso del portachiavi contenente la chiave corrispondente dell'utente. Per ulteriori informazioni, vedere il Capitolo 30, Autenticazione con cephx. È inoltre possibile aggiungere la variabile di ambiente CEPH_ARGS per evitare di immettere di nuovo i seguenti parametri.

cephuser@adm > rbd --id user-ID --keyring=/path/to/secret commands
cephuser@adm > rbd --name username --keyring=/path/to/secret commands

Ad esempio:

cephuser@adm > rbd --id admin --keyring=/etc/ceph/ceph.keyring commands
cephuser@adm > rbd --name client.admin --keyring=/etc/ceph/ceph.keyring commands
Suggerimento
Suggerimento

Aggiungere l'utente e il segreto nella variabile di ambiente CEPH_ARGS in modo che non sia necessario immetterli ogni volta.

20.3.2 Nozioni di base sugli snapshot

Nelle procedure seguenti è dimostrato come creare, elencare e rimuovere snapshot mediante l'uso del comando rbd sulla riga di comando.

20.3.2.1 Creazione di snapshot

Per creare uno snapshot con rbd, specificare l'opzione snap create, il nome pool e il nome immagine.

cephuser@adm > rbd --pool pool-name snap create --snap snap-name image-name
cephuser@adm > rbd snap create pool-name/image-name@snap-name

Esempio:

cephuser@adm > rbd --pool rbd snap create --snap snapshot1 image1
cephuser@adm > rbd snap create rbd/image1@snapshot1

20.3.2.2 Elenco di snapshot

Per elencare gli snapshot di un'immagine, specificare il nome pool e il nome immagine.

cephuser@adm > rbd --pool pool-name snap ls image-name
cephuser@adm > rbd snap ls pool-name/image-name

Esempio:

cephuser@adm > rbd --pool rbd snap ls image1
cephuser@adm > rbd snap ls rbd/image1

20.3.2.3 Rollback di snapshot

Per eseguire il rollback a uno snapshot con rbd, specificare l'opzione snap rollback, il nome pool, il nome immagine e il nome snapshot.

cephuser@adm > rbd --pool pool-name snap rollback --snap snap-name image-name
cephuser@adm > rbd snap rollback pool-name/image-name@snap-name

Esempio:

cephuser@adm > rbd --pool pool1 snap rollback --snap snapshot1 image1
cephuser@adm > rbd snap rollback pool1/image1@snapshot1
Nota
Nota

Eseguire il rollback di un'immagine a uno snapshot significa sovrascrivere la versione attuale dell'immagine con i dati provenienti da uno snapshot. La durata di esecuzione di un rollback aumenta proporzionalmente alle dimensioni dell'immagine. È più rapido eseguire la clonazione da uno snapshot piuttosto che eseguire il rollback di un'immagine a uno snapshot; questo è inoltre il metodo preferito per tornare a uno stato preesistente.

20.3.2.4 Eliminazione di uno snapshot

Per eliminare uno snapshot con rbd, specificare l'opzione snap rm, il nome pool, il nome immagine e il nome utente.

cephuser@adm > rbd --pool pool-name snap rm --snap snap-name image-name
cephuser@adm > rbd snap rm pool-name/image-name@snap-name

Esempio:

cephuser@adm > rbd --pool pool1 snap rm --snap snapshot1 image1
cephuser@adm > rbd snap rm pool1/image1@snapshot1
Nota
Nota

Nei Ceph OSD i dati vengono eliminati in modo asincrono, quindi con l'eliminazione di uno snapshot non si libera immediatamente spazio su disco.

20.3.2.5 Eliminazione definitiva di snapshot

Per eliminare tutti gli snapshot di un'immagine con rbd, specificare l'opzione snap purge e il nome immagine.

cephuser@adm > rbd --pool pool-name snap purge image-name
cephuser@adm > rbd snap purge pool-name/image-name

Esempio:

cephuser@adm > rbd --pool pool1 snap purge image1
cephuser@adm > rbd snap purge pool1/image1

20.3.3 Layering degli snapshot

Ceph supporta la creazione di più cloni copia su scrittura (copy-on-write, COW) di uno snapshot del dispositivo di blocco. Il layering degli snapshot consente ai client dei dispositivi di blocco Ceph di creare immagini molto rapidamente. Ad esempio, si può creare un'immagine del dispositivo di blocco con una Linux VM scritta al suo interno, quindi eseguire lo snapshot dell'immagine, proteggere lo snapshot e creare tutti i cloni copia su scrittura desiderati. Poiché gli snapshot sono di sola lettura, la clonazione di uno di essi semplifica la semantica e consente quindi di creare i cloni rapidamente.

Nota
Nota

I termini "parent" e "child" menzionati negli esempi di riga di comando riportati sotto significano uno snapshot del dispositivo di blocco Ceph (parent) e l'immagine corrispondente clonata dallo snapshot (child).

In ciascuna immagine clonata (child) è memorizzato il rifermento alla rispettiva immagine superiore, che consente all'immagine clonata di aprire e leggere lo snapshot superiore.

Un clone COW di uno snapshot si comporta esattamente come qualsiasi altra immagine del dispositivo di blocco Ceph. Nelle immagini clonate è possibile eseguire operazioni di lettura e scrittura ed è possibile clonarle e ridimensionarle. Con le immagini clonate non esistono restrizioni speciali. Il clone copia su scrittura di uno snapshot si riferisce tuttavia allo snapshot, quindi è necessario proteggere quest'ultimo prima di clonarlo.

Nota
Nota: opzione --image-format 1 non supportata

Non è possibile creare snapshot di immagini create con l'opzione rbd create --image-format 1 obsoleta. Ceph supporta soltanto la clonazione delle immagini format 2 di default.

20.3.3.1 Introduzione al layering

Il layering dei dispositivi di blocco Ceph è un processo semplice. È necessario disporre di un'immagine, creare uno snapshot dell'immagine, proteggere lo snapshot. Dopo aver eseguito questi passaggi, è possibile iniziare la clonazione dello snapshot.

L'immagine clonata fa riferimento allo snapshot superiore e include l'ID pool, l'ID immagine e l'ID snapshot. L'inclusione dell'ID pool significa che è possibile clonare snapshot da un pool nelle immagini in un altro pool.

  • Modello di immagine: un caso comune di layering dei dispositivi di blocco consiste nel creare un'immagine master e uno snapshot che funge da modello per i cloni. Ad esempio, un utente può creare un'immagine per una distribuzione Linux (ad esempio, SUSE Linux Enterprise Server) e creare uno snapshot corrispondente. Periodicamente, l'utente può aggiornare l'immagine e creare un nuovo snapshot (ad esempio, zypper ref && zypper patch seguito da rbd snap create). Ma mano che l'immagine matura, l'utente può clonare qualsiasi snapshot.

  • Modello esteso: un caso più avanzato consiste nell'estensione di un'immagine modello che fornisce ulteriori informazioni rispetto all'immagine di base. Ad esempio, un utente può clonare un'immagine (un modello VM) e installare un software diverso (ad esempio un database, un sistema di gestione di contenuti o un sistema di analisi) ed eseguire quindi lo snapshot dell'immagine estesa, che a sua volta è possibile aggiornare allo stesso modo dell'immagine di base.

  • Pool di modelli: un metodo per utilizzare il layering dei dispositivi di blocco consiste nel creare un pool contenente immagini master che fungono da modelli e snapshot di tali modelli. È quindi possibile estendere i privilegi di sola lettura agli utenti in modo che possano clonare gli snapshot senza doverli scrivere o eseguire nel pool.

  • Migrazione/recupero dell'immagine: un metodo per utilizzare il layering dei dispositivi di blocco consiste nell'eseguire la migrazione o il recupero dei dati da un pool in un altro.

20.3.3.2 Protezione di uno snapshot

I cloni accedono agli snapshot superiori. Tutti i cloni verrebbero interrotti se un utente eliminasse inavvertitamente lo snapshot superiore. Per impedire la perdita di dati, è necessario proteggere lo snapshot prima di poterlo clonare.

cephuser@adm > rbd --pool pool-name snap protect \
 --image image-name --snap snapshot-name
cephuser@adm > rbd snap protect pool-name/image-name@snapshot-name

Esempio:

cephuser@adm > rbd --pool pool1 snap protect --image image1 --snap snapshot1
cephuser@adm > rbd snap protect pool1/image1@snapshot1
Nota
Nota

Non è possibile eliminare uno snapshot protetto.

20.3.3.3 Clonazione di uno snapshot

Per clonare uno snapshot, è necessario specificare il pool superiore, l'immagine e lo snapshot, il pool secondario e il nome immagine. È necessario proteggere lo snapshot prima di poterlo clonare.

cephuser@adm > rbd clone --pool pool-name --image parent-image \
 --snap snap-name --dest-pool pool-name \
 --dest child-image
cephuser@adm > rbd clone pool-name/parent-image@snap-name \
pool-name/child-image-name

Esempio:

cephuser@adm > rbd clone pool1/image1@snapshot1 pool1/image2
Nota
Nota

Si può clonare uno snapshot da un pool in un'immagine in un altro pool. Ad esempio, si possono mantenere immagini e snapshot di sola lettura come modelli in un pool e cloni scrivibili in un altro pool.

20.3.3.4 Annullamento della protezione di uno snapshot

Prima di poter eliminare uno snapshot, è necessario annullarne la protezione. Inoltre, non è possibile eliminare snapshot con riferimenti dai cloni. È necessario appiattire ciascun clone di uno snapshot prima di poter eliminare quest'ultimo.

cephuser@adm > rbd --pool pool-name snap unprotect --image image-name \
 --snap snapshot-name
cephuser@adm > rbd snap unprotect pool-name/image-name@snapshot-name

Esempio:

cephuser@adm > rbd --pool pool1 snap unprotect --image image1 --snap snapshot1
cephuser@adm > rbd snap unprotect pool1/image1@snapshot1

20.3.3.5 Elenco degli elementi secondari di uno snapshot

Per elencare gli elementi secondari di uno snapshot, eseguire quanto riportato di seguito:

cephuser@adm > rbd --pool pool-name children --image image-name --snap snap-name
cephuser@adm > rbd children pool-name/image-name@snapshot-name

Esempio:

cephuser@adm > rbd --pool pool1 children --image image1 --snap snapshot1
cephuser@adm > rbd children pool1/image1@snapshot1

20.3.3.6 Appiattimento di un'immagine clonata

Le immagini clonate mantengono un riferimento allo snapshot superiore. Quando si rimuove il riferimento dal clone secondario nello parent superiore, di fatto si "appiattisce" l'immagine copiando le informazioni dallo snapshot al clone. La durata di appiattimento di un clone aumenta proporzionalmente alle dimensioni dello snapshot. Per eliminare uno snapshot, prima è necessario appiattire le immagini secondarie.

cephuser@adm > rbd --pool pool-name flatten --image image-name
cephuser@adm > rbd flatten pool-name/image-name

Esempio:

cephuser@adm > rbd --pool pool1 flatten --image image1
cephuser@adm > rbd flatten pool1/image1
Nota
Nota

Poiché un'immagine appiattita contiene tutte le informazioni provenienti dallo snapshot, questa occuperà uno spazio di memorizzazione maggiore rispetto a un clone su più strati.

20.4 Copie speculari delle immagini RBD

È possibile eseguire la copia speculare delle immagini RBD in modo asincrono tra due cluster Ceph. Questa funzionalità è disponibile in due modalità:

Basata sul journal

Questa modalità utilizza la funzione di journaling dell'immagine RBD per assicurare la replica temporizzata e con coerenza per arresto anomalo tra cluster. Prima di modificare l'immagine effettiva, ogni operazione di scrittura sull'immagine RBD viene innanzitutto registrata sul journal associato. Il cluster remote leggerà dal journal e riprodurrà gli aggiornamenti nella relativa copia locale dell'immagine. Dal momento che ogni operazione di scrittura sull'immagine RBD risulta in due operazioni di scrittura sul cluster Ceph, prevedere un raddoppiamento delle latenze di scrittura quando si utilizza la funzione di journaling dell'immagine RBD.

Basata su snapshot

Questa modalità utilizza snapshot di copia speculare dell'immagine RBD pianificati periodicamente o creati manualmente per eseguire la replica delle immagini RBD con coerenza per arresto anomalo tra cluster. Il cluster remote determinerà la presenza di eventuali aggiornamenti dei dati o dei metadati tra due snapshot di copia speculare e copierà i valori differenziali nella relativa copia locale dell'immagine. Con la funzione fast-diff dell'immagine RBD, è possibile calcolare rapidamente i blocchi di dati aggiornati senza dover effettuare la scansione dell'intera immagine RBD. Dal momento che questa modalità non garantisce coerenza temporizzata, sarà necessario sincronizzare il valore differenziale completo dello snapshot prima dell'uso in uno scenario di failover. Gli eventuali valori differenziali dello snapshot applicati parzialmente verranno sottoposti a rollback sull'ultimo snapshot di cui è stata completata la sincronizzazione.

La copia speculare è configurata per ogni singolo pool nei cluster peer e può essere configurata su un sottoinsieme specifico di immagini all'interno del pool o in modo che venga eseguita automaticamente la copia speculare di tutte le immagini di un pool quando è in uso soltanto la copia speculare basata sul journal. Per la configurazione della copia speculare si utilizza il comando rbd. Il daemon rbd-mirror è responsabile del pull degli aggiornamenti delle immagini dal cluster peer remote e della loro applicazione all'immagine nel cluster local.

A seconda delle necessità di replica, è possibile configurare la copia speculare RBD sulla replica a una o a due vie:

Replica a una via

Quando la copia speculare dei dati avviene soltanto da un cluster primario a uno secondario, il daemon rbd-mirror viene eseguito solo sul cluster secondario.

Replica a due vie

Quando la copia speculare dei dati avviene dalle immagini primarie su un cluster alle immagini non primarie su un altro cluster (e viceversa), il daemon rbd-mirror viene eseguito su entrambi i cluster.

Importante
Importante

Ogni istanza del daemon rbd-mirror deve essere in grado di connettersi contemporaneamente a entrambi i cluster local e remote Ceph. Ad esempio, a tutti i monitor e agli host OSD. Inoltre, la larghezza di banda della rete tra i due data center deve essere sufficiente per gestire il workload della copia speculare.

20.4.1 Configurazione del pool

Nelle procedure seguenti è illustrato come eseguire task amministrativi di base per configurare la copia speculare tramite il comando rbd. La copia speculare è configurata per ogni singolo pool nei cluster Ceph.

È necessario eseguire i passaggi della configurazione del pool su entrambi i cluster peer. Per maggior chiarezza, in queste procedure si presuppone che due cluster, denominati local e remote, siano accessibili da un singolo host.

Vedere la documentazione relativa a rbd (man 8 rbd) per ulteriori dettagli su come connettersi a cluster Ceph diversi.

Suggerimento
Suggerimento: cluster multipli

Il nome del cluster negli esempi seguenti corrisponde a un file di configurazione Ceph omonimo /etc/ceph/remote.conf e al file del portachiavi Ceph omonimo /etc/ceph/remote.client.admin.keyring.

20.4.1.1 Abilitazione della copia speculare su un pool

Per abilitare la copia speculare su un pool, specificare il sottocomando mirror pool enable, il nome pool e la modalità di esecuzione di copia speculare. La modalità di esecuzione di copia speculare può essere "pool" oppure "image":

pool

Tutte le immagini nel pool in cui è abilitata la funzione di journaling vengono sottoposte a copia speculare.

immagine

La copia speculare deve essere abilitata esplicitamente su ciascuna immagine. Consultare Sezione 20.4.2.1, «Abilitazione della copia speculare dell'immagine» per maggiori informazioni.

Esempio:

cephuser@adm > rbd --cluster local mirror pool enable POOL_NAME pool
cephuser@adm > rbd --cluster remote mirror pool enable POOL_NAME pool

20.4.1.2 Disabilitazione della copia speculare

Per disabilitare la copia speculare su un pool, specificare il sottocomando mirror pool disable e il nome pool. Quando si disabilita la copia speculare su un pool in questo modo, questa verrà disabilitata anche su qualsiasi immagine (nel pool) per la quale è stata abilitata esplicitamente la copia speculare.

cephuser@adm > rbd --cluster local mirror pool disable POOL_NAME
cephuser@adm > rbd --cluster remote mirror pool disable POOL_NAME

20.4.1.3 Esecuzione del bootstrap dei peer

Affinché il daemon rbd-mirror rilevi il rispettivo cluster peer, è necessario registrare il peer nel pool e creare un account utente. Questo processo può essere automatizzato con rbd e i comandi mirror pool peer bootstrap create e mirror pool peer bootstrap import.

Per creare manualmente un nuovo token di bootstrap con rbd, specificare il comando mirror pool peer bootstrap create, il nome del pool e un nome descrittivo facoltativo del sito per la descrizione del cluster local:

cephuser@local > rbd mirror pool peer bootstrap create \
 [--site-name LOCAL_SITE_NAME] POOL_NAME

L'output di mirror pool peer bootstrap create sarà un token che dovrà essere fornito al comando mirror pool peer bootstrap import. Ad esempio, sul cluster local:

cephuser@local > rbd --cluster local mirror pool peer bootstrap create --site-name local image-pool
eyJmc2lkIjoiOWY1MjgyZGItYjg5OS00NTk2LTgwOTgtMzIwYzFmYzM5NmYzIiwiY2xpZW50X2lkIjoicmJkLW1pcnJvci1wZWVyIiwia2V5I \
joiQVFBUnczOWQwdkhvQmhBQVlMM1I4RmR5dHNJQU50bkFTZ0lOTVE9PSIsIm1vbl9ob3N0IjoiW3YyOjE5Mi4xNjguMS4zOjY4MjAsdjE6MTkyLjE2OC4xLjM6NjgyMV0ifQ==

Per importare manualmente il token di bootstrap creato da un altro cluster con il comando rbd, utilizzare la sintassi seguente:

rbd mirror pool peer bootstrap import \
 [--site-name LOCAL_SITE_NAME] \
 [--direction DIRECTION \
 POOL_NAME TOKEN_PATH

Dove:

LOCAL_SITE_NAME

Nome descrittivo facoltativo del sito per la descrizione del cluster local.

DIRECTION

Direzione della copia speculare. L'impostazione di default è rx-tx per la copia speculare bidirezionale, ma è possibile configurare questa impostazione anche su rx-only per la copia speculare unidirezionale.

POOL_NAME

Nome del pool.

TOKEN_PATH

Percorso del file al token creato (o - per leggerlo dall'input standard).

Ad esempio, sul cluster remote:

cephuser@remote > cat <<EOF > token
eyJmc2lkIjoiOWY1MjgyZGItYjg5OS00NTk2LTgwOTgtMzIwYzFmYzM5NmYzIiwiY2xpZW50X2lkIjoicmJkLW1pcnJvci1wZWVyIiwia2V5IjoiQVFBUnczOWQwdkhvQmhBQVlMM1I4RmR5dHNJQU50bkFTZ0lOTVE9PSIsIm1vbl9ob3N0IjoiW3YyOjE5Mi4xNjguMS4zOjY4MjAsdjE6MTkyLjE2OC4xLjM6NjgyMV0ifQ==
EOF
cephuser@adm > rbd --cluster remote mirror pool peer bootstrap import \
 --site-name remote image-pool token

20.4.1.4 Aggiunta manuale di un peer del cluster

Come alternativa all'esecuzione del bootstrap dei peer descritta nella Sezione 20.4.1.3, «Esecuzione del bootstrap dei peer», è possibile specificare i peer manualmente. Per eseguire la copia speculare, il daemon rbd-mirror remoto necessita dell'accesso al cluster locale. Creare un nuovo utente Ceph locale che verrà utilizzato dal daemon rbd-mirror remoto, ad esempio rbd-mirror-peer:

cephuser@adm > ceph auth get-or-create client.rbd-mirror-peer \
 mon 'profile rbd' osd 'profile rbd'

Utilizzare la sintassi seguente per aggiungere un cluster Ceph peer in copia speculare con il comando rbd:

rbd mirror pool peer add POOL_NAME CLIENT_NAME@CLUSTER_NAME

Esempio:

cephuser@adm > rbd --cluster site-a mirror pool peer add image-pool client.rbd-mirror-peer@site-b
cephuser@adm > rbd --cluster site-b mirror pool peer add image-pool client.rbd-mirror-peer@site-a

Per default, il daemon rbd-mirror deve disporre dell'accesso al file di configurazione Ceph ubicato in /etc/ceph/.CLUSTER_NAME.conf, in cui sono specificati gli indirizzi IP dei MON del cluster peer e il portachiavi relativo a un client denominato CLIENT_NAME e ubicato nel percorso di ricerca del portachiavi di default o predefinito, ad esempio /etc/ceph/CLUSTER_NAME.CLIENT_NAME.keyring.

In alternativa, è possibile memorizzare in modo sicuro la chiave client e/o il MON del cluster peer nell'archivio config-key Ceph. Per specificare gli attributi di connessione del cluster peer durante l'aggiunta di un peer in copia speculare, utilizzare le opzioni --remote-mon-host e --remote-key-file. Esempio:

cephuser@adm > rbd --cluster site-a mirror pool peer add image-pool \
 client.rbd-mirror-peer@site-b --remote-mon-host 192.168.1.1,192.168.1.2 \
 --remote-key-file /PATH/TO/KEY_FILE
cephuser@adm > rbd --cluster site-a mirror pool info image-pool --all
Mode: pool
Peers:
  UUID        NAME   CLIENT                 MON_HOST                KEY
  587b08db... site-b client.rbd-mirror-peer 192.168.1.1,192.168.1.2 AQAeuZdb...

20.4.1.5 Rimozione di un peer del cluster

Per rimuovere un cluster peer in copia speculare, specificare il sottocomando mirror pool peer remove, il nome pool e l'UUID peer (reso disponibile dal comando rbd mirror pool info):

cephuser@adm > rbd --cluster local mirror pool peer remove POOL_NAME \
 55672766-c02b-4729-8567-f13a66893445
cephuser@adm > rbd --cluster remote mirror pool peer remove POOL_NAME \
 60c0e299-b38f-4234-91f6-eed0a367be08

20.4.1.6 Pool di dati

Durante la creazione di immagini nel cluster di destinazione, rbd-mirror seleziona un pool di dati come segue:

  • Se presente, verrà utilizzato il pool di dati di default configurato (con l'opzione di configurazione rbd_default_data_pool) del cluster di destinazione.

  • In caso contrario, se l'immagine di origine utilizza un pool di dati separato e sul cluster di destinazione esiste già un pool con lo stesso nome, verrà utilizzato tale pool.

  • Se nessuna delle due condizioni descritte sopra è applicabile, non verrà impostato alcun pool di dati.

20.4.2 Configurazione dell'immagine RBD

Diversamente dalla configurazione del pool, la configurazione dell'immagine deve essere eseguita solo a fronte di un singolo cluster Ceph peer in copia speculare.

Le immagini RBD sottoposte a copia speculare sono designate come primarie o non primarie. Questa è una proprietà dell'immagine e non del pool. Non è possibile modificare le immagini designate come non primarie.

Le immagini vengono promosse automaticamente a primarie quando la copia speculare viene prima abilitata su un'immagine (implicitamente, se la modalità di copia speculare del pool è "pool" e la funzione di journaling dell'immagine è abilitata, oppure esplicitamente (vedere Sezione 20.4.2.1, «Abilitazione della copia speculare dell'immagine») mediante il comando rbd).

20.4.2.1 Abilitazione della copia speculare dell'immagine

Se la copia speculare è configurata in modalità image, è necessario abilitarla esplicitamente per ciascuna immagine nel pool. Per abilitare la copia speculare per un'immagine specifica con rbd, specificare il sottocomando mirror image enable insieme al nome del pool e dell'immagine:

cephuser@adm > rbd --cluster local mirror image enable \
 POOL_NAME/IMAGE_NAME

È possibile eseguire la copia speculare dell'immagine in modalità journal o snapshot:

journal (default)

Se configurata nella modalità journal, la copia speculare utilizzerà la funzione di journaling dell'immagine RBD per replicarne il contenuto. Tale funzione verrà abilitata automaticamente se non è stata ancora abilitata sull'immagine.

istantanea

Se configurata nella modalità snapshot, la copia speculare utilizzerà gli snapshot di copia speculare dell'immagine RBD per replicarne il contenuto. Dopo l'abilitazione, verrà automaticamente creato un primo snapshot di copia speculare dell'immagine RBD e sarà possibile crearne altri con il comando rbd.

Esempio:

cephuser@adm > rbd --cluster local mirror image enable image-pool/image-1 snapshot
cephuser@adm > rbd --cluster local mirror image enable image-pool/image-2 journal

20.4.2.2 Abilitazione della funzione di journaling dell'immagine

Nella copia speculare RBD viene utilizzata la funzione di journaling RBD per assicurare che l'immagine replicata mantenga sempre con coerenza per arresto anomalo. Se si utilizza la modalità di copia speculare image, la funzione di journaling sarà abilitata automaticamente se sull'immagine è abilitata la copia speculare. Se si utilizza la modalità di copia speculare pool, prima che sia possibile sottoporre a copia speculare un'immagine su un cluster peer, occorre abilitare la funzione di journaling dell'immagine RBD. È possibile abilitare tale funzione al momento della creazione dell'immagine specificando l'opzione --image-feature exclusive-lock,journaling nel comando rbd.

In alternativa, è possibile abilitare dinamicamente la funzione di journaling sulle immagini RBD preesistenti. Per abilitare il journaling, specificare il sottocomando feature enable, il nome del pool e dell'immagine e il nome della funzione:

cephuser@adm > rbd --cluster local feature enable POOL_NAME/IMAGE_NAME exclusive-lock
cephuser@adm > rbd --cluster local feature enable POOL_NAME/IMAGE_NAME journaling
Nota
Nota: dipendenza dell'opzione

La funzione journaling dipende dalla funzione exclusive-lock. Se la funzione exclusive-lock non è già stata abilitata, è necessario farlo prima di abilitare la funzione journaling.

Suggerimento
Suggerimento

È possibile abilitare per default il journaling su tutte le nuove immagini aggiungendo rbd default features = layering,exclusive-lock,object-map,deep-flatten,journaling al file di configurazione Ceph.

20.4.2.3 Creazione di snapshot di copia speculare dell'immagine

Se si utilizza la copia speculare basata su snapshot, sarà necessario creare snapshot di copia speculare ogni volta che si desidera eseguire la copia speculare dei contenuti modificati dell'immagine RBD. Per creare manualmente uno snapshot di copia speculare con rbd, specificare il comando mirror image snapshot insieme al nome del pool e dell'immagine:

cephuser@adm > rbd mirror image snapshot POOL_NAME/IMAGE_NAME

Esempio:

cephuser@adm > rbd --cluster local mirror image snapshot image-pool/image-1

Per default, vengono creati solo tre snapshot di copia speculare per immagine. Se questo limite viene raggiunto, lo snapshot di copia speculare più recente viene eliminato automaticamente. Se necessario, è possibile ignorare questo limite con l'opzione di configurazione rbd_mirroring_max_mirroring_snapshots. Inoltre, gli snapshot di copia speculare vengono eliminati automaticamente quando l'immagine viene rimossa o quando la copia speculare viene disabilitata.

È inoltre possibile definire una pianificazione per la creazione automatica e periodica degli snapshot di copia speculare. Questi ultimi possono essere pianificati a livello globale, di singolo pool o di singola immagine. È possibile definire più pianificazioni di snapshot di copia speculare su qualsiasi livello, ma verranno eseguite soltanto le pianificazioni più specifiche corrispondenti a una singola immagine in copia speculare.

Per creare una pianificazione di snapshot di copia speculare con rbd, specificare il comando mirror snapshot schedule add insieme a un nome facoltativo del pool o dell'immagine, a un intervallo e a un'ora di inizio facoltativa.

L'intervallo può essere espresso in giorni, ore o minuti utilizzando rispettivamente i suffissi d, h o m. L'ora di inizio facoltativa può essere specificata utilizzando il formato di ora ISO 8601. Esempio:

cephuser@adm > rbd --cluster local mirror snapshot schedule add --pool image-pool 24h 14:00:00-05:00
cephuser@adm > rbd --cluster local mirror snapshot schedule add --pool image-pool --image image1 6h

Per rimuovere una pianificazione di snapshot di copia speculare con rbd, specificare il comando mirror snapshot schedule remove con le opzioni corrispondenti al comando per l'aggiunta della pianificazione equivalente.

Per elencare tutte le pianificazioni di snapshot per un livello specifico (globale, pool o immagine) con rbd, immettere il comando mirror snapshot schedule ls insieme a un nome facoltativo del pool o dell'immagine. Inoltre, tramite l'opzione --recursive, è possibile elencare tutte le pianificazioni del livello specificato e dei livelli sottostanti. Esempio:

cephuser@adm > rbd --cluster local mirror schedule ls --pool image-pool --recursive
POOL        NAMESPACE IMAGE  SCHEDULE
image-pool  -         -      every 1d starting at 14:00:00-05:00
image-pool            image1 every 6h

Per verificare con rbd quando saranno creati i successivi snapshot per le immagini RBD con copia speculare basata su snapshot, specificare il comando mirror snapshot schedule status insieme a un nome facoltativo del pool o dell'immagine. Esempio:

cephuser@adm > rbd --cluster local mirror schedule status
SCHEDULE TIME       IMAGE
2020-02-26 18:00:00 image-pool/image1

20.4.2.4 Disabilitazione della copia speculare dell'immagine

Per disabilitare la copia speculare per un'immagine specifica, specificare il sottocomando mirror image disable insieme al nome del pool e dell'immagine:

cephuser@adm > rbd --cluster local mirror image disable POOL_NAME/IMAGE_NAME

20.4.2.5 Promozione e abbassamento di livello delle immagini

In uno scenario di failover in cui è necessario spostare la designazione primaria all'immagine nel cluster peer, è necessario interrompere l'accesso all'immagine primaria, abbassare di livello l'attuale immagine primaria, promuovere quella nuova e riprendere l'accesso all'immagine sul cluster alternativo.

Nota
Nota: promozione forzata

È possibile forzare la promozione utilizzando l'opzione --force. La promozione forzata è necessaria quando è impossibile propagare l'abbassamento di livello al cluster peer (ad esempio, in caso di errore del cluster o di interruzione della comunicazione). Ne risulterà uno scenario split brain tra i due peer e l'immagine non viene più sincronizzata fino all'emissione di un sottocomando resync.

Per abbassare di livello un'immagine specifica a non primaria, specificare il sottocomando mirror image demote insieme al nome del pool e dell'immagine:

cephuser@adm > rbd --cluster local mirror image demote POOL_NAME/IMAGE_NAME

Per abbassare di livello tutte le immagini primarie in un pool a non primarie, specificare il sottocomando mirror pool demote insieme al nome del pool:

cephuser@adm > rbd --cluster local mirror pool demote POOL_NAME

Per promuovere un'immagine specifica a primaria, specificare il sottocomando mirror image promote insieme al nome del pool e dell'immagine:

cephuser@adm > rbd --cluster remote mirror image promote POOL_NAME/IMAGE_NAME

Per promuovere tutte le immagini primarie in un pool a primarie, specificare il sottocomando mirror pool promote insieme al nome del pool:

cephuser@adm > rbd --cluster local mirror pool promote POOL_NAME
Suggerimento
Suggerimento: suddivisione del carico I/O

Poiché lo stato di primaria o non primaria si riferisce a un'immagine singola, è possibile fare in modo che il carico I/O e il failover o il failback della fase vengano suddivisi tra due cluster.

20.4.2.6 Risincronizzazione forzata dell'immagine

Se viene rilevato un evento split brain dal daemon rbd-mirror, non verrà effettuato alcun tentativo di copia speculare dell'immagine interessata finché non viene corretto. Per riprendere la copia speculare di un'immagine, prima abbassare di livello l'immagine definita obsoleta, quindi richiedere una risincronizzazione all'immagine primaria. Per richiedere una risincronizzazione dell'immagine, specificare il sottocomando mirror image resync insieme al nome del pool e dell'immagine:

cephuser@adm > rbd mirror image resync POOL_NAME/IMAGE_NAME

20.4.3 Verifica dello stato della copia speculare

Lo stato di replica del cluster peer viene memorizzato per ciascuna immagine primaria in copia speculare. È possibile recuperare tale stato mediante i sottocomandi mirror image status e mirror pool status:

Per richiedere lo stato dell'immagine speculare, specificare il sottocomando mirror image status insieme al nome del pool e dell'immagine:

cephuser@adm > rbd mirror image status POOL_NAME/IMAGE_NAME

Per richiedere lo stato di riepilogo del pool speculare, specificare il sottocomando mirror pool status insieme al nome del pool:

cephuser@adm > rbd mirror pool status POOL_NAME
Suggerimento
Suggerimento:

Con l'aggiunta dell'opzione --verbose al sottocomando mirror pool status verranno generati ulteriori dettagli sullo stato di ciascuna immagine in copia speculare nel pool.

20.5 Impostazioni della cache

L'implementazione dello spazio utente del dispositivo di blocco Ceph (librbd) non può servirsi della cache delle pagine Linux. Pertanto, dispone di memorizzazione nella cache integrata. Il comportamento della memorizzazione nella cache RBD è simile a quello della memorizzazione nella cache del disco rigido. Quando il sistema operativo invia una richiesta di sbarramento o di svuotamento, tutti i dati modificati vengono scritti sugli OSD. Ciò significa che la memorizzazione nella cache Write-back garantisce gli stessi livelli di sicurezza di un disco rigido fisico integro con una macchina virtuale che invia correttamente gli svuotamenti. La cache utilizza un algoritmo Least Recently Used (LRU) e, in modalità Write-back, è in grado di unire le richieste adiacenti per migliorare la velocità effettiva.

Ceph supporta la memorizzazione nella cache Write-back per RBD. Per abilitarla, eseguire

cephuser@adm > ceph config set client rbd_cache true

Per default, librbd non esegue alcuna memorizzazione nella cache. Le operazioni di scrittura e lettura vanno direttamente al cluster di memorizzazione e le operazioni di scrittura vengono restituite solo quando i dati si trovano sul disco in tutte le repliche. Se la memorizzazione nella cache è abilitata, le operazioni di scrittura vengono subito restituite, a meno che il numero di byte non svuotati non sia superiore a quello impostato nell'opzione rbd cache max dirty. In questo caso, l'operazione di scrittura attiva il writeback e si blocca finché non viene svuotato un numero sufficiente di byte.

Ceph supporta la memorizzazione nella cache Write-through per RBD. È possibile impostare le dimensioni della cache e le destinazioni e i limiti per passare dalla memorizzazione nella cache Write-back a quella Write-through. Per abilitare la modalità Write-through, eseguire

cephuser@adm > ceph config set client rbd_cache_max_dirty 0

Ciò vuol dire che le operazioni di scrittura vengono restituite solo quando i dati si trovano sul disco in tutte le repliche, ma che le operazioni di lettura possono provenire dalla cache. La cache si trova nella memoria del client e ogni immagine RBD dispone della propria cache. Dal momento che la cache si trova in locale sul client, se altri accedono all'immagine, non vi è alcuna coerenza. Se la memorizzazione nella cache è abilitata, non sarà possibile eseguire OCFS o GFS su RBD.

I parametri seguenti influiscono sul comportamento dei dispositivi di blocco RADOS (RADOS Block Device, RBD). Per impostarli, utilizzare la categoria client:

cephuser@adm > ceph config set client PARAMETER VALUE
rbd cache

Per abilitare la memorizzazione nella cache per il dispositivo di blocco RADOS (RBD). L'impostazione di default è "true".

rbd cache size

Dimensioni in byte della cache RBD. Il valore di default è 32 MB.

rbd cache max dirty

Limite di dati modificati espresso in byte in corrispondenza del quale la cache attiva il Write-back. Il valore di rbd cache max dirty deve essere inferiore a rbd cache size. Se è impostato a 0, utilizza la memorizzazione nella cache Write-through. Il valore di default è 24 MB.

rbd cache target dirty

Destinazione modificata prima che la cache inizi le operazioni di scrittura dei dati nel relativo storage. Non blocca le operazioni di scrittura nella cache. Il valore di default è 16 MB.

rbd cache max dirty age

Numero di secondi in cui i dati modificati si trovano nella cache prima dell'avvio del writeback. Il valore di default è 1.

rbd cache writethrough until flush

Si avvia in modalità Write-through e passa alla modalità Write-back in seguito alla ricezione della prima richiesta di svuotamento. Si tratta di un'impostazione prudente ma sicura se le macchine virtuali in esecuzione su rbd sono troppo obsolete per inviare richieste di svuotamento (ad esempio, nel caso del driver virtio in Linux prima del kernel 2.6.32). L'impostazione di default è "true".

20.6 Impostazioni QoS

In genere, la Qualità di servizio (QoS, Quality of Service) fa riferimento ai metodi per la definizione della priorità del traffico e per la prenotazione delle risorse. È particolarmente importante per il trasporto del traffico con requisiti speciali.

Importante
Importante: non supportate da iSCSI

Le impostazioni QoS seguenti sono utilizzate solo dall'implementazione dello spazio utente RBD librbd e non sono utilizzate dall'implementazione kRBD. Poiché iSCSI utilizza kRBD, non usa le impostazioni QoS. Tuttavia, per iSCSI è possibile configurare la QoS sul livello del dispositivo di blocco del kernel tramite le facility del kernel standard.

rbd qos iops limit

Limite desiderato delle operazioni I/O al secondo. Il valore di default è 0 (nessun limite).

rbd qos bps limit

Limite desiderato dei byte I/O al secondo. Il valore di default è 0 (nessun limite).

rbd qos read iops limit

Il limite desiderato di operazioni di lettura al secondo. Il valore di default è 0 (nessun limite).

rbd qos write iops limit

Il limite desiderato di operazioni di scrittura al secondo. Il valore di default è 0 (nessun limite).

rbd qos read bps limit

Il limite desiderato di byte letti al secondo. Il valore di default è 0 (nessun limite).

rbd qos write bps limit

Il limite desiderato di byte scritti al secondo. Il valore di default è 0 (nessun limite).

rbd qos iops burst

Limite di burst desiderato delle operazioni I/O. Il valore di default è 0 (nessun limite).

rbd qos bps burst

Limite di burst desiderato dei byte I/O. Il valore di default è 0 (nessun limite).

rbd qos read iops burst

Il limite di burst desiderato delle operazioni di lettura. Il valore di default è 0 (nessun limite).

rbd qos write iops burst

Il limite di burst desiderato delle operazioni di scrittura. Il valore di default è 0 (nessun limite).

rbd qos read bps burst

Il limite di burst desiderato dei byte letti. Il valore di default è 0 (nessun limite).

rbd qos write bps burst

Il limite di burst desiderato dei byte scritti. Il valore di default è 0 (nessun limite).

rbd qos schedule tick min

Tick di pianificazione minimo (in millisecondi) per QoS. Il valore di default è 50.

20.7 Impostazioni di lettura in avanti

Il dispositivo di blocco RADOS supporta la lettura in avanti/prelettura per l'ottimizzazione delle operazioni di lettura piccole e sequenziali. Nel caso di una macchina virtuale, queste operazioni di lettura sono in genere gestite dal sistema operativo guest, anche se i boot loader potrebbero non generare letture efficaci. Se la memorizzazione nella cache è disabilitata, la lettura in avanti viene disabilitata automaticamente.

Importante
Importante: non supportate da iSCSI

Le impostazioni di lettura in avanti seguenti sono utilizzate solo dall'implementazione dello spazio utente RBD librbd e non sono utilizzate dall'implementazione kRBD. Poiché iSCSI utilizza kRBD, non usa le impostazioni di lettura in avanti. Tuttavia, per iSCSI è possibile configurare la lettura in avanti sullo strato del dispositivo di blocco del kernel tramite le facility del kernel standard.

rbd readahead trigger requests

Numero di richieste di lettura sequenziali necessarie per attivare la lettura in avanti. Il valore di default è 10.

rbd readahead max bytes

Dimensioni massime della richiesta di lettura in avanti. Se è impostata su 0, la lettura in avanti è disabilitata. Il valore di default è 512 kB.

rbd readahead disable after bytes

In seguito alla lettura di questo numero di byte da un'immagine RBD, la lettura in avanti è disabilitata per tale immagine fino alla chiusura. In questo modo, il sistema operativo guest può subentrare alla lettura in avanti al momento dell'avvio. Se è impostata su 0, la lettura in avanti rimane abilitata. Il valore di default è 50 MB.

20.8 Funzioni avanzate

Il dispositivo di blocco RADOS supporta le funzioni avanzate che consentono di migliorare la funzionalità delle immagini RBD. È possibile specificare le funzioni sulla riga di comando durante la creazione di un'immagine RBD oppure nel file di configurazione Ceph tramite l'opzione rbd_default_features.

È possibile specificare i valori dell'opzione rbd_default_features in due modi:

  • Come somma dei valori interni delle funzioni. Ogni funzione dispone di un proprio valore interno; ad esempio il valore di "layering" è 1 e quello di "fast-diff" è 16. Di conseguenza, per attivare queste due funzioni per default, includere quanto segue:

    rbd_default_features = 17
  • Come elenco di funzioni separate da virgole. L'esempio precedente avrà l'aspetto seguente:

    rbd_default_features = layering,fast-diff
Nota
Nota: funzioni non supportate da iSCSI

Le immagini RBD con le funzioni seguenti non saranno supportate da iSCSI: deep-flatten, object-map, journaling, fast-diff, striping

Di seguito è riportato un elenco delle funzioni RBD avanzate:

layering

Il layering consente di utilizzare la funzione di clonazione.

Il valore interno è 1; quello di default è "yes".

striping

Lo striping consente di distribuire i dati tra più oggetti e agevola il parallelismo dei workload sequenziali di lettura/scrittura. Consente di evitare la formazione di colli di bottiglia sui singoli nodi per dispositivi di blocco RADOS di grandi dimensioni oppure occupati.

Il valore interno è 2; quello di default è "yes".

exclusive-lock

Quando abilitata, necessita di un client per ottenere un blocco su un oggetto prima di eseguire un'operazione di scrittura. Abilitare il blocco esclusivo solo quando un client singolo sta effettuando l'accesso a un'immagine nello stesso momento. Il valore interno è 4. L'impostazione di default è "yes".

object-map

Il supporto della mappa oggetti dipende dal supporto del blocco esclusivo. I dispositivi di blocco sono soggetti a thin provisioning e di conseguenza memorizzano soltanto i dati effettivamente esistenti. Il supporto della mappa oggetti consente di monitorare gli oggetti effettivamente esistenti (con dati memorizzati su un'unità). L'abilitazione del supporto della mappa oggetti consente di velocizzare le operazioni I/O per la clonazione, l'importazione e l'esportazione di un'immagine compilata in modo sparse e per l'eliminazione.

Il valore interno è 8; quello di default è "yes".

fast-diff

Il supporto di fast-diff dipende dal supporto della mappa oggetti e del blocco esclusivo. Aggiunge un'altra proprietà alla mappa oggetti che la rende notevolmente più rapida nella creazione delle differenze tra le snapshot di un'immagine e l'utilizzo effettivo dei dati di una snapshot.

Il valore interno è 16; quello di default è "yes".

deep-flatten

La funzione deep-flatten attiva l'opzione rbd flatten (vedere la Sezione 20.3.3.6, «Appiattimento di un'immagine clonata») su tutte le snapshot di un'immagine oltre che sull'immagine stessa. Senza di essa, le snapshot di un'immagine continueranno a dipendere da quella superiore e di conseguenza non sarà possibile eliminare tale immagine superiore finché non vengono eliminate anche le snapshot. Con l'impostazione deep-flatten, l'elemento superiore è reso indipendente dai cloni, anche se dispongono di snapshot.

Il valore interno è 32; quello di default è "yes".

journaling

Il supporto del journaling dipende dal supporto del blocco esclusivo. La funzione di journaling consente di registrare tutte le modifiche apportate a un'immagine nell'ordine in cui si verificano. La copia speculare RBD (vedere la Sezione 20.4, «Copie speculari delle immagini RBD») utilizza il journal per replicare un'immagine coerente con l'arresto anomalo in un cluster remoto.

Il valore interno è 64; quello di default è "yes".

20.9 Mappatura di RBD tramite i client kernel meno recenti

I client meno recenti (ad esempio SLE11 SP4) potrebbero non essere in grado di mappare le immagini RBD poiché un cluster distribuito con SUSE Enterprise Storage 7.1 forza alcune funzioni (sia le funzioni a livello di immagine RBD che quelle a livello RADOS) non supportate dai client meno recenti. In questo caso, sui log OSD vengono visualizzati dei messaggi simili al seguente:

2019-05-17 16:11:33.739133 7fcb83a2e700  0 -- 192.168.122.221:0/1006830 >> \
192.168.122.152:6789/0 pipe(0x65d4e0 sd=3 :57323 s=1 pgs=0 cs=0 l=1 c=0x65d770).connect \
protocol feature mismatch, my 2fffffffffff < peer 4010ff8ffacffff missing 401000000000000
Avvertimento
Avvertimento: la modifica dei tipi di compartimento della mappa CRUSH causa un significativo ribilanciamento

Se si intende passare dal tipo di compartimento della mappa CRUSH "straw" a quello "straw2" e viceversa, procedere secondo una pianificazione. È prevedibile che questa operazione causi un impatto significativo sul carico del cluster, poiché la modifica del tipo di compartimento causerà un significativo ribilanciamento.

  1. Disabilitare le funzioni dell'immagine RBD non supportate. Esempio:

    cephuser@adm > rbd feature disable pool1/image1 object-map
    cephuser@adm > rbd feature disable pool1/image1 exclusive-lock
  2. Modificare il tipo di compartimento della mappa CRUSH da "straw2" a "straw":

    1. Salvare la mappa CRUSH:

      cephuser@adm > ceph osd getcrushmap -o crushmap.original
    2. Decompilare la mappa CRUSH:

      cephuser@adm > crushtool -d crushmap.original -o crushmap.txt
    3. Modificare la mappa CRUSH e sostituire "straw2" con "straw".

    4. Ricompilare la mappa CRUSH:

      cephuser@adm > crushtool -c crushmap.txt -o crushmap.new
    5. Impostare la nuova mappa CRUSH:

      cephuser@adm > ceph osd setcrushmap -i crushmap.new

20.10 Abilitazione dei dispositivi di blocco e di Kubernetes

È possibile utilizzare i dispositivi di blocco RADOS Ceph con Kubernetes v1.13 e versioni successive tramite il driver ceph-csi, che esegue il provisioning dinamico delle immagini RBD sui volumi Kubernetes sottostanti e la mappatura di tali immagini sotto forma di dispositivi di blocco (facoltativamente montando un file system contenuto all'interno dell'immagine) ai nodi di lavoro su cui sono in esecuzione i pod che fanno riferimento a un volume con supporto RBD.

Per utilizzare i dispositivi di blocco Ceph con Kubernetes, è necessario installare e configurare ceph-csi all'interno dell'ambiente Kubernetes.

Importante
Importante

ceph-csi utilizza per default i moduli del kernel RBD, che potrebbero non supportare tutti gli elementi ottimizzabili CRUSH di Ceph o le funzioni dell'immagine RBD.

  1. Per default, i dispositivi di blocco Ceph utilizzano il pool RBD. Creare un pool per la memorizzazione del volume Kubernetes. Assicurarsi che il cluster Ceph sia in esecuzione e creare il pool:

    cephuser@adm > ceph osd pool create kubernetes
  2. Utilizzare lo strumento RBD per inizializzare il pool:

    cephuser@adm > rbd pool init kubernetes
  3. Creare un nuovo utente per Kubernetes e ceph-csi. Eseguire quanto riportato di seguito e registrare la chiave generata:

    cephuser@adm > ceph auth get-or-create client.kubernetes mon 'profile rbd' osd 'profile rbd pool=kubernetes' mgr 'profile rbd pool=kubernetes'
    [client.kubernetes]
        key = AQD9o0Fd6hQRChAAt7fMaSZXduT3NWEqylNpmg==
  4. Per definire gli indirizzi del Ceph Monitor per il cluster Ceph, ceph-csi necessita di un oggetto ConfigMap memorizzato in Kubernetes. Raccogliere l'FSID e gli indirizzi del monitor univoci del cluster Ceph:

    cephuser@adm > ceph mon dump
    <...>
    fsid b9127830-b0cc-4e34-aa47-9d1a2e9949a8
    <...>
    0: [v2:192.168.1.1:3300/0,v1:192.168.1.1:6789/0] mon.a
    1: [v2:192.168.1.2:3300/0,v1:192.168.1.2:6789/0] mon.b
    2: [v2:192.168.1.3:3300/0,v1:192.168.1.3:6789/0] mon.c
  5. Generare un file csi-config-map.yaml simile all'esempio riportato di seguito, sostituendo l'FSID per clusterID e gli indirizzi dei monitor per monitors:

    kubectl@adm > cat <<EOF > csi-config-map.yaml
    ---
    apiVersion: v1
    kind: ConfigMap
    data:
      config.json: |-
        [
          {
            "clusterID": "b9127830-b0cc-4e34-aa47-9d1a2e9949a8",
            "monitors": [
              "192.168.1.1:6789",
              "192.168.1.2:6789",
              "192.168.1.3:6789"
            ]
          }
        ]
    metadata:
      name: ceph-csi-config
    EOF
  6. Quindi, memorizzare il nuovo oggetto ConfigMap in Kubernetes:

    kubectl@adm > kubectl apply -f csi-config-map.yaml
  7. Per la comunicazione con il cluster Ceph tramite ceph-csi, sono necessarie le credenziali cephx. Generare un file csi-rbd-secret.yaml simile a quello nell'esempio riportato di seguito utilizzando l'ID utente Kubernetes e la chiave cephx appena creati:

    kubectl@adm > cat <<EOF > csi-rbd-secret.yaml
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: csi-rbd-secret
      namespace: default
    stringData:
      userID: kubernetes
      userKey: AQD9o0Fd6hQRChAAt7fMaSZXduT3NWEqylNpmg==
    EOF
  8. Quindi, memorizzare il nuovo oggetto segreto in Kubernetes:

    kubectl@adm > kubectl apply -f csi-rbd-secret.yaml
  9. Creare il ServiceAccount e gli oggetti Kubernetes RBAC ClusterRole/ClusterRoleBinding richiesti. Questi oggetti non devono essere necessariamente personalizzati per il proprio ambiente Kubernetes e pertanto è possibile utilizzarli direttamente dai file YAML di distribuzione di ceph-csi.

    kubectl@adm > kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-provisioner-rbac.yaml
    kubectl@adm > kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-nodeplugin-rbac.yaml
  10. Creare lo strumento di provisioning e i plug-in del nodo ceph-csi:

    kubectl@adm > wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml
    kubectl@adm > kubectl apply -f csi-rbdplugin-provisioner.yaml
    kubectl@adm > wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin.yaml
    kubectl@adm > kubectl apply -f csi-rbdplugin.yaml
    Importante
    Importante

    Per default, i file YAML dello strumento di provisioning e del plug-in del nodo eseguiranno il pull della release di sviluppo del container ceph-csi. È necessario aggiornare i file YAML per utilizzare la versione della release.

20.10.1 Uso dei dispositivi di blocco Ceph in Kubernetes

La StorageClass Kubernetes definisce una classe di storage. È possibile creare più oggetti StorageClass per eseguire la mappatura a diversi livelli di qualità del servizio e funzioni. Si pensi ad esempio ai pool NVMe rispetto a quelli basati su HDD.

Per creare una StorageClass ceph-csi che mappi al pool Kubernetes creato sopra, è possibile utilizzare il file YAML seguente, dopo aver verificato che la proprietà clusterID corrisponda all'FSID del cluster Ceph:

kubectl@adm > cat <<EOF > csi-rbd-sc.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
   clusterID: b9127830-b0cc-4e34-aa47-9d1a2e9949a8
   pool: kubernetes
   csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
   csi.storage.k8s.io/provisioner-secret-namespace: default
   csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
   csi.storage.k8s.io/node-stage-secret-namespace: default
reclaimPolicy: Delete
mountOptions:
   - discard
EOF
kubectl@adm > kubectl apply -f csi-rbd-sc.yaml

Una PersistentVolumeClaim è una richiesta di risorse di memorizzazione astratte effettuata da un utente. La richiesta PersistentVolumeClaim viene quindi associata a una risorsa pod per il provisioning di un PersistentVolume, supportato da un'immagine del dispositivo di blocco Ceph. È possibile includere un valore volumeMode facoltativo per scegliere tra un file system montato (default) o un volume non elaborato basato sul dispositivo di blocco.

Con ceph-csi, specificando Filesystem per volumeMode, verranno supportate sia le richieste ReadWriteOnce che quelle ReadOnlyMany accessMode, mentre specificando Block per volumeMode, verranno supportate le richieste ReadWriteOnce, ReadWriteMany e ReadOnlyMany accessMode.

Ad esempio, per creare una richiesta PersistentVolumeClaim basata su blocchi in cui venga utilizzata la ceph-csi-based StorageClass creata sopra, è possibile usare il file YAML seguente per richiedere la memorizzazione del blocco non elaborato di csi-rbd-sc StorageClass:

kubectl@adm > cat <<EOF > raw-block-pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: raw-block-pvc
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Block
  resources:
    requests:
      storage: 1Gi
  storageClassName: csi-rbd-sc
EOF
kubectl@adm > kubectl apply -f raw-block-pvc.yaml

Di seguito è riportato un esempio di associazione della richiesta PersistentVolumeClaim descritta sopra a una risorsa pod sotto forma di dispositivo di blocco non elaborato:

kubectl@adm > cat <<EOF > raw-block-pod.yaml
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-raw-block-volume
spec:
  containers:
    - name: fc-container
      image: fedora:26
      command: ["/bin/sh", "-c"]
      args: ["tail -f /dev/null"]
      volumeDevices:
        - name: data
          devicePath: /dev/xvda
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: raw-block-pvc
EOF
kubectl@adm > kubectl apply -f raw-block-pod.yaml

Per creare una richiesta PersistentVolumeClaim basata su file system in cui venga utilizzata la ceph-csi-based StorageClass creata sopra, è possibile utilizzare il file YAML seguente per richiedere un file system montato (supportato da un'immagine RBD) di csi-rbd-sc StorageClass:

kubectl@adm > cat <<EOF > pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rbd-pvc
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 1Gi
  storageClassName: csi-rbd-sc
EOF
kubectl@adm > kubectl apply -f pvc.yaml

Di seguito è riportato un esempio di associazione della richiesta PersistentVolumeClaim descritta sopra a una risorsa pod sotto forma di file system montato:

kubectl@adm > cat <<EOF > pod.yaml
---
apiVersion: v1
kind: Pod
metadata:
  name: csi-rbd-demo-pod
spec:
  containers:
    - name: web-server
      image: nginx
      volumeMounts:
        - name: mypvc
          mountPath: /var/lib/www/html
  volumes:
    - name: mypvc
      persistentVolumeClaim:
        claimName: rbd-pvc
        readOnly: false
EOF
kubectl@adm > kubectl apply -f pod.yaml