Almacenamiento de bloques RBD con Ceph

Descripción de RBD

RBD (Rados Block Device) es una solución de almacenamiento ampliamente utilizada en clústeres de Ceph. La interacción con los OSD se realiza mediante el módulo del kernel de Linux o la biblioteca librbd. El módulo del kernel se emplea típicamente para hosts físicos, mientras que librbd es preferido para máquinas virtuales. Con el módulo del kernel, se puede utilizar la caché de páginas integrada en Linux para optimizar el rendimiento; en cambio, librbd emplea una caché específica para RBD.

Características y flujo de trabajo de RBD

  • Compatibilidad con instantáneas completas e incrementales.
  • Provisionamiento delgado, asignando espacio bajo demanda.
  • Tecnología de copia en escritura (copy-on-write).
  • Redimensionamiento dinámico, permitiendo expandir el tamaño del bloque en línea.
  • Caché en memoria y mecanismos de caché multinivel para mejorar el rendimiento.

Flujo de trabajo detallado

  1. Se crea un pool de almacenamiento (por ejemplo, pool de réplicas) y dentro de él se define un dispositivo RBD. El cliente lo mapea y monta, presentándose como un disco local.
  2. Los datos escritos por el usuario se dividen en bloques de tamaño predeterminado (4 MB). Cada bloque se nombra con un prefijo de objeto y un número de secuencia.
  3. Cada objeto se asigna a un grupo de coloccaión (PG) mediante un algoritmo de hash.
  4. El PG utiliza el algoritmo CRUSH para seleccionar tres OSD (asumiendo un factor de réplica de 3), almacenando el objeto en ellos. Este conjunto de OSD representa un grupo de colocación primario (PGP).
  5. Cada OSD formatea su disco con un sistema de archivos XFS, almacenando los objetos como archivos. Por ejemplo, un objeto podría guardarse como rbd0.object1.file.

Creación y uso de un pool RBD

1. Inicializar el pool RBD

[admin@node1 ~]# ceph osd pool create pool_rbd
pool 'pool_rbd' created

# Etiquetar el pool para uso específico
[admin@node1 ~]# ceph osd pool application enable pool_rbd rbd
enabled application 'rbd' on pool 'pool_rbd'

# Inicializar el pool
[admin@node1 ~]# rbd pool init pool_rbd
[admin@node1 ~]# rados -p pool_rbd ls 
rbd_info

2. Configurar usuario y distribuir claves

# Crear un usuario para RBD con permisos específicos
ceph auth get-or-create client.usuario_rbd mon "profile rbd" osd "profile rbd"

# Guardar el archivo de claves
ceph auth get client.usuario_rbd  > ceph.client.usuario_rbd.keyring

# Distribuir la clave a los clientes
scp ceph.client.usuario_rbd.keyring  root@192.168.50.22:/etc/ceph

3. Listar pools desde el cliente

[admin@cliente1 ceph]# ceph osd pool ls --name client.usuario_rbd --keyring /etc/ceph/ceph.client.usuario_rbd.keyring 
device_health_metrics
pool_rbd

4. Crear un bloque RBD

[admin@cliente1 ceph]# rbd create pool_rbd/imagen_prueba --name client.usuario_rbd --size 1G --image-format 2 --image-feature layering

# Verificar el bloque creado
[admin@cliente1 ceph]# rados -p pool_rbd ls --name client.usuario_rbd
rbd_id.imagen_prueba
rbd_directory
rbd_info
rbd_header.3a7f9c123456b  # Identificador único para datos

5. Mapear y montar el bloque RBD en el cliente

# Cargar el módulo RBD en el kernel
[admin@cliente1 ceph]# modprobe rbd
[admin@cliente1 ceph]# echo "rbd" >> /etc/modules-load.d/rbd.conf

# Verificar el módulo cargado
[admin@cliente1 ceph]# lsmod  | grep rbd 
rbd                   135168  0
libceph               413696  1 rbd

# Mapear el bloque RBD
[admin@cliente1 ceph]# rbd map --name client.usuario_rbd pool_rbd/imagen_prueba
/dev/rbd0  # Dispositivo mapeado en el cliente

# Verificar tamaño y formatear
[admin@cliente1 ceph]# lsblk  |grep rbd
rbd0                                                                                                  252:0    0    1G  0 disk 

