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
- 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.
- 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.
- Cada objeto se asigna a un grupo de coloccaión (PG) mediante un algoritmo de hash.
- 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).
- 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.