sábado, 4 de febrero de 2017

GlusterFS en un conjunto de nodos cluster Orange Pi

Para nuestro cluster de laboratorio (basado en placas Orange Pi Plus 2E) vamos a montar un conjunto de nodos tal que tengamos un sistema de ficheros distribuido como alternativa al HDFS (de Hadoop) para nuestra plataforma de BigData.


Para este caso, montaremos el cada nodo un brick de GlusterFS tal que en los N-nodos tengamos un sistema de almacenamiento distribuido.

Para el almacenamiento, en este caso, hemos añadido un USB de calidad (un Kingston DataTraveler 3.1 de 64Gb) en cada uno de los nodos, el cual repartiremos sus 64Gb, en 16G locales y el resto en un brick por nodo para la red Gluster.

Instalación de software necesario
Como podreis recordad de las entradas previas, el sistema operativo es Armbian (basado en Debian) en cada uno de los nodos del cluster, por lo que vamos empezar a cargar los paquetes necesarios. Vamos a utilizar también el sistema LVM, de gestión de volúmenes lógicos para poder permitir a corto plazo aumentar los discos (Pendrives), tanto para su uso local como brick dentro del sistema glusterFS.

sudo aptitude install lvm2 xfsprogs glusterfs-server

Paramos el servicio.
sudo service glusterfs-server stop

Creación del pendrive como tipo LVM
Opción 1: Uso de fdisk
sudo fdisk /dev/sda
Opcion: g
Opcion: n
Opcion: t, 23
Opcion: w

Opción 2: Uso de parted
sudo parted -s -- /dev/sda mktable gpt
sudo parted -s -- /dev/sda mkpart primary 2048s 100%
sudo parted -s -- /dev/sda set 1 lvm on

Añadir LVM
sudo pvcreate /dev/sda1
sudo pvdisplay


sudo vgcreate vgpool /dev/sda1
sudo vgdisplay

Si quisiéramos utilizar todo el espacio del pendrive como brick, podemos lanzar la sentencia siguiente:
sudo lvcreate -l 100%VG -n gbrick1 vgpool

No obstante, vamos a repartir los 64Gb teóricos del pendrive de la siguiente manera, 16 locales y el resto al brick para su uso en GlusterFS.
sudo lvcreate -L 41G -n gbrick1 vgpool
sudo lvcreate -L 16G -n lvlocal vgpool

Para comprobar la distribución y que tenemos el volumen lógico como queremos, ejecutamos la siguiente instrucción:
sudo lvdisplay

Formateado
Debido a que en el kernel actual (3.4.113) de Armbian en su versión Legacy no tiene soporte de XFS (el sistema de ficheros recomendado para glusterFS)

sudo mkfs.xfs -i size=512 /dev/vgpool/gbrick1
o
sudo mkfs.ext4 /dev/vgpool/gbrick1

Mientras que para la parte del disco (pendrive) que usaremos como 100% local para varios usos, será:
sudo mkfs.ext4 /dev/vgpool/lvlocal

Chequeos varios
Un conjunto de pasos para chequear como lo estamos haciendo.
sudo lvscan
sudo vgscan
sudo pvscan
sudo lvs

Creación de carpetas persistentes e instrucciones finales.
sudo blkid -c /dev/null
sudo mkdir -p /var/lib/gvol0
sudo mount /dev/vgpool/gbrick1 /var/lib/gvol0 
sudo mkdir /media/local
sudo mount /dev/vgpool/lvlocal /media/local

Vamos a configurar los volúmenes para que en el arranque esten disponibles.
sudo nano /etc/fstab

Añadimos las lineas siguientes:
# USB_INFERIOR (LVM)
/dev/vgpool/gbrick1 /var/lib/gvol0 ext4 defaults,noatime,nodiratime 0 0
/dev/vgpool/lvlocal /media/local ext4 defaults,noatime,nodiratime 0 0

Pasos a realizar en cada uno de los nodos
Todos los pasos anteriores se debe hacer en cada nodo, tal que repartamos a local y gluster (brick) el/los pendrives que queramos añadir a la placa Orange Pi, y mediante el uso de volúmenes lógicos lo tendremos escalable por si vamos añadiendo más pendrives.

