Apache Tomcat 8 Proxy Balancer en Debian Jessie

Siguiendo con los Cluster´s y dado que ya hemos hecho uno simplemente de Apache que mejor que darle paso a Tomcat de que se presente de la misma forma!

El esquema sera el mismo que el expuesto para el Cluster Apache Proxy Balancer si no lo has visto te invito a visitar el post y ver los requisitos.

Comencemos!

1.- Instalación y configuración de Servidor Apache2 (Proxy)

Iniciaremos por el servidor Apache que nos hará de proxy para todos las peticiones HTTP:

NOTA!: recuerda que los comandos los coloco con el carácter especial # pero tu has de obviarlo!


apt-get update && apt-get -y upgrade
apt-get install -y apache2 libapache2-mod-jk

Después de esto al acceder desde tu navegador Web a la IP del servidor 192.168.1.30 tendrías que poder la Web por defecto de Apache en la que se te muestra información básica del mismo, algo como lo que sigue:

Ahora configuramos el archivo por defecto de Apache para habilitar el Balancer desde el mismo, editamos el archivo /etc/apache2/sites-enabled/000-default.conf y añadimos las siguientes lineas:


JkMount /status status
JkMount /* loadbalancer

Quedando de esta forma:

Perfecto, ahora vamos a configurar el archivo workers.properties donde se definen los nodos del Cluster Tomcat, en este caso y por defecto el archivo se encuentra en /etc/libapache2-mod-jk/workers.properties, pero crearemos un archivo nuevo y en otra ubicación para evitar complicaciones y le daremos los permisos respectivos:


touch /etc/apache2/workers.properties && chmod 755 /etc/apache2/workers.properties

Ahora lo editamos y añadimos los siguientes parámetros:

worker.list=loadbalancer, status

worker.tomcat1.port=8009
worker.tomcat1.host=192.168.1.41
worker.tomcat1.type=ajp13
worker.tomcat2.port=9009
worker.tomcat2.host=192.168.1.42
worker.tomcat2.type=ajp13

worker.tomcat1.lbfactor=1
worker.tomcat2.lbfactor=1
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=tomcat1,tomcat2

worker.status.type=status

Fijate que has de cambiar el puerto y la IP de cada Worker en cada NODO Tomcat, ajustalo a la configuración IP segun tu caso.

Ahora editamos el archivo /etc/apache2/mods-enabled/jk.conf en el que comentamos la linea que comienza con el parámetro JkWorkersFile y añadimos una nueva con la dirección de nuestro nuevo archivo worker.properties creado anteriormente, tendría que quedarte así:

También es necesario que modifiques los parámetros Location que se encuentran mas abajo con la siguiente configuración:


<Location /jk-status>
# Inside Location we can omit the URL in JkMount
JkMount jk-status
Order allow,deny
#Deny from all
Allow from all
</Location>
<Location /jk-manager>
# Inside Location we can omit the URL in JkMount
JkMount jk-manager
Order allow,deny
#Deny from all
Allow from all
</Location>

Ha de quedar como sigue!

 

2. – Instalacion y configuracion de NODOS Tomcat 8

La siguiente configuración es la misma para ambos servidores NODO, solo los valores en ROJO han de ser ajustados segun el servidor que toque.

Lo primero es instalar Tomcat 8 y unos extras:


apt-get update && apt-get -y upgrade
apt-get install -y tomcat8 tomcat8-admin tomcat8-docs tomcat8-examples

Una ves finalizada la instalación tienes que añadir el usuario de administración, el código es el siguiente y ha de ir dentro de las etiquetas principales, solo has de asignar el usuario y la contraseña que desees.

<role rolename=”manager-gui”/>
<user username=”tomcat” password=”secret” roles=”manager-gui”/>

Ahora simplemente reiniciamos Tomcat 8 en los dos NODOS:


/etc/init.d/tomcat8 restart

Despues puedes comprar el estado de los mismos con:


/etc/init.d/tomcat8 status

Luego de esto puedes acceder a cada servidor desde su IP añadiendo el puerto por defecto 8080 (http://192.168.1.31:8080 y http://192.168.1.32:8080)

Si todo esta correcto verías un mensaje por defecto de Tomcat 8.

Ahora es necesario modificar el archivo /etc/tomcat8/server.xml, busca la linea <connector port=”8009” protocol=”AJP/1.3” redirectport=”8443” /> que se encuentra comentada, simplemente tendrás que descomentar eliminado las etiquetas <!– del principio y –> del final, en el NODO Tomcat 1 no hay problema en dejar el port 8009 como puerto por defecto pero en el NODO Tomcat 2 es necesario que lo cambies por otro, por ejemplo 9009.

A continuación hemos de crear un archivo index.jsp para realizar la prueba del balanceador, en este caso crearemos el directorio demo con el siguiente comando en ambos servidores Tomcat:


mkdir /var/lib/tomcat8/webapps/demo

Ahora crearemos dentro de dicho directorio el archivo index.jsp (mkdir /var/lib/tomcat8/webapps/demo/index.jsp) con el siguiente contenido:

<!DOCTYPE html>
<html>
<head>
<title>Hello Tomcat</title>
</head>
<body>
<h1>Welcome to Tomcat Server 1</h1>
<h3>Hello World!</h3>
</body>
</html>

Ten en cuenta cambiar el numero en rojo por 2 para el caso del index.jsp del NODO Tomcat 8 192.168.1.32.

Finalmente reiniciamos los servicios en los 3 servidores:

Apache (192.168.1.30)


/etc/init.d/apache2 restart

Tomcat 1(192.168.1.31)


/etc/init.d/tomcat8 restart

Tomcat 2 (192.168.1.32)


/etc/init.d/tomcat8 restart

Ahora accediendo a la IP del Apache Proxy http://192.168.1.30/demo podremos ver el mensaje Welcome to Tomcat 1 o Welcome to Tomcat 2 variando cada ves que actualicemos la Web ya que el Apache Proxy ira repartiendo o balanceando la carga de solicitudes HTTP que se realizan al servidor entre ambos NODOS Tomcat 8.

Accediendo a http://192.168.1.30/status podrás ver el estado actual de NODOS Tomcat que se encuentran operativos, estadísticas entre otra información valiosa así como realizar algunos cambios en los parámetros de configuración!

Eso es todo! espero que os sirva de ayuda, hasta la próxima!

MYSQL Cluster 7.5.5 en Ubuntu 16.04.2

Hoy quiero continuar con el tema de los cluster´s y en este caso le ha tocado el turno a MySQL, esa famosa base de datos en la que muchos nos hemos apoyado en nuestros proyectos. Os comentare como hacer un cluster con cuatro servidores en los que definiremos 1 Manager, 2 Data Nodes y 1 MySQL Node, esto nos servirá para tener un entorno de base de datos con MySQL redundado y de alta disponibilidad, muchos pensaran: ¿Porque no hacerlo con Heartbeat y DRBD?, si también se puede sin problemas, pero esta ves quiero comentar como hacerlo con las herramientas que nos proporciona el mismo fabricante o desarrollador con la herramienta MySQL-Cluster en su versión reciente a día de hoy 7.5.5.

Como servidores usaremos Ubuntu en su versión actual LTS a día de hoy 16.04.2, no obstante se puede hacer sin ningún problema de la misma forma en Debian obviando el prefijo “sudo” en cada comando siempre que entremos como root a nuestros Debian, no obstante hoy lo haré todo bajo Ubuntu.

Requisitos:

  1. Cuatro (4) Maquinas Virtuales con Ubuntu Server 16.04.2 previamente instalado. (el proceso de instalación de Ubuntu es algo que no tocare en esta ocasión, quizás en otro Post), podéis usar VirtualBox, VMware, Hyper-V o con lo que os sintáis mas cómodos trabajando.
  2. Visibilidad de red entre las 4 maquinas virtuales, a efectos prácticos usaremos la red 192.168.1.0/24.
  3. El paquete de MySQL-Cluster (mysql-cluster-gpl-7.5.5-linux-glibc2.5-i686.tar) en su versión 7.5.5 en su versión Generic Linux en formato .TAR que podemos descargar de la Web oficial https://dev.mysql.com/downloads/cluster/
  4. Tiempo y ganas!

Manos a la obra

Os expongo a continuación como debería quedar el direccionamiento IP:

Nodo Dirección IP
Nodo de administración (MGM) 192.168.1.110
Nodo de datos (NDBD) “A” 192.168.1.111
Nodo de datos (NDBD) “B” 192.168.1.112
Nodo MySQL server (SQL) 192.168.1.113

Y para que os hagáis una idea mas gráfica la siguiente imagen:

Paso 1 – Instalación y configuración del Nodo de Administración (MGM).

Nos conectamos a la Shell de dicho servidor, tomando en cuenta que el servidor es un Debian y nos conectamos con el usuario principal con el que fue instalado deberíamos de estar en la ubicación /home/NOMBREDEUSUARIO donde NOMBREDEUSUARIO sera el nombre que hayamos asignado a dicho user, en mi caso es “xnosx” con lo que el directorio de mi usuario es /home/xnosx/.

En mi caso he descargado el archivo mysql-cluster-gpl-7.5.5-linux-glibc2.5-i686.tar de la Web de MySQL vía HTTP con lo que me he conectado al servidor MGM via WIN-SCP y cargado el archivo mi directorio home /home/xnosx/mysql-cluster-gpl-7.5.5-linux-glibc2.5-i686.tar y estando en mi directorio de usuario /home/xnosx hacemos los siguientes comandos-pasos.

NOTA: si quieres saber en que directorio te encuentras ejecuta el comando:

# pwd

Descomprimimos el archivo .TAR:

# sudo tar -xvzf mysql-cluster-gpl-7.5.5-linux-glibc2.5-i686.tar

Esto creara el directorio /home/xnosx/mysql-cluster-gpl-7.5.5-linux-glibc2.5-i686, ahora re-nombramos dicho directorio a simplemente mysql.

# sudo mv mysql-cluster-gpl-7.5.5-linux-glibc2.5-i686 mysql

Ahora entramos al directorio mysql copiaremos el contenido de los ficheros que comienzan por ndb_mgm del directorio bin y los pondremos en /usr/local/bin que es el directorio de los binarios de Linux y les añadiremos permisos de ejecución con los siguientes 3 comandos.

# cd mysql
 # cp bin/ndb_mgm* /usr/local/bin/
 # chmod +x /usr/local/bin/ndb_mgm*

Ahora debemos configurar este nodo de administración (MGM) creamos el directorio “mysql-cluster” dentro de “/var/lib” y dentro de “mysql-cluster” añadimos el fichero “config.ini” con la configuración que sigue:

[ndbd default]
NoOfReplicas=2
DataMemory=80M
IndexMemory=18M

[mysqld default]

[ndb_mgmd default]

[tcp default]

# Cluster Control / Management node
[ndb_mgmd]
hostname=192.168.1.110

# Data Node 1
[ndbd]
hostname=192.168.1.111
DataDir= /var/lib/mysql-cluster

# Data Node 1
[ndbd]
HostName=192.168.1.112
DataDir=/var/lib/mysql-cluster

# SQL Node
[mysqld]
hostname=192.168.1.113

# If you to add new SQL Node
[mysqld]

Ahora iniciaremos el nodo de administración MGM con el siguiente comando:

# sudo ndb_mgmd -f /var/lib/mysql-cluster/config.ini --reload --configdir=/var/lib/mysql-cluster/

NOTA: noten que he he puesto el “–reload” en negritas y rojo, esto es porque sin este parámetro en el comando os dará error!

Si no nos da ningún error en principio el NODO MGM ya esta en marcha pero si reiniciamos el servidor no levantara el servicio por si solo, así que debemos añadir dicha linea al archivo /etc/rc.local, de esta forma el sistema levantara el servicio en el momento en que este arrancando la maquina virtual!

# sudo echo 'ndb_mgmd -f /var/lib/mysql-cluster/config.ini --reload --configdir=/var/lib/mysql-cluster/' >> /etc/rc.local

Ahora tenemos que comprobar que el servicio esta levantado y funcionando, lo haremos con un “netstat -plntu” y luego entraremos con el comando “ndb_mgm” a la consola del mysql-cluster y una ves dentro con un “show” podremos ver el estado de las conexiones donde se vera que el nodo MGM se encuentra levantado y conectado como se muestra en la imagen a continuación:


Paso 2 – Instalación y configuración de los NODOS de datos (DATA-NODE).

Ahora vamos con los DATA NODE´S, la siguiente configuración ha de hacerse exactamente igual en ambos equipos con IP´s 192.168.1.111 y 192.168.1.112 ya que ambos serán por así decirlo una replica y estarán enlazados hacia el MGM, con lo que la misma configuración que os expongo acá ha de hacerse exactamente de la misma forma en ambos equipos, comencemos.

Como actualmente ya tenemos el paquete .TAR de mysql-cluster en el MGM y se supone que desde el MGM podemos ver el resto de servidores a través de la red, podríamos cargar este paquete a los dos servidores NODO con un simple SCP, asi que accedemos a nuestro servidor MGM y estando en el mismo directorio en el que se encuentra el paquete .TAR hacemos los siguientes comandos reemplazando la palabra USUARIO de cada comando con los respectivos nombres de usuario que hayan creado en estos dos servidores nodos:

# sudo scp mysql-cluster-gpl-7.5.5-linux-glibc2.5-i686.tar USUARIO@192.168.1.111:/home/USUARIO/
# sudo scp mysql-cluster-gpl-7.5.5-linux-glibc2.5-i686.tar USUARIO@192.168.1.112:/home/USUARIO/

Una ves cargados los paquetes a los dos servidores NODO comenzamos la instalación-configuración, primero debemos instalar una dependencia con el siguiente comando:

# sudo apt-get update && sudo apt-get install libaio1

Una ves finalizada la instalación de la dependencia debemos añadir el grupo “mysql” y el usuario “mysql” ligado al grupo que hemos creado, lo hacemos con el siguiente comando:

# sudo groupadd mysql && sudo useradd -g mysql mysql

Ahora teniendo esta parte podemos comenzar la instalación del MySQL-Cluster, como con el MGM descomprimiremos el paquete .TAR, re-nombramos el directorio generado por simplemente “mysql” y copiamos ese directorio “mysql” al directorio “/usr/local/”:

# sudo tar -xvzf mysql-cluster-gpl-7.5.5-linux-glibc2.5-i686.tar
# sudo mv mysql-cluster-gpl-7.5.5-linux-glibc2.5-i686/ mysql/
# sudo mv mysql /usr/local/

Ahora accedemos a dicho directorio “/usr/local/mysql”:

# cd /usr/local/mysql

Ahora debemos crear las bases de datos del sistema, para ello ejecutamos el siguiente comando:

# sudo bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

NOTA: al finalizar el comando nos devolverá una linea como esta “A temporary password is generated for root@localhost: ********” indicando la contraseña que se ha generado automáticamente para root respecto a MySQL, apuntarla en algún sitio porque luego os hará falta!

Si no devuelve ningun error proseguimos con la copia del ejecutable al directorio “/etc/init.d” y lo habilitamos:

# sudo cp support-files/mysql.server /etc/init.d/mysql
# sudo systemctl enable mysql

Ahora necesitamos mover todos los comandos binarios de MySQL al lugar que corresponden y crear el respectivo enlace simbólico y eliminar del directorio actual el directorio “bin”:

# sudo mv bin/* /usr/local/bin
# sudo rm -rf bin/
# sudo ln -s /usr/local/bin /usr/local/mysql

Ahora cambiamos los permisos y propietario del directorio “mysql” para que el propietario sea root y el grupo mysql y asignamos como propietario al directorio data a mysql:

# sudo chown -R root:mysql .
# sudo chown -R mysql data

Ahora crearemos el archivo de configuración “/etc/my.cnf” en ambos nodos con exactamente la misma configuración que expongo a continuación:

# MySQL Config
[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
user=mysql

# Run ndb storage engine
ndbcluster
# IP address management node
ndb-connectstring=192.168.1.110

[mysql_cluster]
# IP address management node
ndb-connectstring=192.168.1.110

# MySQL Pid and Log
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Ahora debemos crear los directorios de data de ambos nodos y asignar como propietario a “mysql”:

# sudo mkdir -p /var/lib/mysql-cluster/
# sudo chown -R mysql /var/lib/mysql-cluster

Ahora solo nos queda inicializar ambos nodos con los siguientes comandos:

# sudo ndbd --initial
# sudo systemctl start mysql

La consola nos devolverá un mensaje similar a “– Angel connected to ”192.168.1.110:1186″ y “– Angel allocated nodeid: 3”, esto quiere decir que el nodo se ha conectado al MGM y se encuentra operativo, podemos comprobarlo como con el MGM con los comandos “netstat -plntu” y desde el MGM hacer un “ndb_mgm” y luego un “show” donde veremos los nodos ya conectados.

Ahora teniendo toda esta parte debemos cambiar el password de root que se ha generado por el que nosotros deseemos en dicho nodo, con el siguiente comando se nos solicitara el nuevo password y la confirmación del mismo y se nos harán una serie de preguntas a las que responderemos según nuestros criterios y requerimientos:

# sudo mysql_secure_installation

Ahora una ves asignada la nueva contraseña ya podemos acceder desde la consola de cualquiera de los dos NODOS a la consola de MySQL para comprobar que todo funciona correctamente:

# sudo mysql -u root -p

Paso 3 – Instalación y configuración del nodo SQL (SQL-NODE).

En este ultimo servidor que sera el nodo desde el cual accederemos a los datos de los DATA-NODE que acabamos de configurar, el proceso es idéntico y solo cambia en algunos pasos.

Debemos instalar la dependencia con el siguiente comando:

# sudo apt-get update && sudo apt-get install libaio1

Una ves finalizada la instalacion de la dependencia debemos añadir el grupo “mysql” y el usuario “mysql” ligado al grupo que hemos creado, lo hacemos con el siguiente comando:

# sudo groupadd mysql && sudo useradd -g mysql mysql

Enviamos el archivo .TAR a este NODO desde el MGM como hicimos con los DATA-NODE:

# sudo scp mysql-cluster-gpl-7.5.5-linux-glibc2.5-i686.tar USUARIO@192.168.1.113:/home/USUARIO/

Ahora teniendo esta parte podemos comenzar la instalacion del MySQL-Cluster, descomprimiremos el paquete .TAR, re-nombramos el directorio generado por simplemente “mysql” y copiamos ese directorio “mysql” al directorio “/usr/local/”:

# sudo tar -xvzf mysql-cluster-gpl-7.5.5-linux-glibc2.5-i686.tar
# sudo mv mysql-cluster-gpl-7.5.5-linux-glibc2.5-i686/ mysql/
# sudo mv mysql /usr/local/

Lanzamos el script

# sudo bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# sudo mv bin/* /usr/local/bin
# sudo rm -rf bin/
# sudo ln -s /usr/local/bin /usr/local/mysql

Ahora cambiamos los permisos y propietario del directorio “mysql” para que el propietario sea root y el grupo mysql y asignamos como propietario al directorio data a mysql:

# sudo chown -R root:mysql .
# sudo chown -R mysql data

Ahora crearemos el archivo de configuración “/etc/my.cnf” en ambos nodos con exactamente la misma configuración que expongo a continuación:

# MySQL Config
[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
user=mysql

# Run ndb storage engine
ndbcluster
# IP address management node
ndb-connectstring=192.168.1.110

[mysql_cluster]
# IP address management node
ndb-connectstring=192.168.1.110

# MySQL Pid and Log
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Inicializamos MySQL

# sudo systectl start mysql

Y finalmente cambiamos el password de root autogenerado:

# sudo mysql_secure_installation

Ahora tenemos que añadir el comando systemctl start mysql al archivo “/etc/rc.local” para que el servicio arranque de manera automática en el momento en que iniciamos nuestro servidor y ya tenemos esta parte, incluso ya podríamos ver desde la consola del MGM que el nodo se encuentra conectado y enlazado.


Paso 4 – Pruebas!

Ahora, desde la consola de nuestro SQL-NODE podemos conectarnos a la consola de MySQL y crear una base de datos de prueba:

# mysql -u root -p

Añadimos la contraseña nueva que hemos asignado a root anteriormente y estamos dentro de la CLI de MySQL, ahora con los siguientes dos comandos podremos ver las bases de datos que se encuentran actualmente, crearemos una nueva base de datos y luego volveremos a listar las bases de datos para comprobar así que la nueva base de datos se ha creado satisfactoriamente:

# show databases;
# create database db_sqlnode;
# show databases;

Con esto tendríamos que ver la nueva base de datos creada satisfactoriamente, si repetimos esta misma operación en el DATA-NODE principal veremos que allí también se encuentra creada la base de datos nueva, y si reiniciamos el DATA-NODE principal el DATA-NODE que esta como secundario sincronizaría dicha base de datos nueva manteniendo así la data de forma homogénea en todos los servidores.

Con esto ya tenemos nuestro cluster de MySQL con alta disponibilidad!