[admin@cliente1 ceph]# mkfs -t xfs /dev/rbd0 
[admin@cliente1 ceph]# mkdir /mnt/rbd_storage

[admin@cliente1 ceph]# mount /dev/rbd0 /mnt/rbd_storage/

# Escribir datos de prueba
[admin@cliente1 /]# echo "ejemplo" > /mnt/rbd_storage/archivo.txt

# Listar objetos en el pool (muestra fragmentación de datos)
[admin@node1 ~]# rados -p pool_rbd ls
rbd_data.3a7f9c123456b.00000000000000a0
rbd_data.3a7f9c123456b.00000000000000ff
rbd_id.imagen_prueba
rbd_data.3a7f9c123456b.0000000000000060
rbd_directory
rbd_data.3a7f9c123456b.00000000000000e0
rbd_data.3a7f9c123456b.0000000000000000
rbd_info
rbd_data.3a7f9c123456b.0000000000000020
rbd_data.3a7f9c123456b.0000000000000080
rbd_data.3a7f9c123456b.00000000000000c0
rbd_data.3a7f9c123456b.0000000000000040
rbd_header.3a7f9c123456b

6. Configurar mapeo y montaje automático

# Editar el archivo de configuración para mapeo automático
[admin@node1 ceph]# cat rbdmap 
# RbdDevice		Parameters
#poolname/imagename	id=client,keyring=/etc/ceph/ceph.client.keyring
pool_rbd/imagen_prueba    id=usuario_rbd  # ID del cliente

# Habilitar el servicio de mapeo automático
[admin@cliente1 ceph]# systemctl enable rbdmap --now
Created symlink /etc/systemd/system/multi-user.target.wants/rbdmap.service → /usr/lib/systemd/system/rbdmap.service.

# Agregar entrada para montaje automático en fstab
[admin@cliente1 ceph]# tail -1 /etc/fstab 
/dev/rbd0  /mnt/rbd_storage  xfs defaults,_netdev 0 0

7. Parámetros de creación de RBD

  • poolname: Especifica el pool donde se crea la imagen (por defecto, rbd).
  • --size: Define el tamaño de la imagen.
  • -m: Dirección del monitor.
  • -k: Ruta al archivo de claves.
  • --image-format: Formato de la imagen (1 obsoleto, 2 actual).
  • --image-feature: Características habilitadas para la imagen.
  • --stripe-unit: Tamaño mínimo de bloque (4k a 32M, predeterminado 4M).
  • --stripe-count: Número de bloques para escritura paralela (predeterminado 1).

Tabla de características de RBD:

Nombre Descripción ID
layering Soporte para capas, habilita clonación y snapshots con COW. 1
striping Soporte para rayas v2, mejora rendimiento en E/S secuencial. 2
exclusive-lock Bloqueo exclusivo, restringe uso a un solo cliente. 4
object-map Mapeo de objetos, acelera operaciones de E/S (requiere exclusive-lock). 8
fast-diff Cálculo rápido de diferencias (requiere object-map). 16
deep-flatten Aplanamiento de snapshots, elimina dependencias. 32
journaling Registro de cambios para recuperación (requiere exclusive-lock), aumenta I/O de disco. 64
data-pool Soporte para pool de datos con codificación de borrado. 128
# Crear imagen con múltiples características
[admin@node1 ~]# rbd create pool_rbd/imagen_multi --size 2G --image-format 2 --image-feature layering,exclusive-lock,object-map 

[admin@node1 ~]# rbd info  pool_rbd/imagen_multi
rbd image 'imagen_multi':
	size 2 GiB in 512 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: 3b8a2c1e2e84ac
	block_name_prefix: rbd_data.3b8a2c1e2e84ac
	format: 2
	features: layering, exclusive-lock, object-map, fast-diff

# Modificar características predeterminadas usando ID (ejemplo: layering + deep-flatten = 33)
[admin@node1 ~]# ceph config set client rbd_default_features 33
[admin@node1 ~]# rbd create  pool_rbd/imagen_default --size 1G 

[admin@node1 ~]# rbd info pool_rbd/imagen_default
rbd image 'imagen_default':
	size 1 GiB in 256 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: 3b9c3f16be0a33
	block_name_prefix: rbd_data.3b9c3f16be0a33
	format: 2
	features: layering, deep-flatten
	op_features: 
	flags: 
	create_timestamp: Tue Mar 17 19:44:45 2026
	access_timestamp: Tue Mar 17 19:44:45 2026
	modify_timestamp: Tue Mar 17 19:44:45 2026

8. Operaciones básicas de mapeo RBD

# Listar dispositivos mapeados
[admin@cliente1 ceph]# rbd showmapped
id  pool      namespace  image          snap  device   
0   pool_rbd            imagen_prueba  -     /dev/rbd0

# Desmapear (requiere desmontaje previo)
[admin@cliente1 ceph]# umount /mnt/rbd_storage 
[admin@cliente1 ceph]# rbd unmap pool_rbd/imagen_prueba

Operaciones con dispositivos de bloque

1. Consulta básica de RBD

# Listar imágenes en un pool
[admin@node1 ~]# rbd ls -p pool_rbd
imagen_prueba

# Ver detalles de una imagen
[admin@node1 ~]# rbd -p pool_rbd info imagen_prueba
rbd image 'imagen_prueba':
	size 1 GiB in 256 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: 45ae1239f72b7
	block_name_prefix: rbd_data.45ae1239f72b7
	format: 2
	features: layering
	op_features: 
	flags: 
	create_timestamp: Wed Mar 18 20:52:52 2026
	access_timestamp: Wed Mar 18 20:52:52 2026
	modify_timestamp: Wed Mar 18 20:52:52 2026

2. Redimensionar un bloque RBD

# Expandir de 1G a 3G
[admin@node1 ~]# rbd resize pool_rbd/imagen_prueba --size 3G 
Resizing image: 100% complete...done.

# Actualizar sistema de archivos en el cliente
[admin@cliente1 ceph]# xfs_growfs /dev/rbd0 

[admin@cliente1 ceph]# df -hT /mnt/rbd_storage/
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/rbd0      xfs   3.0G   56M  3.0G   2% /mnt/rbd_storage

# Reducir tamaño (operación delicada, no recomendada para XFS)
[admin@node1 ~]# rbd resize  pool_rbd/imagen_prueba --size 2G --allow-shrink
Resizing image: 100% complete...done.

3. Copiar un dispositivo de bloque

[admin@node1 ~]# rbd cp pool_rbd/imagen_prueba pool_rbd/copia_imagen
Image copy: 100% complete...done.

[admin@node1 ~]# rbd ls -p pool_rbd
copia_imagen
imagen_prueba

4. Mover a otro pool

# Crear nuevo pool
[admin@node1 ~]# ceph osd pool create pool_destino
pool 'pool_destino' created

[admin@node1 ~]# ceph osd pool application enable pool_destino rbd
enabled application 'rbd' on pool 'pool_destino'

[admin@node1 ~]# rbd pool init pool_destino

# Copiar imagen al nuevo pool
[admin@node1 ~]# rbd cp pool_rbd/copia_imagen pool_destino/imagen_movida
Image copy: 100% complete...done.

[admin@node1 ~]# rbd -p pool_destino ls
imagen_movida

Nota: Al montar una copia de un bloque RBD ya montado, el sistema puede fallar por duplicidad de identificadores. Solo un bloque (original o copia) debe estar mapeado simultáneamente.

Gestión de snapshots

1. Crear una snapshot

[admin@cliente1 rbd_storage]# rbd snap create pool_rbd/imagen_prueba@snap_inicial --id usuario_rbd
Creating snap: 100% complete...done.

[admin@cliente1 rbd_storage]# rbd snap ls pool_rbd/imagen_prueba --id usuario_rbd
SNAPID  NAME           SIZE   PROTECTED  TIMESTAMP               
     4  snap_inicial   2 GiB             Tue Mar 17 20:12:05 2026

2. Revertir a una snapshot

# Eliminar datos en el cliente
[admin@cliente1 rbd_storage]# ls
archivo.txt
[admin@cliente1 rbd_storage]# rm -rf archivo.txt 

# Desmontar el bloque
[admin@cliente1 ~]# umount /mnt/rbd_storage 

# Revertir snapshot
[admin@node1 ~]# rbd snap rollback pool_rbd/imagen_prueba@snap_inicial
Rolling back to snapshot: 100% complete...done.

# Remontar y verificar
[admin@cliente1 ~]# mount -a
[admin@cliente1 ~]# ls /mnt/rbd_storage/
archivo.txt