Para cada nodo, crearemos un brick con un número diferente, a fin de que sean facilmente diferenciables.
cd /var/lib/gvol0/

En CL01
sudo mkdir /var/lib/gvol0/brick1

En CL02
sudo mkdir /var/lib/gvol0/brick2

En CL03
sudo mkdir /var/lib/gvol0/brick3

Borrar LVM
Esto es sólo por si queremos empezar de cero otra vez, así que, sólo en caso necesario.
umount /var/lib/gvol0 
lvremove /dev/vgpool/gbrick1
vgremove vgpool
pvremove /dev/sda1

Iniciar glusterFS
Hasta lo que hemos leído en la presente entrada es la preparación de los discos (pendrives) y usar el gestor de LVM para fácilmente sea ampliable. Ahora es momento de GlusterFS y realizar el objetivo principal, tener un sistema de varios servidores (nodo) con un sistema de ficheros distribuido.

En cada uno de los nodos iniciamos el servicio.
sudo service glusterfs-server start

En CL01
sudo gluster peer probe cl02
sudo gluster peer probe cl03
sudo gluster peer status

En CL02
sudo gluster peer probe cl01
sudo gluster peer probe cl03
sudo gluster peer status

En CL03
sudo gluster peer probe cl01
sudo gluster peer probe cl02
sudo gluster peer status

Chequeamos por ejemplo en el primer nodo.
sudo gluster peer status
sudo gluster pool list

En el caso en cuestión para la plataforma BigData que estoy montando no existirán réplicas sino que será un volumen con el tamaño total de los bricks, ya que no nos interesa (por ahora) tener un sistema de réplicas de la información.

sudo gluster volume create gv0 transport tcp \
cl01:/var/lib/gvol0/brick1 \
cl02:/var/lib/gvol0/brick2

Configuración del volumen creado.
sudo gluster volume set gv0 auth.allow 192.168.1.*
sudo gluster volume set gv0 nfs.disable off
sudo gluster volume set gv0 nfs.addr-namelookup off
sudo gluster volume set gv0 nfs.export-volumes on
sudo gluster volume set gv0 nfs.rpc-auth-allow 192.168.1.*
sudo gluster volume start gv0 

Añadir un nuevo brick a GlusterFS
sudo gluster volume add-brick gv0 cl03:/var/lib/gvol0/brick3

Rebalanzar tras añadir un brick en Gluster FS
sudo gluster volume rebalance gv0 start

Información del volumen.
sudo gluster volume info gv0

Montar el volumen GlusterFS
Para montar el volumen en un nodo y poder utilizar el sistema de ficheros distribuido al completo, podemos realizarlo de varias maneras:

Suponemos que estamos en el primer nodo del cluster (CL01)

en /etc/fstab:
cl01:/gv0 /media/glusterfs glusterfs defaults,_netdev 0 0

o si queremos con detalle en el arranque.
cl01:/gv0 /media/glusterfs glusterfs defaults,_netdev,log-level=WARNING,log-file=/var/log/gluster.log 0 0

de forma manual:
sudo mkdir /media/glusterfs
sudo mount -t glusterfs cl01:/gv0 /media/glusterfs

Comprobamos que ya tenemos acceso
df -h /media/glusterfs/
Y también desde cualquier nodo o ordenador podemos montar el sistema GlusterFS para poder acceder a su contenido, como podemos ver en la siguiente captura

Así pues, sea un nodo gluster de la red cluster o cualquier nodo, se puede acceder al sistema de archivos distribuido.

Entradas relacionadas:



sábado, 21 de enero de 2017

Configuración básica nodos cluster Orange Pi

En la entrada anterior vimos el cluster que estamos construyendo sobre las placas OrangePi (en específico la Plus2E). En esta entrada empezaremos con la instalación básica de cualquier nodo que forme parte de nuestro Bramble (como dicen en el mundillo de la agrupación de varias Raspberry Pi en cluster)

Recordad que todo lo que se explica funciona en cualquier tipo de placas de este estilo, sean Orange Pi, Raspberry Pi, Banana Pi, etc. en cualquiera de sus modelos.

Primeros pasos
Instalación del sistema operativo armbiam (podéis ver como transferir una imágen a la SD/microSD en este enlace).
  1. Arrancar por SD/microSD
  2. Cambiar password (la contraseña por defecto en armbian es 1234)
