Alta disponibilidad en FreeBSD: La IP de servicio, parte 2

En esta segunda parte del artículo configuraremos la dirección IP de servicio.

Configurando la IP de servicio

Como se mencionó en la primera parte, utilizando el módulo del kernel “carp” -que implementa el protocolo del mismo nombre-, haremos que una dirección IP esté asignada a dos nodos, de forma que si uno de ellos falla, el otro siga respondiendo las solicitudes.

La configuración consiste en una línea extra en el fichero /etc/rc.conf de cada nodo.

Para el primer nodo, ejecutaremos lo siguiente:

Para el segundo nodo, ejecutaremos:

Analicemos esta línea de forma genérica:

La primera línea indica el uso de un alias de IP. Esto quiere decir que la NIC ’em0′ tendrá una IP adicional a la que ya tuviera configurada como IP principal (192.0.2.5/24 en nuestro caso). Todo lo que va entrecomillado son los parámetros que tomará este alias.

La segunda línea establece que vamos a utilizar la família “inet” (IPv4), y, si no se especifica, es el valor por defecto. Otra opción es “inet6” para el protocolo IPv6.

En la tercera línea se establece el identificador de host virtual. Cada dirección IP de servicio debe tener el mismo valor en todos los nodos donde se configure. Si tuvieramos más direcciones de servicio, este campo debe cambiar. Los valores permitidos son de 1 a 255.

La cuarta línea establece la contraseña de autenticación con la que se identificaran en un “vhid” los nodos participantes. Esta clave no establece ningún tipo de cifrado.

En la quinta línea se establece la dirección IP que establecemos cono dirección IP de servicio.

Por último, y solo para el nodo secundario, se fija el valor de “advskew” a 100. Este valor introduce un retraso a la hora de que el nodo se “anuncie” como nodo de CARP, modificando su orden de procedencia; y es útil cuando queremos forzar un nodo primario automáticamente o hay multiples nodos secundarios.

En este momento debe aplicarse el cambio en cada nodo.

Para el primer nodo ejecutaremos:

Y, en el segundo, ejecutaremos:

Podemos verificar el correcto arranque funcionamiento de varias formas.

Mediante el comando ifconfig em0 en cada nodo:

Si observamos la última línea, en el primer servidor indica “CARP: MASTER” y, en el segundo, “CARP: BACKUP”.

Otra opción, donde además veremos más información como la elección del nodo “MASTER”, transiciones de estado, etc., es el fichero /var/log/messages de cada nodo:

Verificando el funcionamiento

Con la configuración ya realizada y activada y los nodos definidos en maestro y esclavo, llega el momento de hacer las pruebas necesarias para verificar que, realmente, el comportamiento es el adecuado.

Utilizaremos el comando “ping” desde algún sistema en la misma subred 192.0.2.100/24 para verificar que la dirección IP de servicio está disponible.

La primera prueba real que haremos será verificar qué ocurre cuando el nodo activo deja de estar disponible por reinicio o perdida de corriente eléctrica; y la segunda consistirá en simular un fallo en la interfaz de red.

En caso de reinicio del nodo activo

Conectados a ambos nodos, reiniciaremos el maestro y en el secundario observaremos qué ocurre:

El nodo esclavo pasa a ser el maestro, y la salida del comando ifconfig así lo muestra:

La dirección IP de servicio seguirá siendo accesible desde los demás sistemas de la red. La siguiente salida muestra qué percepción ha tenido un cliente durante el proceso desde que falló el primer nodo hasta que el secundario tomó el control y comenzó a responder las peticiones:

Como puede observarse, la dirección IP virtual no ha estado disponible durante unos 3 segundos.

En caso de pérdida de la interfaz de red física

Es posible simular la pérdida de una interfaz de red mediante el siguiente comando:

Podremos comprobar que el nodo esclavo detecta dicho fallo en el maestro:

Al igual que en el caso anterior, el segundo servidor pasa a tener estado MASTER :

El estado actual del servicio sería como muestra la siguiente imagen:

IP de servicio compartida - Servidor servidor-1 en fallo - Español
En caso de deshabilitar la interfaz de red en el segundo nodo mediante

Al no tener ninguna interfaz habilitada (ni en el primer nodo ni en el segundo), el servicio dejaría de ser prestado.

IP de servicio compartida - Todos los servidores en fallo - Español

Forzando un nodo como principal

Es posible que deseemos que un nodo concreto siempre sea el principal.

Para ello podemos utilizar una configuración automática que consiste en añadir una línea al fichero /etc/sysctl.conf del nodo que deseemos que lo sea:

Si no queremos reiniciar el nodo en estos momentos, activaremos el cambio de la siguiente forma:

Tambien podemos fijar temporalmente un nodo como principal utilizando el siguiente comando en el nodo principal:

Notas finales

Por simplicidad a lo largo de estos dos artículos relacionados con la dirección IP de servicio, hemos utilizado una única interfaz de red física tanto para la gestión del servidor como para prestar el servicio.

Es recomendable utilizar múltiples interfaces de red físicas, cada una para una tarea. Idealmente la interfaz de red física “em0” se utilizará para prestar el servicio, mientras que otra interfaz de red “em1” será la utilizada para administrar el servidor y donde CARP intercambia el estado de ambos nodos.

De igual modo, por simplicidad, sólo hemos utilizado una conexión para cada tarea. En entornos donde prime la alta disponibilidad debe utilizarse un doble enlace de red mediante agregación de enlace, utilizando tarjetas de red independientes; en un futuro publicaré sobre ello.

Alta disponibilidad en FreeBSD: La IP de servicio, parte 1

NOTA: Esta entrada es una adaptación de la versión para Linux.

En una entrada anterior vimos qué es la alta disponibilidad y qué debemos conseguir cuando un consumidor intenta acceder a un servicio: Una disponibilidad lo mas cercana posible al 100% del tiempo.

Esta entrada describe qué es la dirección IP de servicio, punto de entrada a los mismos, y cómo prepararla utilizando dos servidores.

Para poder implementar lo descrito bajo estas líneas es necesario disponer de dos servidores físicos o virtuales y FreeBSD ya instalado en ellos.

Con el fin de no hacer excesivamente largas las entradas, esta está dividida en dos partes. Esta primera parte sirve de introducción y preparación de los sistemas, mientras que la segunda muestra cómo configurar la propia IP de servicio.

La dirección IP de servicio

Cuando accedemos a un servicio la conexión se realiza hacia una dirección IP, de forma directa (192.0.2.100) o a través de un nombre de host (www.example.com).

Supongamos que queremos acceder a una página web (http://www.example.com) y que su dirección IP asociada es “192.0.2.100”. Esta dirección IP, a través de la cual la página es accesible, es denominada “IP de servicio”.

El objetivo es que esta dirección IP esté siempre disponible. Para el consumidor la percepción debe ser como la siguiente imagen:

Conexion a Host (es)

Para conseguirlo, teniendo un mínimo de dos servidores, uno tendrá asignada la dirección IP de servicio y el otro estará en espera por si el primero de ellos falla para tomarla.

IP de servicio compartida

Conexion a Host (es)

Si el servidor “servidor-1” no fuese funcional, entonces el servidor “servidor-2” sería quien utilizase la dirección IP de servicio.  El servicio estaría degradado -un componente en estado de fallo-, pero operativo y accesible de cara al consumidor.

IP de servicio compartida - Servidor servidor-1 en fallo

Conexion a Host (es)

En caso de no tener ningún servidor disponible el servicio no se podrá prestar ya que la dirección IP de servicio no podría asignarse a ninguno de ellos.

IP de servicio compartida - Todos los servidores en fallo

Conexion a Host en fallo(es)

El consumidor no podrá acceder al servicio. Su percepción variará:

Conexion a Host en fallo(es)

La técnica que permite a un servidor utilizar una dirección IP de servicio previamente asignada a otro cuando este ya no está disponible se denomina “IP failover”.

Existen varios protocolos estandarizados que implementan métodos de “IP failover”. En este artículo utilizaremos CARP.

Configuración previa necesaria

Antes de comenzar hemos de tener preparado el material necesario.

Utilizaremos 2 servidores llamados “servidor-1” y “servidor-2”. He utilizado FreeBSD 11.2.

Ambos servidores están conectados mediante la interfaz de red “em0” a un switch y pertenecen a la subred 192.0.2.0/24. El switch está conectado a su vez a un router con dirección IP 192.0.2.1 que actúa como puerta de enlace (“gateway“).

El siguiente diagrama muestra la interconexión:

Anotaremos los datos de ambos servidores para su posterior consulta:

Preparando los sistemas

En FreeBSD lo único que debemos hacer es cargar el módulo del kernel. Indicaremos al sistema que lo cargue en cada arranque añadiendo una entrada al fichero /boot/loader.conf:

Y cargaremos el módulo para su uso sin reiniciar el sistema:

Llegados a este punto verificaremos lo siguiente:

– El módulo “carp” está cargado y configurado en ambos nodos

Una vez que se haya revisado todo, podemos comenzar con la configuración de la dirección IP de servicio, pero eso será en la próxima entrada de esta serie.