3. Proteger una snaphsot

[admin@node1 ~]# rbd snap  protect pool_rbd/imagen_prueba@snap_inicial

[admin@node1 ~]# rbd info pool_rbd/imagen_prueba@snap_inicial
rbd image 'imagen_prueba':
	size 2 GiB in 512 objects
	order 22 (4 MiB objects)
	snapshot_count: 1
	id: 45ae1239f72b7
	block_name_prefix: rbd_data.45ae1239f72b7
	format: 2
	features: layering
	op_features: 
	flags: 
	create_timestamp: Tue Mar 17 19:15:31 2026
	access_timestamp: Tue Mar 17 20:01:53 2026
	modify_timestamp: Tue Mar 17 19:15:31 2026
	protected: True  # Estado protegido

4. Eliminar una snapshot

# Intentar eliminar (falla si está protegida)
[admin@node1 ~]# rbd snap rm pool_rbd/imagen_prueba@snap_inicial
Removing snap: 0% complete...failed.
rbd: snapshot 'snap_inicial' is protected from removal.

# Desproteger y luego eliminar
[admin@node1 ~]# rbd snap unprotect pool_rbd/imagen_prueba@snap_inicial
[admin@node1 ~]# rbd snap rm pool_rbd/imagen_prueba@snap_inicial
Removing snap: 100% complete...done.

5. Clonar una snapshot

La clonación requiere que la snapshot de origen esté protegida, ya que el clon depende de ella.

# Crear y proteger snapshot en otra imagen
[admin@node1 ~]# rbd snap create pool_rbd/imagen_multi@snap_origen
Creating snap: 100% complete...done.

[admin@node1 ~]# rbd snap protect pool_rbd/imagen_multi@snap_origen

# Clonar la snapshot
[admin@node1 ~]# rbd clone pool_rbd/imagen_multi@snap_origen pool_rbd/imagen_clon

[admin@node1 ~]# rbd ls -p pool_rbd
imagen_clon
imagen_prueba

[admin@node1 ~]# rbd info pool_rbd/imagen_clon
rbd image 'imagen_clon':
	size 2 GiB in 512 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: 50f265b854f02
	block_name_prefix: rbd_data.50f265b854f02
	format: 2
	features: layering, exclusive-lock, object-map, fast-diff
	op_features: 
	flags: 
	create_timestamp: Tue Mar 17 20:33:52 2026
	access_timestamp: Tue Mar 17 20:33:52 2026
	modify_timestamp: Tue Mar 17 20:33:52 2026
	parent: pool_rbd/imagen_multi@snap_origen  # Dependencia
	overlap: 2 GiB

# Aplanar el clon para independizarlo
[admin@node1 ~]# rbd flatten pool_rbd/imagen_clon
Image flatten: 100% complete...done.

[admin@node1 ~]# rbd info pool_rbd/imagen_clon
rbd image 'imagen_clon':
	size 2 GiB in 512 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: 50f265b854f02
	block_name_prefix: rbd_data.50f265b854f02
	format: 2
	features: layering, exclusive-lock, object-map, fast-diff
	op_features: 
	flags: 
	create_timestamp: Tue Mar 17 20:33:52 2026
	access_timestamp: Tue Mar 17 20:33:52 2026
	modify_timestamp: Tue Mar 17 20:33:52 2026
# Sin dependencia de padre

Configuración de caché RBD en el cliente

[admin@cliente1 rbd_storage]# vim /etc/ceph/ceph.conf
# Agregar las siguientes configuraciones
[client.usuario_rbd]
rbd_cache = true  # Habilitar caché RBD
rbd_cache_size = 33554432 # 32M
rbd_cache_max_dirty = 25165824
rbd_cache_target_dirty = 16777216
rbd_cache_max_dirty_age = 1
rbd_cache_writethrough_until_flush = true

La caché de RBD almacena datos en memoria antes de escribirlos en disco, acelerando las operaciones de escritura. Sin embargo, esto implica un riesgo: en caso de fallo eléctrico, se podrían perder hasta 32M de datos. La escritura se realiza de forma asíncrona hacia los OSD, lo que mejora el rendimiento pero reduce la garantía de persistencia inmediata.

Etiquetas: ceph rbd OSD Linux Kernel librbd

Publicado el 7-25 14:16