HPE + Scality: La solución definida por software para almacenamiento masivo de fichero y objetos

Scality Ring es una plataforma scale-out de almacenamiento de objetos basada en software que nos permite tener almacenamiento masivo, ultra resiliente, con acceso multi-protocolo y manteniendo costes reducidos.

Muchos de nosotros lo conocimos a raíz de la alianza estratégica que estableció con Hewlett-Packard Enterprise. Gracias a esta alianza, HPE incorporó a su portfolio una de las soluciones de almacenamiento definido por software más potentes del mercado.

Scality Ring no es el único producto de esta compañía, aunque sí es el más conocido. Para saber más sobre otros productos, visitad https://scality.com/

Un anillo básico consiste en una serie de servidores (con un mínimo de 3 y un máximo virtualmente ilimitado) con instalaciones de Linux (RedHat o CentOS) en baremetal, sobre los que se despliega el software de Scality. Durante la instalación se definen los roles que cada servidor va a tener, siendo los roles básicos los de nodo (el servidor que posee y gestiona los discos donde se almacenan los datos) y conector, que es el encargado de servir los protocolos de acceso (típicamente, NFS, SMB y S3, aunque hay más; pueden consultarse en la documentación de Scality).

El anillo más sencillo consiste realmente en dos anillos: uno para datos y otro para metadatos.

El software de Ring se encarga de distribuir el almacenamiento entre los nodos del anillo, ya sea copiando directamente los datos de un nodo a otro, como es el caso del anillo de metadatos, puesto que así se consigue el máximo rendimiento, o realizando un Erasure Coding, llamado ARC en esta solución, para el anillo de datos, que nos permite conseguir una muy alta resiliencia manteniendo una buena eficiencia de capacidad bruta/usable.

Evidentemente, esta configuración puede complicarse todo lo que queramos: podemos distribuir un mismo anillo por varias localizaciones físicas para lograr una alta disponibilidad multi-sedes o tener diferentes anillos en una o varias localizaciones.

No es imprescindible tener nodos dedicados para hacer de conectores, ya que un mismo servidor puede tener el rol de nodo de almacenamiento y conector, pero en entornos de mayor tamaño es recomendable para mayor rendimiento.

Aunque Scality Ring es una solución agnóstica al hardware, existen una serie de requisitos que los servidores deben cumplir, tales como existencia de SSDs o contar con una controladora de discos certificada para la solución. No es el objetivo de este artículo entrar en detalles de una arquitectura de Scality Ring; para saber más consultad la documentación de Scality.

Lo que sí vamos a hacer en el artículo de hoy es desplegar un laboratorio plenamente funcional de Scality sobre un entorno virtualizado. Este tipo de despliegues en máquinas virtuales NO están soportados para entornos productivos, pero son ideales para laboratorios de pruebas, puesto que la instalación es más rápida y además no tendremos que dedicar varios servidores completos al entorno.

Aunque el Ring de 3 nodos está soportado, en este laboratorio vamos a desplegar 6 nodos de almacenamiento, más otros 3 nodos dedicados a servir de conectores, para tener un entorno más parecido a uno productivo, ya que el entorno de 3 nodos tiene una serie de limitaciones en las instalaciones multisite y en las configuraciones de protección de la información que se pueden elegir.

Preparación del entorno

Evidentemente lo primero que haremos será desplegar las máquinas virtuales para el entorno. En este caso, usaremos CentOS, pero RedHat también está soportado. Desplegamos una máquina virtual con la siguiente configuración:

  • 2 CPUs
  • 16 Gb de RAM
  • 6 discos: uno para el SO (el de 60GB) , otro para la partición /var (400GB), 1 para el anillo de metadatos (20GB) y 3 para el anillo de datos (40GB).
  • 1 Tarjeta NIC

El motivo de darle tanto espacio a /var es que el software de Scality necesita de un espacio considerable en esta partición y la instalación puede dar problemas si no cuenta con suficiente capacidad.

Nótese que estos requisitos no están ni cerca de los que realmente recomienda Scality para un entorno productivo. Por supuesto esto no nos preocupa al tratarse de un laboratorio, pero no esperéis realizar pruebas de rendimiento sobre este entorno.

Tampoco hay documentación oficial sobre qué configuración usar para un entorno virtual de pruebas, pero con un poco de prueba y error estos son los parámetros que he comprobado que funcionan adecuadamente sin consumir demasiados recursos, así que os recomiendo que imitéis la configuración.