Transferir como en el caso de la OrangePi Plus2E el sistema operativo a la eMMC de la placa, con lo que nos ahorraremos tener que utilizar la tarjeta SD para el sistema operativo, y así optimizar los costes en cada nodo (sólo una microSD será necesaria para tener el SO armbian y poder copiarlo a cada una de las placas/nodos que formen parte del cluster)

Para tal caso utilizaremos la instrucción siguiente que nos facilitará el trabajo.
sudo nand-sata-install

Sacamos las SD/microSD y arrancamos ya por eMMC.


Configuración de red
Para la gestión de red lanzaremos un conjunto de instrucciones que podemos ver a continuación:

sudo nano /etc/network/interfaces
# En cada nodo será necesario modificar el campo address
iface eth0 inet static
address 192.168.1.101
netmask 255.255.255.0
gateway 192.168.1.1

Añadir la lista de los nodos planificados en el fichero de hosts
sudo nano /etc/hosts
Añadir las lineas:
192.168.1.100 bpi0
192.168.1.101 cl01
192.168.1.102 cl02
192.168.1.103 cl03
192.168.1.104 cl04
192.168.1.105 cl05
192.168.1.106 cl06
192.168.1.107 cl07
192.168.1.108 cl08
192.168.1.109 cl09
192.168.1.110 cl10

En mi caso en particular, el primer nodo (x.y.z.100 / bpi0) es un LoginNode utilizando una BananaPI M1. Direcciones IP, nombre de Nodos, como veáis, en algunos lugares utilizan como nombres la siguiente nomenclatura: dcXXrYYnZZ (siendo dc:DataCenter, r:Rack, n:Nodo)

Y dar el nombre
sudo nano /etc/hostname
donde en el primer nodo seria:
cl01

Todos los pasos indicados previamente deben de hacer para cada uno de los nodos.

Seguridad SSH
Para la configuración de los permisos de cada nodo, se muestran a continuación un conjunto de instrucciones para proteger y intercomunicar cada uno de estos.

sudo usermod -a -G sudo pi

sudo nano /etc/sudoers
Añadir linea:
pi ALL=(ALL) NOPASSWD: ALL

sudo nano /etc/hosts.deny
Añadir la linea:
ALL: ALL

sudo nano /etc/hosts.allow
Añadir las lineas:
ALL: localhost
ALL: 192.168.1.0/255.255.255.0

Borrar las SSH Keys del nodo que por defecto vienen en la distribución de debian / raspbian / armbian.
sudo rm /etc/ssh/ssh_host_*

Recrear las claves
sudo dpkg-reconfigure openssh-server

Vamos a proteger el servidor de SSH con algunas instrucciones más:
sudo nano /etc/ssh/sshd_config
Añadir las lineas:
UseDNS no
ClientAliveInterval 30
ClientAliveCountMax 6
AllowUsers pi

Ahora, llegados a este punto, reiniciamos el nodo y acabaremos de configurar los últimos pasos.

Configuraciones del entorno SSH
Para cada nodo, será necesario generar las claves SSH del usuario.
cd ~
mkdir bin
mkdir ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t rsa -C pi@cl01
cd .ssh
cat id_rsa.pub >> authorized_keys

Para probar que todo funciona:
ssh localhost

NOTA: Recordad que es necesario realizarlo en cada nodo cambiando el valor del parámetro -C de la instrucción ssh-keygen poniendo el usuario y nombre del nodo local.

Actualizar el entorno
Actualizar las librerías y paquetes, mediante las instrucciones siguientes:
sudo aptitude update
sudo aptitude upgrade

Cambiar idioma/hora
sudo dpkg-reconfigure locales
sudo dpkg-reconfigure tzdata

Instalación Java
sudo aptitude install openjdk-8-jdk

En el caso de la OrangePi podemos hacer un par de cosas interesantes:
  1. Configurar el botón de apagado (ver el siguiente enlace)
  2. Desactivar la gráfica hdmi (sudo h3consumption -g off)
Desactivar IP6
Este paso es totalmente opcional, pero reduciremos tráfico innecesario y consumo al desactivar el protocolo IP6 ya que nuestros nodos que forman parte del cluster se encuentran en una red local.

Un par de instrucciones para ver el tráfico activo

sudo netstat -tulpn
sudo ifconfig | grep inet6

sudo nano /etc/sysctl.conf
y añadimos las siguientes lineas:
# IPv6 disabled
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

Recargamos y comprobamos:
sudo sysctl -p
sudo ifconfig

Y las últimas instruccciones:
sudo nano /etc/hosts
comentamos las lineas de IP6
# comment these IPv6 hosts
# ::1     ip6-localhost ip6-loopback
# fe00::0 ip6-localnet
# ff00::0 ip6-mcastprefix
# ff02::1 ip6-allnodes
# ff02::2 ip6-allrouters

Permitiendo sólo flujo IP4 en SSH
sudo nano /etc/ssh/sshd_config
añadir solo 
AddressFamily inet

Permitiendo sólo flujo IP4 en el servicio de hora
sudo nano /etc/default/ntp
siendo el texto
NTPD_OPTS='-4 -g'

Y por ahora suficiente, hemos visto varios pasos para tener la configuración básica mínima en el nodo. En las siguientes entradas de este blog se explicarán de forma detallada los servicios y aplicaciones, y algunas configuraciones básicas que faltan y de vital importancia para la intercomunicación de los nodos del cluster.


Entradas relacionadas:



viernes, 6 de enero de 2017

Creación de un cluster mediante el uso de la Orange Pi

Con esta entrada en el blog se empieza la instalación y puesta en marcha de un cluster de placas SoC de N-cores para pruebas de concepto de productos de BigData, en este caso sobre un cluster formado por una combinación de BananaPi  y Orange Pi.


Definición del Cluster
Para las pruebas de nodos, maestros, monitores, etc. de un conjunto de solución BigData, se ha seleccionado los siguientes componentes para la creación de cluster:

Login Node / Monitor Node / Master Node
  • BananaPi M1 (A20 DualCore,  RAM: 1Gb DDR3, Red: 1000Mbits)
  • USB DataTraveler 64Gb para datos
  • SO: Armbian para sun7i (instalado en la SD)
  • Coste aprox, por nodo: 65 EUR
  • Nombre nodo de ahora en adelante: bpi0

Data Node / Working Node
  • Orange Pi Plus 2E (H3 QuadCore, RAM: 2Gb DDR3, Red: 1000Mbits, 16eMMC)
  • USB DataTraveler 64Gb para datos
  • SO: Armbian para sun8i (instalado en la eMMC interna)
  • Coste aprox. por nodo: 80 EUR
  • Nombre de los 3 nodos de ahora en adelante: cl01, cl02, cl03


Se utiliza (de momento) como Login node una placa del fabricante Sinovoip, en específico la Banana Pi M1 (sinceramente la tenia abandonada y así le doy un uso de nodo de entrada y monitorización). Quizás a la larga la sustituiré, pero dado que es un DualCore con 1 Gb de RAM y 1Gb de red cumple perfectamente para el uso indicado.

Se utilizan como Data node / Working Node un conjunto de 3 placas del fabricante Xulong, en especifico la Orange Pi Plus 2E por su capacidad en RAM, su QuadCore, su consumo, conectividad de 1Gb y precio razonable.

El coste total del cluster ronda en unos 340EUR, ya que se ha añadido a las cuatro placas Pi, una fuente de 30W, un cable de alimentación, un cable splitter de alimentación a 8 salidas (libres 4, para añadir hasta cuatro nodos más), conectores de alimentación (jacks), disipadores pasivos, separadores y latiguillos de red.

Observaciones
Estas placas puede ser substituidas por ejemplo con la Raspberry Pi 3, ya que por velocidad, núcleos de CPU y RAM pueden ser equivalentes en prestaciones.

Las próximas entradas en el blog se basarán en la instalación, puesta en marcha y pruebas de diferentes aplicaciones para usar dentro de un posible escenario/ecosistema de Big Data y similares.


Un ejemplo de lo que vendrá
Para muestra, la herramienta Ganglia para el monitoring de las piezas del cluster.

Detalle de actividad de cada uno de los nodos.

Detalle de actividad del conjunto del cluster.

Enlaces relacionados: