Failover VCSA 6.X a otro Platform Services Controller (PSC) replicado

En este post vamos a comentar la funcionalidad de repoint/failover de vCenter a un PSC que se este replicando con el que actualmente este utilizando nuestro vCenter.

VMware nos ofrece la posibilidad de utilizar un balanceador para que nuestro vCenter apunte a una VIP y este proceso sea transparente, pero por varias razones puede que no queramos utilizar esta opción, ya sea por que es costosa y no disponemos de un balanceador certificado para esta solución (a día de hoy F5, Netscaler y Edge de NSX), porque complica la administración de nuestro entorno o sencillamente no queremos utilizar un balanceador.

Comentar que entre la versión vSphere 6.0 y 6.5 hay bastantes cambios en cuanto a repoint/failover.

Os dejo un KB que indica estos cambios y el procedimiento para repoint tanto para VCSA como para la versión Windows de vCenter: https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2113917

PSC_failover

Resumiendo un poco:

  • La opción de repoint esta disponible a partir de la versión  vSphere 6.0 U1.
  • El repoint solo se puede realizar a un PSC dentro del mismo SSO Domain.
  • En versión 6.0 podemos hacer el repoint entre sites de un mismo SSO Domain, pero a partir de la versión 6.5 esto ya no esta soportado y solo podemos hacerlo dentro de un mismo site del SSO Domain.
  • El repoint esta disponible tanto en versión appliance como en versión de vCenter para Windows.

Expuesto esto, ¿que pasa si perdemos nuestro PSC activo y no tenemos una solución con balanceador implementada?

Si el PSC activo al que esta conectando nuestro vCenter cae, las conexiones a vCenter activas se mantendrán, pero no podrá crearse ninguna nueva conexión ya que no se podrán crear los token al estar el PSC caído.

Si se trata simplemente de una caída del PSC porque el Host ESXi que lo alojaba ha caído, vSphere HA sera nuestro mejor amigo y levantara el PSC en otro Host en un tiempo más que razonable, con lo cual no nos preocuparía tanto. Ahora si el problema es otro y se piensa que se va prolongar en el tiempo más de lo deseado o más de lo aceptable en los SLA establecidos, ya sea un problema de almacenamiento donde se aloja el PSC, un problema del propio PSC a nivel de OS, en ese momento si debemos preocuparnos ya que tendremos un bonito vCenter al que nadie podrá conectar, es más si sus servicios se reiniciasen no arrancarían.

En esta situación podemos realizar un failover/repoint si en el diseño de nuestra Infraestructura hemos implementado un PSC replicado en el mismo SSO Domain (ya hemos visto las restricciones dependiendo de si nuestra versión es 6.0 o 6.5), para el ejemplo vamos a suponer que estamos en versión 6.5 y que hemos desplegado dos PSC replicados en el mismo Site y mismo SSO Domain, y que el PSC al que esta apuntando vCenter cae.

El repoint es un proceso sencillo, pero tal vez en un momento de crisis no queramos estar realizando el repoint a mano, o bien queremos que cada X se compruebe si nuestro PSC activo esta dando servicio.

Para esto hace ya un tiempo encontré un script muy útil, por el cual hay que dar muchas gracias a William Lam y su interesante web http://www.virtuallyghetto.com/. El script de este crack se ejecuta desde el propio vCenter y checkea el estado del PSC activo y si este esta caído reapunta el vCenter automáticamente al PSC pasivo, deja un log del failover y además nos enviaría un correo informando de que ha ocurrido un failover de PSC (si tenemos correctamente configurado el STMP en nuestro vCenter). Una vez realizado el failover deja un fichero de bloqueo para que no ocurra otro failover si ya ha habido uno, con lo cual después de un primer failover necesitaría la intervención del Administrador.

William Lam contempla en su post añadir este script al cron de vCenter para que realice la comprobación cada 5 minutos: http://www.virtuallyghetto.com/2015/12/how-to-automatically-repoint-failover-vcsa-to-another-replicated-platform-services-controller-psc.html

Al final del post os dejo el script, lo he adaptado para cubrir unas necesidades que estábamos teniendo en unas pruebas que estamos realizando, las modificaciones son las siguientes:

  • Al principio del script se comprueba quien es el PSC activo en ese momento, para reflejar automáticamente el estado de nuestra infraestructura en el momento de la ejecución. Es decir si ha habido un failover previo y ha cambiado el activo, el script adaptara las variables para una correcta ejecución.
  • Con la modificación anterior ya podríamos ejecutar el script de una forma cíclica aunque ocurran failovers/repoints, por lo cual he comentado en el script la parte del fichero de bloqueo para que no se ejecute el script si ha habido un failover previo. Entiendo perfectamente que William Lam ponga este bloqueo porque dependiendo de muchas cosas no queremos que el vCenter este reapuntando continuamente, y a lo mejor queremos controlarlo un poco más o revisar que ha pasado. Como indico antes estas modificaciones las hemos realizado por unas necesidades concretas.
  • Además del correo y del log si hay un failover, el script loguea los eventos en el /var/log/messages (he cambiado los mensajes que se envían al log) de manera que también podemos ver lo que esta ocurriendo en cada momento con el siguiente comando: tail -f /var/log/messages | grep CHECK_PSC_HEALTH

En definitiva el script mantiene todo lo que William Lam incluye, simplemente lo hemos adaptado a nuestras necesidades.

En el script se podrían poner más comprobaciones, como que antes de hacer un failover se compruebe que el PSC pasivo este operativo, y todo tipo de cosas que se nos puedan ocurrir en este sentido.

De nuevo gracias a William por los magníficos scripts a los que nos tiene acostumbrados.

Gracias por compartir 🙂


#!/bin/bash
# Author: William Lam
# Description: Poor man's script to check PSC connectivity /websso perform automatic failover to secondary PSC
# Reference: http://www.virtuallyghetto.com/2015/12/how-to-automatically-repoint-failover-vcsa-to-another-replicated-platform-services-controller-psc.html
#
# Adaptado para que pueda ejecutarse aun que ya haya habido un failover de PSC
# Juan Vicente Lopez Hellin

# IP/Hostname of Primary PSC
PRIMARY_PSC=psc01.local.com

# IP/Hostname of Secondary PSC (must already be replicating with Primary PSC)
SECONDARY_PSC=psc02.local.com

# Number of times to check PSC connecvitity before failing over
NUMBER_CHECKS=3

# Sleep time between checks (seconds)
SLEEP_TIME=30

# Email when failover occurs
EMAIL_ADDRESS=tuemail@local.com

### DO NOT MODIFY BEYOND HERE ###

CHECK_COUNT=0
WORKDIR=/root/psc-health-check

# Variable creada para establecer el PSC secundario como primario y viceversa si ya ha ocurrido un failover
PSC_TMP=0

# Nos aseguramos de cual es el PSC primario (al que esta apuntando vCenter) y cual el secundario,
# las variables inicializadas al principio del script hacen referencia a una situacion normal, checkeamos por si ha habido failover
# y esa situación ha cambiado
# Comprueba quien es su primario despues del failover y se lo guarda en PSC_TMP
PSC_TMP=$(/usr/lib/vmware-vmafd/bin/vmafd-cli get-ls-location --server-name localhost | awk -F "/" '{print $3}' | cut -f1 -d ':')

# Si el PSC actual no es el primario, cambiamos las variables para reflejar el cambio de PSC
if [ ${PSC_TMP} != ${PRIMARY_PSC} ]; then
SECONDARY_PSC=${PRIMARY_PSC}
PRIMARY_PSC=${PSC_TMP}
fi

# Ensure only single instance of the script runs
if mkdir ${WORKDIR}; then
# Comentamos el "Only run if falilover has not ocurred before" porque ya checkeamos si ha ocurrido failover y cambiamos los roles
# primary-secondary para reflejar el estado actual
# Only run if failover has not occured before
# if [ ! -e ran-psc-failover ]; then
for i in $(seq 0 ${NUMBER_CHECKS});
do
 if [ ${CHECK_COUNT} == ${NUMBER_CHECKS} ]; then
  logger -t "CHECK_PSC_HEALTH" "Comenzando failover a PSC Pasivo: ${SECONDARY_PSC}"
 # repoint to passive PSC and log result
 /bin/cmsso-util repoint --repoint-psc ${SECONDARY_PSC} > /root/psc-failover.log

 # Comentamos el "touch" ya que como hemos indicado si queremos que se ejecute  despues de un failover
 # Ensure script no longer runs after failover
 # touch /root/ran-psc-failover

 # Send an email notification regarding failover so admin is aware
 if [[ ${EMAIL_ADDRESS} ]]; then
  logger "Mandando notificación por email a: ${EMAIL_ADDRESS}"
  VC_HOSTNAME=$(/usr/lib/vmware-vmafd/bin/vmafd-cli get-pnid --server-name localhost)
  cat > /tmp/psc-email << __PSC_EMAIL__
Subject: PSC Failover Notification
VC ${VC_HOSTNAME} failed over to passive PSC ${SECONDARY_PSC} at $(date)
__PSC_EMAIL__
 /usr/sbin/sendmail ${EMAIL_ADDRESS} < /tmp/psc-email
fi
rm -rf ${WORKDIR}
exit
fi

# Checking PSC's /websso endpoint as a quick method to validate if PSC is operational
if [ $(curl --max-time 10 -s -o /dev/null -w "%{http_code}" -i -k https://${PRIMARY_PSC}/websso/) -ne 200 ]; then
CHECK_COUNT=$((CHECK_COUNT+1))
logger -t "CHECK_PSC_HEALTH" "No es posible conectar al PSC Primario: ${PRIMARY_PSC} (Count=${CHECK_COUNT}/${NUMBER_CHECKS})"
sleep ${SLEEP_TIME}
else
logger -t "CHECK_PSC_HEALTH" "Estado saludable del PSC Primario: ${PRIMARY_PSC} ... "
break
fi
done
#fi
rm -rf ${WORKDIR}
fi

Leave a Reply

Your email address will not be published. Required fields are marked *