Ceph File System es un sistema de archivos distribuido libre, está diseñado para el uso con gran cantidad de datos, está muy enfocado para el uso con Big Data. Ceph tiene como objetivo ser POSIX-compatible y completamente distribuido sin ningún punto de fallo. Los datos tienen replicación libre de errores, haciéndolo tolerante a fallos.
Ceph emplea tres tipos diferentes de daemons:
- Monitores de clúster (ceph-mon), mantienen un control de actividad y fallos en los nodos del clúster
- Servidores de metadatos (ceph-mds), almacenan los metadatos de inodos y directorios.
- Dispositivos de Almacenamiento de Objetos (ceph-osds), actualmente es el que almacena el contenido de los archivos. Idealmente, el ceph-osds debería almacenar los datos en un sistema de archivos BTRFS local, pero también pueden utilizarse otros sistemas de archivo local.
Todos los demonios funcionan totalmente distribuidos, y pueden ejecutarse en el mismo ambiente de servidores, mientras los clientes interactuarán directamente entre ellos.
Ceph distribuye los segmentos de los archivos individuales a través de los múltiples nodos para así conseguir un incremento de rendimiento, de manera similar como lo hace el agrupamiento de discos en RAID0 segmenta los datos en las diferentes porciones de múltiples disco duros. Su balanceo de carga es autoadaptable por lo cual soporta la frecuencia de acceso a objetos replicancolos sobre mas nodos.
Documentación Oficial en: http://ceph.com/docs/master/
Comparación de las tecnologías de almacenamiento
Como se puede ver Ceph es la solución más flexible pero todavía requieren algunas mejoras antes de ser calificado como listos para la producción en el frente Cephfs.
Arquitectura
Instalación y configuración
Inicialmente usamos fdisk para visualizar el estado de nuestros discos para así mismo poder trabajar, en este caso usaremos 3 servidores Ubuntu.
sudo fdisk -l
Para facilitar la tarea vamos a definir los nombres de host para realizar todo el proceso mediante nombres y no por IP, para ello editamos el archivo:
nano /etc/hosts
Luego en este archivo adicionamos las IP’s de los otros servidores y colocamos los nombres de cada uno, por ejemplo:
192.168.0.11 ceph1 192.168.0.12 ceph2 192.168.0.13 ceph3
Posteriormente debemos crear llaves SSH para que los 3 servidores se autentiquen automáticamente entre ellos para poder realizar comunicación y además de esto los 3 deben tener instalado, configurado y sincronizado el servicio NTP. En los 3 servidores vamos a hacer lo siguiente:
ssh-keygen -t rsa ssh-copy-id [usuario]@[servidordestino]
Esto debe hacerse con los servidores a los que vayamos a trabajar, en este caso debo compartir la llave cada servidor a los dos adicionales. Una vez realizado el proceso intentamos hacer ssh entre servidores y deberán autenticarse automáticamente.
Ahora se debe instalar el servicio NTP en todos los servidores
sudo apt-get install ntp
Es tiempo de instalar ceph-deploy (admin) en nuestro nodo principal en este caso será ceph1, reemplazar en la línea 2 de estos comandos {ceph-stable-release} por la versión que desees usar (ver: http://docs.ceph.com/docs/master/releases/) en mi caso usaré firefly por ser la versión LTS mas antigua.
Para RedHat ver: http://docs.ceph.com/docs/hammer/start/quick-start-preflight/#red-hat-package-manager-rpm
wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add - echo deb http://download.ceph.com/debian-{ceph-stable-release}/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list sudo apt-get update && sudo apt-get install ceph-deploy
Ahora creamos el primer clúster de almacenamiento Ceph y especifique el primer servidor de la agrupación ya sea por el nombre de host o la dirección IP [SERVIDOR].
ceph-deploy new ceph1
Ahora se debe desplegar Ceph en todos los nodos que se van a utilizar para el almacenamiento Ceph. Colocar el nombre de host o la dirección IP del clúster Ceph incluyendo el host que está ejecutando el comando.
ceph-deploy install ceph1 ceph2 ceph3 [ceph...]
En este momento debemos instalar el monitor Ceph y aceptar el aviso clave que se generan claves. Generamos llaves de Ceph para nuestro Cluster
ceph-deploy mon create-initial
Deberá aparecer un mensaje como este:
{cluster-name}.client.admin.keyring {cluster-name}.bootstrap-osd.keyring {cluster-name}.bootstrap-mds.keyring {cluster-name}.bootstrap-rgw.keyring
Se debe en este momento añadir los OSD (Object Storage Daemon), A manera rápida usamos directorios en vez de un disco o partición.
ssh ceph2 sudo mkdir /var/local/osd0 exit ssh ceph3 sudo mkdir /var/local/osd1 exit
Entonces, desde el nodo de principal, usamos ceph-deploy para preparar los OSD.
ceph-deploy osd prepare ceph2:/var/local/osd0 ceph3:/var/local/osd1
Finalmente activamos el OSD con:
ceph-deploy osd activate ceph2:/var/local/osd0 ceph3:/var/local/osd1
Utilice ceph-deploy para copiar el archivo de configuración y llave de administración a su nodo de administración y sus nodos Ceph para que pueda utilizar la CLI ceph sin tener que especificar la dirección de monitor y ceph.client.admin.keyring cada vez que se ejecuta un comando.
ceph-deploy admin ceph1 ceph2 ceph3
Cuando ceph-deploy está hablando con el anfitrión local del admin (ceph1), que debe ser accesible por su nombre de host. Por esto desde el inicio se editó el archivo /etc/hosts, ahora se debe verificar de que tiene los permisos correctos para la ceph.client.admin.keyring.
sudo chmod +r /etc/ceph/ceph.client.admin.keyring
Revisar el estado del clúster.
ceph health
Deberá devolver un mensaje como: active + clean o similares, ahora pondremos en operación nuestro cluster.
Comandos que nos serán útiles para el manejo del cluster:
Full documentation can be found at: http://ceph.com/ceph-deploy/docs optional arguments: -h, --help show this help message and exit -v, --verbose be more verbose -q, --quiet be less verbose --version the current installed version of ceph-deploy --username USERNAME the username to connect to the remote host --overwrite-conf overwrite an existing conf file on remote host (if present) --cluster NAME name of the cluster commands: COMMAND description new Start deploying a new cluster, and write a CLUSTER.conf and keyring for it. install Install Ceph packages on remote hosts. mds Deploy ceph MDS on remote hosts. mon Deploy ceph monitor on remote hosts. gatherkeys Gather authentication keys for provisioning new nodes. disk Manage disks on a remote host. osd Prepare a data disk on remote host. admin Push configuration and client.admin key to a remote host. config Push configuration file to a remote host. uninstall Remove Ceph packages from remote hosts. purgedata Purge (delete, destroy, discard, shred) any Ceph data from /var/lib/ceph purge Remove Ceph packages from remote hosts and purge all data. forgetkeys Remove authentication keys from the local directory. pkg Manage packages on remote hosts. calamari Install and configure Calamari nodes
Uso de Ceph
Ceph Object Storage Device (OSD)
Muestra la estructura del cluster mediante un mapeo de todos sus discos (storage).
# ceph osd tree # id weight type name up/down reweight -1 2 root default -4 2 datacenter dc -5 2 room laroom -6 2 row larow -3 2 rack lerack -2 2 host ceph 0 1 osd.0 up 1 1 1 osd.1 up 1
Vemos que en el host ceph tenemos dos OSD corriendo (osd.0 y osd.1)
Ceph monitors (MONs)
Consultamos los monitors tienen armado el cluster:
# ceph mon_status
Metadata Server (MDS)
Consultamos el estado del servidor MDS:
# ceph mds stat e1: 0/0/1 up
Dispositivo de bloques
Esta funcionalidad permite que Ceph cree un espacio de almacenamiento que es presentado al cliente como un dispositivo de bloques (disco) al que se puede particionar, dar formato, clonar, realizar snapshots (instantáneas) y obviamente montar y usar como un disco cualquiera.
El siguiente esquema muestra cómo es un dispositivo de bloques generado en Ceph:
rbd es el comando necesario para administrar dispositivos de bloques en el cluster.
Pedimos al cluster la creación de un dispositivo de bloques de 512MB.
rbd create cliente1-rdb1 --size 512
Luego listamos los rbd creados:
# rbd ls cliente1-rdb1
Luego consultamos la información del volumen creado:
# rbd --image cliente1-rdb1 info rbd image 'cliente1-rdb1': size 512 MB in 128 objects order 22 (4096 kB objects) block_name_prefix: rb.0.1081.74b0dc51 format: 1
Si dos damos cuenta, en las otras máquinas dentro del cluster el volumen será visible con el mismo comando indicando anteriormente.
Hacemos que el kernel Linux de nuestro cliente genere un dispositivo (/dev) que respresente el dispositivo en el cluster. Esta opción de mapeo requiere del módulo rbd cargado (modprobe rbd
), en este caso deseo usar mi tercera máquina ceph3
# rbd map --image cliente1-rdb1
Para visualizar los dispositivos mapeados en esta máquina, debemos usar el siguiente comando:
# rbd showmapped id pool image snap device 0 rbd cliente1-rdb1 - /dev/rbd0
Ahora tenemos un disco /dev/rbd0 que podemos utilizar de forma normal como cualquier disco, para lo cual daremos formato ext3, o el tipo de partición deseada:
# mkfs.ext3 /dev/rbd0 mke2fs 1.42.7 (21-Jan-2013) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=1024 blocks, Stripe width=1024 blocks 32768 inodes, 131072 blocks 6553 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=134217728 4 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304 Allocating group tables: done Writing inode tables: done Creating journal (4096 blocks): done Writing superblocks and filesystem accounting information: done
Ahora realizamos el montaje de nuestra partición
# mkdir /home/volumen1-ceph
# mount /dev/rbd0 /home/volumen1-ceph/
Finalmente verificamos el estado de nuestros discos con el comando habitual de df -h
# df -h Filesystem Size Used Avail Use% Mounted on /dev/vda1 197G 6.3G 183G 4% / devtmpfs 3.4G 0 3.4G 0% /dev tmpfs 3.4G 0 3.4G 0% /dev/shm tmpfs 3.4G 228K 3.4G 1% /run tmpfs 3.4G 0 3.4G 0% /sys/fs/cgroup tmpfs 3.4G 0 3.4G 0% /tmp /dev/rbd0 488M 416K 462M 1% /home/volumen1-ceph
Cambiar tamaño del volumen Ceph
Inicialmente se debe desmontar la unidad:
# umount /dev/rbd0
Y posteriormente realizar la ampliación del volumen, en este caso lo aumentaremos 2GB:
# rbd resize --image cliente1-rdb1 --size 2048 Resizing image: 100% complete...done.
Y se valida el tamaño del nuevo volumen:
# rbd info --image cliente1-rdb1 rbd image 'cliente1-rdb1': size 2048 MB in 512 objects order 22 (4096 kB objects) block_name_prefix: rb.0.1081.74b0dc51 format: 1
Luego de esto debemos extender la partición como cuando sucede con cualquier distribución Linux:
# e2fsck -f /dev/rbd0 e2fsck 1.42.7 (21-Jan-2013) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/rbd0: 11/32768 files (9.1% non-contiguous), 6262/131072 blocks
# resize2fs /dev/rbd0 resize2fs 1.42.7 (21-Jan-2013) Resizing the filesystem on /dev/rbd0 to 524288 (4k) blocks. The filesystem on /dev/rbd0 is now 524288 blocks long.
Posteriormente se realiza el montaje del volumen y verificamos el espacio del archivo:
# mount /dev/rbd0 /home/volumen1-ceph/ # df -h Filesystem Size Used Avail Use% Mounted on /dev/vda1 197G 6.3G 183G 4% / devtmpfs 3.4G 0 3.4G 0% /dev tmpfs 3.4G 0 3.4G 0% /dev/shm tmpfs 3.4G 228K 3.4G 1% /run tmpfs 3.4G 0 3.4G 0% /sys/fs/cgroup tmpfs 3.4G 0 3.4G 0% /tmp /dev/rbd0 2.0G 788K 1.9G 1% /home/volumen1-ceph
He realizado un cluster de 300GB con varios discos 🙂 y todo funciona de maravilla.
# df -h Filesystem Size Used Avail Use% Mounted on /dev/vda1 197G 11G 178G 6% / devtmpfs 3.4G 0 3.4G 0% /dev tmpfs 3.4G 0 3.4G 0% /dev/shm tmpfs 3.4G 232K 3.4G 1% /run tmpfs 3.4G 0 3.4G 0% /sys/fs/cgroup tmpfs 3.4G 0 3.4G 0% /tmp /dev/rbd0 289G 876K 274G 1% /home/volumen1-ceph
Algo así sería la arquitectura 😛