Arquitectura del Entorno de Pruebas
Para demostrar las operaciones avanzadas con dispositivos de bloque en Ceph, utilizaremos un clúster distribuido compuesto por tres nodos de almacenamiento y un nodo cliente dedicado. Asegúrese de que todos los sistemas operativos estén actualizados con los últimos parches del kernel para garantizar la compatibilidad con los módulos rbd.
| Dirección IP | Rol / Hostname |
|---|---|
| 10.0.50.11 | ceph-mon-01 |
| 10.0.50.12 | ceph-mon-02 |
| 10.0.50.13 | ceph-osd-01 |
| 10.0.50.20 | client-app-01 |
Configuración en el Servidor
Creación del Pool de Almacenamiento
El primer paso consiste en generar un pool lógico que albergará nuestros volúmenes de bloque:
[root@ceph-mon-01 ~]# ceph osd pool create block_data_pool 128
pool 'block_data_pool' created
Generación de Credenciales de Acceso
Por seguridad, es fundamental restringir el acceso. Crearemos un usuario específico con permisos limitados exclusivamente al pool recién creado:
[root@ceph-mon-01 ~]# ceph auth get-or-create client.block_admin mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=block_data_pool'
[root@ceph-mon-01 ~]# ceph auth get client.block_admin
exported keyring for client.block_admin
[client.block_admin]
key = AQD9ZkFfOa3hHBAAqZ8R5nX6mK4LqV1vY2bNwA==
caps mon = "allow r"
caps osd = "allow class-read object_prefix rbd_children, allow rwx pool=block_data_pool"
[root@ceph-mon-01 ~]# ceph auth get client.block_admin -o /etc/ceph/ceph.client.block_admin.keyring
exported keyring for client.block_admin
Habilitación de la Aplicación RBD
Para que el clúster gestione correctamente los metadatos de los bloques, debe habilitarse el módulo de la aplicación:
[root@ceph-mon-01 ~]# ceph osd pool application enable block_data_pool rbd
enabled application 'rbd' on pool 'block_data_pool'
Preparación del Nodo Cliente
En la máquina que consumirá el almacenamiento, instalaremos las utilidades base y sincronizaremos la configuración del clúster.
[root@client-app-01 ~]# yum install ceph-common -y
# Desde el nodo monitor, transferimos los archivos de configuración y autenticación
[root@ceph-mon-01 ~]# scp /etc/ceph/ceph.conf /etc/ceph/ceph.client.block_admin.keyring root@10.0.50.20:/etc/ceph/
Validamos la conectividad utilizando las nuevas credenciales:
[root@client-app-01 ~]# ceph -s --user block_admin
cluster:
id: 88372a1e-9b4f-4a1c-8e9d-123456789abc
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph-mon-01,ceph-mon-02,ceph-osd-01
mgr: active
osd: 3 osds: 3 up, 3 in
data:
pools: 1 pools, 128 pgs
objects: 0 objects, 0 B
usage: 3.0 GiB used, 297 GiB / 300 GiB avail
pgs: 128 active+clean
Operaciones con Imágenes RBD
Creación y Modificación de Volúmenes
Procedemos a generar los dispositivos de bloque virtuales:
[root@client-app-01 ~]# rbd create block_data_pool/vol_db_primary --size 10G --user block_admin
[root@client-app-01 ~]# rbd create block_data_pool/vol_app_logs --size 20G --user block_admin
[root@client-app-01 ~]# rbd ls -l -p block_data_pool --user block_admin
NAME SIZE PARENT FMT PROT LOCK
vol_app_logs 20 GiB 2
vol_db_primary 10 GiB 2
Por defecto, las imágenes incluyen características avanzadas que pueden causar conflictos con kernels más antiguos. Retendremos únicamente la capacidad de layering:
[root@client-app-01 ~]# rbd feature disable block_data_pool/vol_db_primary exclusive-lock object-map fast-diff deep-flatten --user block_admin
[root@client-app-01 ~]# rbd feature disable block_data_pool/vol_app_logs exclusive-lock object-map fast-diff deep-flatten --user block_admin
Mapeo y Formateo del Sistema de Archivos
Para utilizar el volumen, debe mapearse como un dispositivo local de bloque:
[root@client-app-01 ~]# rbd map block_data_pool/vol_db_primary --user block_admin
/dev/rbd0
[root@client-app-01 ~]# mkfs.xfs /dev/rbd0
meta-data=/dev/rbd0 isize=512 agcount=8, agsize=327680 blks
...
[root@client-app-01 ~]# mkdir -p /mnt/database_data
[root@client-app-01 ~]# mount /dev/rbd0 /mnt/database_data/
Desmontaje y Redimensionamiento
Cuando el volumen necesita mantenimiento o expansión, se debe liberar primero del sistema de archivos local:
[root@client-app-01 ~]# umount /mnt/database_data/
[root@client-app-01 ~]# rbd unmap block_data_pool/vol_db_primary --user block_admin
# Expandir la capacidad del volumen a 50 GB
[root@client-app-01 ~]# rbd resize block_data_pool/vol_db_primary --size 50G --user block_admin
Resizing image: 100% complete...done.
Gestión de la Papelera de Reciclaje
Ceph permite enviar imágenes a una papelera temporla en lugar de eliminarlas permanentemente de forma inmediata:
[root@client-app-01 ~]# rbd trash move block_data_pool/vol_db_primary --user block_admin
[root@client-app-01 ~]# rbd trash list -p block_data_pool --user block_admin
12613ea38941 vol_db_primary
# Restauración desde la papelera
[root@client-app-01 ~]# rbd trash restore -p block_data_pool --image vol_db_primary --image-id 12613ea38941 --user block_admin
Administración de Snapshots
Los snapshots proporcionan copias de seguridad instantáneas de solo lectura del estado actual del volumen. Primero, generaremos datos de prueba:
[root@client-app-01 ~]# rbd map block_data_pool/vol_db_primary --user block_admin
/dev/rbd0
[root@client-app-01 ~]# mount /dev/rbd0 /mnt/database_data/
[root@client-app-01 ~]# echo "Transacción crítica 001" > /mnt/database_data/transactions.log
Creación y Reversión de Snapshots
# Generar el punto de restauración
[root@client-app-01 ~]# rbd snap create block_data_pool/vol_db_primary@daily_backup --user block_admin
# Simulación de pérdida de datos
[root@client-app-01 ~]# rm -f /mnt/database_data/transactions.log
[root@client-app-01 ~]# umount /mnt/database_data/
[root@client-app-01 ~]# rbd unmap block_data_pool/vol_db_primary --user block_admin
# Ejecutar el rollback al estado anterior
[root@client-app-01 ~]# rbd snap rollback block_data_pool/vol_db_primary@daily_backup --user block_admin
Rolling back to snapshot: 100% complete...done.
Control de Límites
Para evitar la proliferación excesiva de snapshots que degraden el rendimiento, se pueden establecer límites estrictos:
[root@client-app-01 ~]# rbd snap limit set block_data_pool/vol_db_primary --limit 7 --user block_admin
[root@client-app-01 ~]# rbd snap limit clear block_data_pool/vol_db_primary --user block_admin
Clonación de Volúmenes (Copy-on-Write)
La clonación en Ceph utiliza la tecnología Copy-on-Write (CoW). Un clon es inicialmente un enlace lógico a un snapshot protegido. No consume espacio físico adicional hasta que se realizan operaciones de escritura sobre él. Cualquier lectura en el clon que no haya sido sborescrita se redirige al snapshot original.
Protección y Generación del Clon
Un snapshot debe estar blindado contra eliminaciones accidentales antes de servir como origen para un clon:
[root@client-app-01 ~]# rbd snap protect block_data_pool/vol_db_primary@daily_backup --user block_admin
[root@client-app-01 ~]# rbd clone block_data_pool/vol_db_primary@daily_backup block_data_pool/vol_db_staging --user block_admin
[root@client-app-01 ~]# rbd info block_data_pool/vol_db_staging --user block_admin
rbd image 'vol_db_staging':
size 50 GiB in 12800 objects
order 22 (4 MiB objects)
id: 99a82f3b4c1d
block_name_prefix: rbd_data.99a82f3b4c1d
format: 2
features: layering
parent: block_data_pool/vol_db_primary@daily_backup
overlap: 50 GiB
Independencia del Clon (Flatten)
Si se requiere que el volumen clonado sea completamente autónomo y no dependa del snapshot original, debe ejecutarse un aplanamiento. Esto copia todos los datos del origen al destino:
[root@client-app-01 ~]# rbd flatten block_data_pool/vol_db_staging --user block_admin
Image flatten: 100% complete...done.
[root@client-app-01 ~]# rbd info block_data_pool/vol_db_staging --user block_admin | grep parent
# La salida estará vacía, confirmando la independencia
Limpieza del Snapshot Original
Una vez que el clon es independiente, el snapshot padre puede ser desprotegido y eliminado para liberar metadatos:
[root@client-app-01 ~]# rbd snap unprotect block_data_pool/vol_db_primary@daily_backup --user block_admin
[root@client-app-01 ~]# rbd snap rm block_data_pool/vol_db_primary@daily_backup --user block_admin
Removing snap: 100% complete...done.