2010-12-16 20 views
11

Estoy tratando de construir la solución muy liviana para la implementación sin tiempo de inactividad para las aplicaciones Java. En aras de la simplicidad, pensemos que tenemos dos servidores. Mi solución es utilizar:Implementación del tiempo de inactividad cero para aplicaciones Java

  1. en el "frente" - algunos equilibrador de carga (software) - Estoy pensando en HAProxy aquí.

  2. En la "parte posterior": dos servidores, ambos ejecutando Tomcat con la aplicación desplegada.

Cuando estamos a punto de desplegar nueva versión

  1. Inhabilitamos uno de los servidores con HAProxy, por lo que sólo un servidor (vamos a llamarlo el servidor A, que se ejecuta la liberación de edad) serán disponible.

  2. Implementar nueva versión en otro servidor (llamémoslo servidor B), ejecutar pruebas de unidad de producción (en caso de que las tengamos :-) y habilitar el servidor B con HAProxy, deshabilitando el servidor A al mismo tiempo.

  3. Ahora tenemos nuevamente solo un servidor activo (servidor B, con la nueva versión). Implemente una nueva versión en el servidor B y vuelva a habilitarla.

¿Algún consejo sobre cómo mejorar? ¿Cómo automatizar?

¿Alguna solución preparada o tengo que terminar con mis propios scripts personalizados?

Gracias!

Respuesta

4

La mejora del balanceo es una buena solución, siempre que su equilibrador de carga sea compatible con esta opción (inanición del servidor). Otra solución es usar servidores de aplicaciones habilitados para OSGi, para reemplazar en caliente partes o la totalidad de su aplicación.

Recomendaría la primera. La consola de supervisión AMS de SpringSource puede eliminar un clúster de tcServer (un tomcat personalizado con esteroides), y IIRC realiza la actualización progresiva automáticamente (pero revise los documentos).

3

Eche un vistazo a la tecnología OSGi si puede alojar un contenedor OSGi ya que proporciona un buen aislamiento y una implementación en caliente para paquetes OSGi. Si está utilizando el marco de primavera se puede utilizar Spring OSGi

3

LiveRebel proporciona la funcionalidad para reiniciar el rodantes, proporciona CLI API y el plugin de Hudson/Jenkins para la automatización.

3

He encontrado algunas soluciones interesantes de este article con respecto a Cero tiempo de inactividad. Me gustaría resaltar solo algunas soluciones en ese artículo.

1. Un conmutador A/B: (balanceo de actualización + mecanismo de repliegue)

Debemos tener un conjunto de nodos en pie por el modo. Implementaremos la nueva versión en esos nodos y les cambiaremos el tráfico al instante. Si mantenemos los nodos antiguos en su estado original, también podríamos hacer una reversión instantánea. Un equilibrador de carga se encuentra frente a la aplicación y es responsable de este cambio a pedido.

contras: si necesita servidores X para ejecutar su aplicación, Yon necesitan servidores 2X con este enfoque.

2. Cero tiempo de inactividad

Con este enfoque, no mantenemos un conjunto de máquinas; más bien, retrasamos el enlace del puerto. La adquisición de recursos compartidos se retrasa hasta que se inicia la aplicación. Los puertos se cambian después de que se inicia la aplicación, y la versión anterior también se ejecuta (sin un punto de acceso) para retroceder instantáneamente si es necesario.

3. despliegue paralelo - Apache Tomcat: (Para aplicaciones web solamente)

Apache Tomcat ha añadido la característica de implementación paralela a su liberación de la versión 7. Permiten que se ejecuten dos versiones de la aplicación al mismo tiempo y toman la última versión como predeterminada.

4. enlace de puerto retardados:

que proponemos aquí es la capacidad de iniciar el servidor sin la unión del puerto y esencialmente sin iniciar el conector. Más tarde, se iniciará un comando por separado y vinculará el conector. La versión 2 del software se puede implementar mientras la versión 1 se está ejecutando y ya está encuadernada. Cuando la versión 2 se inicie más tarde, podemos desvincular la versión 1 y enlazar la versión 2. Con este enfoque, el nodo estará efectivamente fuera de línea solo durante unos segundos.

5. avanzados del puerto de unión:

Al romper el mito: ‘Address already in use’, * tanto antiguo proceso & nuevo proceso se unirá al mismo puerto. SO_REUSEPORT opción en modo ON permite que dos (o más) procesos se vinculen al mismo puerto. Una vez que el nuevo proceso se une al puerto, elimine el proceso anterior.

Los SO_REUSEPORT dirección de una opción de dos cuestiones:

  1. El pequeño fallo de conmutación entre la versión de la aplicación: el nodo puede garantizar el tráfico todo el tiempo, con eficacia que nos da el tiempo de inactividad cero.

  2. mejor programación:

enter image description here

En resumen:

Mediante la combinación de ambos tarde unión y puerto reutilización, podemos lograr efectivamente cero tiempo de inactividad. Y si mantenemos el proceso en espera, también podremos hacer una reversión instantánea.

0

Hay easy-deploy que hace exactamente eso con los contenedores Docker.

versión Implementar 1

easy-deploy -p 80:80 -v some/path:other/path my-image:1 

para desplegar una nueva versión basta con ejecutar el comando con el nombre de etiqueta actualizada

easy-deploy -p 80:80 -v some/path:other/path my-image:2 

Revelación: he construido esta herramienta. Lo construí exactamente porque no pude encontrar una solución simple para este problema.

Cuestiones relacionadas