Una vez tenemos nuestra máquina virtual creada, pasamos a instalar el CentOS7. El particionado lo realizaremos a mano siguiendo la documentación de Scality:

Nótese que /var se ha instalado sobre sdb (el disco de 400 GB) y las demás particiones sobre sda (el disco de 60GB). Todas las particiones son XFS, aunque Scality no da recomendaciones específicas sobre qué FS utilizar para el sistema operativo. No particionéis los discos de datos (los 3 discos de 40GB que hemos creado antes) ya que de eso se encargará el propio software de Scality.

Terminamos de instalar y clonamos la máquina virtual

Nuestro anillo consistirá en:

  • 6 nodos de almacenamiento
  • 2 conectores: uno NFS y otro SMB
  • El endpoint para S3
  • El supervisor, que es la máquina virtual desde la cual instalaremos y gestionaremos todo el anillo.

Por comodidad, se recomienda establecer un acceso SSH sin contraseña entre los nodos (https://wiki.centos.org/HowTos/Network/SecuringSSH#head-9c5717fe7f9bb26332c9d67571200f8c1e4324bc).

También es necesario desactivar SELinux (https://linuxize.com/post/how-to-disable-selinux-on-centos-7/).

Por último instalaremos un servicio NTP en cada máquina para que la hora esté perfectamente sincronizada entre ellas.

Una vez tengamos configurada una IP en cada máquina, tengamos acceso por SSH entre ellas, hayamos desactivado SELinux e instalemos un servicio NTP, los prerrequisitos ya estarán cumplidos.

Nota: El servicio de firewall de centOS (firewalld) puede dar problemas con la instalación. Si el siguiente paso muestra un error diciendo que se han encontrado reglas de firewall, desactivadlo. Recomiendo utilizar una red interna entre las máquinas virtuales.

Instalación de Scality Ring

El software de instalación nos irá guiando paso a paso. Lo primero para lanzar el ejecutable es disponer de un fichero de configuración, donde introduciremos toda la información necesaria para la instalación.

El fichero de configuración es un XLSX o un .csv como el siguiente:

ring ,,,,,,,,,,,,,,,,,,,,,,,,,,,,
sizing_version,customer_name,#ring,data_ring_name,meta_ring_name,halo_api_key,S3 endpoint,cos,arc-data,arc-coding,,,,,,,,,,,,,,,,,,,
14.9,Pleiades,2,DATA,META,,10.1.9.225,2,4,2,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,
servers,,,,,,,,,,,,,,,,,,,,,,,,,,,,
data_ip,data_iface,mgmt_ip,mgmt_iface,s3_ip,s3_iface,svsd_ip,svsd_iface,ring_membership,role,minion_id,enclosure,site,#cpu,cpu,ram,#nic,nic_size,#os_disk,os_disk_size,#data_disk,data_disk_size,#raid_card,raid_cache,raid_card_type,#ssd,ssd_size,#ssd_for_s3,ssd_for_s3_size
10.1.9.226,ens192,,,,,,,"DATA,META","storage,elastic,s3,s3_md",node01,VIRTUAL MACHINE,site1,2,CPU (2.0GHz/1 cores),16,1,10,3,60,3,40,0,0,P840ar,1,20,0,0
10.1.9.227,ens192,,,,,,,"DATA,META","storage,elastic,s3,s3_md",node02,VIRTUAL MACHINE,site1,2,CPU (2.0GHz/1 cores),16,1,10,3,60,3,40,0,0,P840ar,1,20,0,0
10.1.9.228,ens192,,,,,,,"DATA,META","storage,elastic,s3,s3_md",node03,VIRTUAL MACHINE,site1,2,CPU (2.0GHz/1 cores),16,1,10,3,60,3,40,0,0,P840ar,1,20,0,0
10.1.9.229,ens192,,,,,,,"DATA,META","storage,elastic,s3,s3_md",node04,VIRTUAL MACHINE,site1,2,CPU (2.0GHz/1 cores),16,1,10,3,60,3,40,0,0,P840ar,1,20,0,0
10.1.9.230,ens192,,,,,,,"DATA,META","storage,elastic,s3,s3_md",node05,VIRTUAL MACHINE,site1,2,CPU (2.0GHz/1 cores),16,1,10,3,60,3,40,0,0,P840ar,1,20,0,0
10.1.9.231,ens192,,,,,,,"DATA,META","storage,elastic",node06,VIRTUAL MACHINE,site1,2,CPU (2.0GHz/1 cores),16,1,10,3,60,3,40,0,0,P840ar,1,20,0,0
10.1.9.224,ens192,,,,,,,"DATA,META","nfs",nfs,VIRTUAL MACHINE,site1,2,CPU (2.0GHz/1 cores),16,1,10,3,60,3,40,0,0,,1,20,0,0
10.1.9.223,ens192,,,,,,,"DATA,META","smb",smb,VIRTUAL MACHINE,site1,2,CPU (2.0GHz/1 cores),16,1,10,3,60,3,40,0,0,,1,20,0,0
10.1.9.222,ens192,,,,,,,"DATA,META","supervisor",supervisor,VIRTUAL MACHINE,site1,2,CPU (2.0GHz/1 cores),16,1,10,3,60,3,40,0,0,,1,20,0,0

Sé que puede intimidar al principio, pero si nos fijamos es bastante sencillo. Tenemos las columnas que nos dicen qué es cada parámetro. Para verlo en forma de filas y columnas recomiendo abrirlo con algún editor como Excel. Sólo hay que modificar:

  • En la primera fila (marcado en verde) indicamos el nombre del cliente, el número de anillos y sus nombres (normalmente querremos 2 anillos, el de datos y el de metadatos). Luego introducimos la dirección donde estará el endpoint para el servicio S3 (tenemos una VM desplegada explícitamente para eso, simplemente aquí debemos poner su IP) y finalmente la protección que queremos darle a los anillos. Elegimos 2 copias para COS y un 4-2 para el Erasure Coding.
  • En las siguientes filas (en azul) debemos describir uno por uno cada nodo que vayamos a desplegar. Primero le damos la IP y en qué interfaz se encuentra y en las siguientes columnas vamos introduciendo a qué anillos pertenece cada nodo. Todos pertenecen tanto al anillo de datos como de metadatos, pero si por ejemplo fuésemos a desplegar diferentes anillos en diferentes sedes entonces sería aquí donde lo declararíamos.
  • Las siguientes columnas nos piden qué servicios va a dar cada nodo: nosotros tenemos 6 nodos que sirven almacenamiento, de los cuales los 5 primeros además también van a correr el servicio de S3. Luego el nodo 7 es el conector de NFS, el 8 el de SMB y el noveno es el propio supervisor desde el cual estamos haciendo la instalación.
  • Las siguientes columnas sirven solamente para indicar el hardware que tiene cada nodo: CPU, RAM, discos, etc.

Ahora ya podemos lanzar la instalación con:

./scality-installer.run --description-file /root/{{platformDescriptionFile}}

Donde el platformDescriptionFile es el fichero que acabamos de configurar. Yo lo tengo en /root/ porque es lo que recomienda la guía, pero puede estar donde quieras.

El instalador nos preguntará cómo conectarse a los nodos: por contraseña, key privada o agente SSH. Una vez lo lances hará unas comprobaciones iniciales.

En mi caso el instalador me ha dado unos warnings sobre la cantidad de RAM disponible en las máquinas. Ya sabíamos que nuestras VMs no tenían las specs mínimas requeridas para un entorno de producción, así que podemos ignorar este aviso. De hecho, el propio instalador da le primer paso por terminado satisfactoriamente, ya que este error no es crítico.

Si este paso fallase, se debe revisar el log en /var/log/scality/setup/ostuning.log para comprobar si hay otros errores que requieran solucionarse. Típicamente, estos errores se deberán a que algunos de los prerrequisitos anteriores no se ha cumplido.

Continuamos con el siguiente paso:

Y vemos el output que nos saca por consola:

En este caso vemos bastantes más errores. El propio instalador nos ha generado un informe que podemos ver abajo, en este caso en: http://10.1.9.222:8000/platformcheck/report-20190826_124756

Nótese que la URL dependerá de la IP de vuestro supervisor y de la fecha en que se ejecutó la instalación.

Podríamos ver todos los errores en el output de la consola, pero es mucho más sencillo visitar el enlace que nos ha generado para verlo por interfaz gráfica.

Al visitar el enlace encontramos un informe con los siguientes errores. Este informe es bastante extenso, pero he recortado sólo las partes que arrojan algún error relevante:

  • No tenemos suficiente RAM en los servidores. Es lo que ya nos ha avisado en el paso anterior. Podemos ignorar este error al tratarse de un laboratorio de pruebas y no requerir rendimiento.
  • Nos falta espacio en /boot y /var. Entiendo que este error se debe a que necesitamos más de 400GiB en /var y tenemos justo esa cifra. Lo mismo para /boot. Como realmente estamos justo en la cantidad necesaria podemos ignorar este error.
  • El instalador no encuentra los 3 discos de datos y en su lugar encuentra más discos de SSD de los necesarios. Para Scality, los discos SSDs son para el anillo de metadatos y los HDD para el anillo de datos. Resulta que como todos nuestros discos son SSD, entonces ve un exceso de discos SSD para metadatos y ausencia de discos HDD para los datos. A continuación veremos cómo solventar este problema.

El problema de los discos es que, al tratarse de una máquina virtual, necesitamos decirle explícitamente al OS si sus discos son HDDs o SSDs.

En primer lugar comprobemos cómo ve el SO cada disco de cada máquina virtual. Este paso puede acelerarse fácilmente utilizando salt. El primer paso del instalador configura por nosotros salt en todos los miembros del anillo, así que solamente tenemos que escribir:

salt ‘*’ cmd.run ‘lsblk –output NAME,SIZE,ROTA’

Y vemos que:

El parámetro ROTA es un booleano que indica si el disco es (o no) rotacional, siendo 1 si y 0 no.

Vemos que marca 0 para todos los discos, lo que indica que el sistema operativo cree que todos son SSDs. Si el valor fuese 1, entonces esos discos serían HDD.

Podemos forzar al SO a creer que son discos HDD modificando el fichero /sys/block/XXX/queue/rotational donde XXX es el disco que queremos modificar.

Dependiendo de vuestro entorno, podéis encontrar el problema opuesto: que el SO piense que todos los discos son HDD y tengáis que forzar a 0 el valor del disco de 20GB. Básicamente, debéis saber qué discos tenéis y para que sirve cada uno. En mi caso, he creado 1 disco de 20 GBs para el anillo de metadatos y 3 de 40GB para el de datos, así que marco como HDDs los discos de datos )los de 40GB) y como SSD el de metadatos (el de 20GB).

