[DNN Azure Accelerator] Le damos la bienvenida a la Alta Disponibilidad

high_availabilityUna de las características más solicitadas en el DotNetNuke Azure Accelerator es la posibilidad de poder hacer despliegues en alta disponibilidad (añadiendo dos o más roles) y que además no existan problemas de recuperación en caso de que el acceso a los contenidos almacenados en el VHD sea interrumpido. Si bien en la actualidad se podían hacer despliegues de más de un servidor para servir los contenidos (modo webfarm), en el caso de que el servidor que montaba la unidad VHD cayera por algún motivo –como que Microsoft hiciera un mantenimiento planeado haciendo un upgrade del cloud service- podía acabar en que el site dejara de estar disponible.

Todo esto tiene su raíz en la exclusividad que mantiene sobre el blob el role que monta el VHD, a través del mantenimiento de leases sobre el mismo, no permitiendo a los demás roles montarlo en modo lectura/escritura.

Nuevas características en el DNN Azure Accelerator

Antes de comenzar a detallar cómo funciona el nuevo sistema de “competición por el lease”, echemos un vistazo a las nuevas características implementadas en el Accelerator desde su última versión y que he ido añadiendo a lo largo de los últimos meses:

  • Solución actualizada al Azure SDK 1.8 (October 2012)
  • Modificado el sistema operativo predeterminado de los paquetes a OSVersion=3 (Windows Server 2012, IIS 8)
  • Añadido soporte para servicio FTP (activo y pasivo)
  • Corregida la causa por la que en determinadas ocasiones el site no se iniciaba correctamente tras reiniciar el role (ver este enlace para más información)
  • Añadido nuevo paquete con soporte para co-located caché
  • Añadido soporte de pre-carga del sitio y modo de inicio del appPool en AlwaysRunning, características de IIS8 (ver este enlace para más información)
  • Arquitectura modificada añadiendo soporte para Alta Disponibilidad

Antes de empaquetar la nueva versión, voy a realizar algunos cambios en la interfaz de usuario para acomodar las nuevas opciones de configuración como las del servicio FTP, etc.

Alta Disponibilidad: compitiendo por el lease

A la espera de que Microsoft saque la solución definitiva a este problema de leases sobre los VHD, la nueva implementación realizada en el DNN Azure Accelerator minimiza estos efectos para estar dentro de los márgenes del SLA de alta disponibilidad de Windows Azure.

La solución está basada en la actualización del post de Dinesh Haridas -artículo en el que está inspirado el DNN Azure Accelerator- en el que se introduce una aproximación a la alta disponibilidad con una técnica de competición por el VHD.

Por simplificación, centremos el problema de la alta disponibilidad en las operaciones alrededor del VHD donde residen los contenidos del site. Estas operaciones serán realizadas entre dos roles: SMBServer, que actúa como el servidor de contenidos; SMBClient, que actúa como servidor que se conecta a la unidad compartida por el servidor de contenidos.

El resumen de las operaciones realizadas en el role que comparte los contenidos es:

  • SMBServer (1 o más instancias)
    • Cada X segundos (en el evento OnRun), intenta montar el VHD (Compete for the lease)
      • Si tiene éxito:
        • comparte la unidad con un “NET SHARE”
        • Cada X segundos sigue comprobando que tiene el lease. Si no lo tiene, elimina el share y vuelve al principio

Tal y como se observa, todos los roles que actúan como servidor de ficheros están continuamente compitiendo por el lease del VHD. El lease actual, que se mantiene durante 60seg por el driver del servidor que monta con éxito el VHD, asegura que la unidad siga estando en posesión del mismo servidor mientras sea posible. Por este motivo, en caso de caída del role que comparte los contenidos, la recuperación completa toma entre 60 y 90seg. Si tenemos en cuenta que ésto sólo ocurre cuando actualizamos el servicio –o cuando Microsoft realiza una operación de mantenimiento, normalmente una vez cada 2 o 3 meses-, si bien no es perfecto, entra dentro de los márgenes del SLA de Azure.

El resumen de las operaciones realizadas en el role que actúa como cliente es:

  • SMBClient (1 o más instancias)
    • Cada X segundos (en el evento OnRun), intenta mapear una unidad de red con el share del role SMBServer, iterando sobre todas las instancias del mismo
      • Si tiene éxito:
        • Cada X segundos escribe en un fichero de log en la carpeta “logs”. Si ocurre un error al escribir dicha entrada, elimina la unidad mapeada y vuelve al principio

En el caso del servidor SMBClient, se hacen varios reintentos de escritura en el log antes de comenzar de nuevo el proceso de mapeo para evitar falsos positivos.

AzureHADemo

En el archivo adjunto está la solución simplificada que sirve de demostración por si a alguien le interesan los detalles.

  • AcceleratorHADemo.zip (334Kb) – Descargar

Implementación en el Accelerator

La implementación final en el Accelerator también está disponible en CodePlex. Cabe destacar las siguientes características en la implementación final:

  • El código de creación del site en el IIS se ha movido justo después del intento exitoso de mapeo de la unidad de red en el webrole
  • Existen tres cloud services distintos dentro de la solución:
    • DNNAzureSMB: mantiene worker roles (SMBServer) y webroles (DNNAzure) separados para cada operación. Si bien lo normal es usar el menor número de servidores posible, hay escenarios donde, por rendimiento, no se desea sobrecargar a un webrole con las tareas de servir también los archivos al resto de instancias. Es por ello que se sigue manteniendo esta solución.
    • DNNAzureSingle: al desplegar este cloud service, los webroles (DNNAzure) actúan también como servidores de contenidos compitiendo por el lease del VHD. Para ello se mantienen dos threads: uno para competir por el lease y realizar las tareas propias del SMBServer y otro para realizar el mapeo de red y las tareas propias del SMBClient. Este será normalmente el paquete a desplegar en la mayoría de los escenarios.

Aún queda una problemática por solucionar, y es el escenario donde se usa FTP o WebDeploy y has desplegado más de una instancia de los webroles. Esto es debido a que estos protocolos requieren afinidad a nivel de protocolo de comunicaciones y la implementación actual del Load Balancer de Azure no permite especificar la misma. Como “workaround” para esta incidencia –y hasta que Microsoft lo solucione a nivel de Load Balancer– la solución pasaría por añadir un tercer webrole para estos servicios que requieren afinidad y desplegar sólo una instancia del mismo. 

Conclusión

Con esta versión se soluciona el problema de alta disponibilidad en el DNN Azure Accelerator así como el problema de actualización del servicio, ya esté en alta disponibilidad como si no, con lo que será una actualización recomendada para todos los despliegues que actualmente estén usando el DNN Azure Accelerator.

En breve realizaré un empaquetado y estará disponible como descarga en CodePlex. Si tienes alguna sugerencia, no olvides dejar tus comentarios, ya sea en este mismo blog o como una entrada en el área de discusiones de CodePlex.

Un saludo y Happy Coding!

Deja un comentario

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