Instalar y configurar un 3Nodo con #Ceph y #Ubuntu

ceph

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:

cepth cluster

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 😛

ceph