Por tanto, como en mi caso el problema es que queremos que detecte los 3 discos de datos como HDD, que en mi caso son sdd, sde y sdf y dejamos como está el disco sdc.

Lo hacemos de la siguiente manera; de nuevo automatizado con salt:

salt ‘*’ cmd.run ‘echo 1 > /sys/block/sdd/queue/rotational’

salt ‘*’ cmd.run ‘echo 1 > /sys/block/sde/queue/rotational’

salt ‘*’ cmd.run ‘echo 1 > /sys/block/sdf/queue/rotational’

Repetimos

salt ‘*’ cmd.run ‘lsblk –output NAME,SIZE,ROTA’

Y vemos que el cambio se ha efectuado correctamente para todos los servidores.

SI volvemos a ejecutar el paso 2 y leemos el nuevo informe que nos genera, obtenemos el mismo informe pero sin el error de que faltan los 3 discos HDD.

Llegados a este punto, sabemos que todos los errores están “controlados”, en tanto que se deben a la configuración no soportada que estamos implementando para nuestro laboratorio. Así pues podemos continuar con el tercer paso, que es el que realmente instalará los anillos:

Y vemos el output del instalador:

The install step finished successfully.

¡Eso es lo que queríamos leer! El siguiente paso es opcional, y sólo necesitamos ejecutarlo si queremos utilizar protocolo S3. NFS y SMB no requieren de ningún paso de instalación adicional, más allá de haber desplegado los conectores correspondientes, cosa que ya hemos hecho porque los definimos en el archivo de configuración (¿recuerdas esos nodos NFS y SMB en las últimas filas del fichero?)

Una vez instalado el servicio S3, ya tenemos un anillo de Scality multiprotocolo, instalado y funcionando.

Creo que con esto ya hemos tenido suficiente por hoy. En la siguiente entrada veremos más en detalle cómo se navega por la interfaz de Scality y cómo se provisiona el almacenamiento para cada protocolo.

Comparte este artículo

Un comentario

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *