Pregunta

Sé que con Network Load Balancing y Failover Clusteringwe puedo hacer servicios pasivos de alta disponibilidad. Pero ¿qué pasa con aplicaciones activas

Ejemplo: Una de mis aplicaciones recupera un cierto contenido de un recurso externo en un intervalo fijo. He imaginado los siguientes escenarios:

  1. Ejecutar en una sola máquina. Problema: si cae este caso, el contenido no se recuperará
  2. Ejecutar en cada máquina del clúster. Problema: el contenido se recuperará varias veces
  3. Tener en cada máquina del clúster, pero ejecutarlo sólo en uno de ellos. Cada instancia tendrá que comprobar algún tipo de recurso común para decidir si su turno para hacer la tarea o no.

Cuando estaba pensando en la solución # 3 me he preguntado cuál debe ser el recurso común. He pensado en crear una tabla en la base de datos, donde podríamos utilizarla para conseguir un bloqueo global.

Es ésta la mejor solución? ¿De qué manera la gente suele hacer esto?

Por cierto que es un C # .NET WCF aplicación que se ejecuta en Windows Server 2008

¿Fue útil?

Solución

Para este tipo de problemas que han inventado las colas de mensajes. Imagínese el caso cuando sus aplicaciones agrupadas todas escuchan a una cola de mensajes (agrupados en sí :-)). En algún momento en el tiempo una instancia recibe su orden inicial para descargar su recurso externo. Si tiene éxito, la instancia vacía el mensaje y en su lugar mensajes más en el plazo de ejecución más adelante que es igual a 'el tiempo de ejecución' + 'intervalo'. Pero en el caso de las matrices ejemplo, durante el procesamiento, eso no es un problema. El mensaje se deshace en la cola (después de tiempo de espera) y alguna otra instancia puede recogerlo. Un poco de transacciones, un poco de colas de mensajes

Estoy en el lado de Java EE del mundo para que pueda ayudar con los detalles de codificación

Otros consejos

He una vez implementado algo similar con su solución # 3.

Crea una tabla llamada algo así como resource_lock, con una columna (por ejemplo locking_key) que contendrá una clave de bloqueo.

A continuación, en cada intervalo, todas las instancias de la aplicación hará lo siguiente:

  1. Ejecutar una consulta como 'update resource_lock set resource_key = 1 where resource_key is null'. (Por supuesto puede también insertar un ID de servidor específico, una marca de tiempo, etc.)
  2. Si 0 filas actualizadas:. No hacer nada - otra instancia aplicación está ya ir a buscar el recurso
  3. Si la fila 1 actualización: buscar la vuelta locking_key recursos y listo para null.

Hay dos ventajas con esto:

  • Si uno de los servidores falla, el recurso seguirá siendo exagerado por los servidores que aún se están ejecutando.
  • deje el bloqueo a la base de datos, esto le ahorra de implementar por sí mismo.

Hay algunos requisitos que usted probablemente sabe, pero no se han descrito en la pregunta que se hacen dando una respuesta informada desafiante. Algunas de estas preguntas son:

  • ¿La tarea tiene que completar con éxito?
  • Si la tarea no / no se completa con éxito "que" tiene que saber y qué tipo de acciones se tienen que realizar?
  • ¿Cuál es el comportamiento si la tarea no se ha completado cuando llega el momento de ejecutar la tarea de nuevo? En caso de que ejecute o no?
  • ¿Qué tan importante es que las tareas se ejecutan en el intervalo especificado? Si el intervalo es cada 5 minutos tiene que ser cada 5 minutos o podría la ejecución de la tarea después de 5 minutos y 10 segundos?

El primer paso es dar respuesta a cómo se programa la tarea periódica para funcionar. Una opción es una tarea programada de Windows, pero eso no es de por sí altamente disponible, pero puede ser posible para evitar esto. Si está utilizando SQL Server, otra alternativa sería utilizar el Agente SQL Server como un planificador ya que la conmutación por error como parte de SQL Server.

El siguiente paso es determinar cómo invocar la aplicación WCF. La opción más sencilla sería la de desencadenar un trabajo para invocar el servicio WCF a través de una dirección IP de NLB. Esto podría ser considerado un no-no, si el servidor de base de datos (u otro servidor en esa zona) está llamando a la zona de aplicación (por supuesto siempre hay excepciones, como MSDTC).

Otra opción sería utilizar el modelo de cola. Este sería el más fiable en la mayoría de las situaciones. p.ej. Agente SQL Server podría ejecutar un procedimiento almacenado para introducir un registro en una tabla de cola. Luego, en cada servidor de aplicaciones de un servicio podría sondear en busca de un registro en la cola de proceso. El acceso al registro en la cola se serializa la base de datos de manera que el primer servidor que ejecute la tarea (y ese trabajo sólo se ejecuta una vez).

En función de las respuestas a las preguntas iniciales en esta respuesta puede que tenga que añadir un poco más el control de errores. Si la recuperación del recurso externo suele ser bastante corto, es posible que desee simplemente mantener el registro de cola cerrada con un select for update y actualización cuando la tarea se ha completado el estado (o eliminar el registro si lo desea). Esto bloqueará otras instancias de servicio en la tramitación del expediente mientras que se está procesando en otro servidor y si se produce un accidente durante el procesamiento de la transacción debe ser revertido y otro servicio en el clúster puede recoger el registro. (Aunque, se podría aumentar el tiempo de espera de transacción, siempre y cuando usted piensa que necesita.)

Si mantener un bloqueo de la base de datos durante mucho tiempo no es viable, entonces podría cambiar la lógica y añadir un poco de supervisión a los servicios. Ahora, cuando un trabajo se inicia el procesamiento, su estado se cambia de cola para correr y el servidor que procesa el registro se actualiza en el registro. Una especie de tabla de estado de servicio podría ser creado y cada instancia de servicio actualizaría el tiempo actual cada vez que sondee. Esto permitiría a otros servicios en el clúster para reprocesar trabajos que muestran como correr, pero el servicio que se supone que se ejecuta en no ha "protegido" en un plazo determinado.

Este enfoque también tiene sus limitaciones: ¿y si la tarea ha concluido efectivamente pero de alguna manera la conectividad de base de datos se perdió - el trabajo potencialmente podría correr de nuevo. Por supuesto, no creo que el problema de tener acciones de bases de datos atómicos combinados con otros recursos no transaccionales (solicitud web, por ejemplo, del sistema de archivos) va a ser fácil de resolver. Estoy asumiendo que usted está escribiendo un archivo o algo -. Si el contenido externo también se coloca en una base de datos a continuación, una sola transacción, se garantiza que todo es coherente

Desde el punto de vista de la simplicidad, la forma más rápida / más fácil de lograr lo que estás buscando sería 'round-robin' clúster de manera que para cada solicitud, se selecciona una máquina (por un servicio de gestión de clusters o algunos tal) para procesar una solicitud. solicitudes de los clientes reales no van directamente a la máquina que lo maneja; En su lugar, apuntan a un solo punto final, que actúa como un proxy para distribuir las solicitudes entrantes a las máquinas basadas en la disponibilidad y la carga. Para citar el siguiente enlace-referenciada,

  

Equilibrio de carga de red es una manera de configurar un conjunto de máquinas para que se turnan para responder a las solicitudes. Se observa con mayor frecuencia en práctica en las granjas de servidores: máquinas configuradas de forma idéntica que distribuir la carga de un sitio web, o tal vez una granja de Terminal Server. También se podría utilizar para una granja de servidor de seguridad (ISA), los puntos de acceso VPN, en realidad, cada vez que tienen el tráfico TCP / IP que se ha convertido en una carga excesiva para una sola máquina, pero aún desea que aparezca como una sola máquina para fines de acceso.

En cuanto a ser "activa" su aplicación, esta exigencia no lo hace el factor en esta ecuación, ya sea 'activa' o 'pasiva', la aplicación todavía hace una petición a los servidores.

Existen

equilibradores de carga comerciales para servir las peticiones HTTP de estilo, así que puede ser vale la pena analizar, pero con el balanceo de carga características de W2K8, que pueden ser mejor servidos recurriendo a ellos.

Para obtener más información acerca de la configuración que en Win2k8, consulte este artículo .

este artículo es mucho más técnico y se centra en el uso de NLB con Exchange, pero los principios siguen deben aplicarse a su situación.

ver aquí para otro detallada paseo a través de la configuración de NLB y configuración.

De no ser así, es posible que un buen servicio de búsqueda / publicación en ServerFault, ya que el código de aplicación no es (y no debería ser) estrictamente consciente de que el NLB siquiera existe.

EDIT:. Añadió otro enlace

Edit (el segundo): El PO ha corregido mi conclusión errónea en el concepto vs 'activo' 'pasiva'. Mi respuesta a eso es muy similar a mi primera respuesta, salvo que el servicio 'activa' (que, puesto que está utilizando WCF, fácilmente podría ser un servicio de Windows) puede ser dividida en dos partes: la parte de procesamiento real, y el parte de control. La parte de control se ejecutan en un único servidor, y actuar como un equilibrador de carga por turnos para los otros servidores que realizan el procesamiento real. Es un poco más complicado que el escenario original, pero creo que sería una buena cantidad de flexibilidad, así como ofrecer una separación limpia entre su lógica de procesamiento y gestión.

En algunos casos las personas les resulta útil contar con 3 máquinas que realizan todas las solicitudes, y luego comparar los resultados al final, para asegurarse de que el resultado es absolutamente correcta y sin fallos de hardware causó ningún problema durante el procesamiento de la misma. Esto es lo que hacen en por ejemplo los aviones.

En otras ocasiones, se puede vivir con tener un único mal resultado y un pequeño tiempo de inactividad para cambiar a un nuevo servicio, sino que sólo quiere los próximos uno a estar bien. En caso de que el número solución 3 con un monitor de ritmo cardíaco es una excelente instalación.

En otras ocasiones más, la gente sólo tiene que ser notificado con un SMS que su servicio se ha reducido y la aplicación sólo se utilizan algunos datos obsoletos hasta que se realice manualmente algún tipo de conmutación por error.

En su caso, yo diría que el último es probablemente más útil para usted. Puesto que realmente no se puede depender del servicio en el otro extremo de estar disponible, todavía tendría que llegar a una solución para saber qué hacer en ese caso. Devolver datos obsoletos puede ser lo que es bueno para usted, y puede que no sea. Lamento tener que decir: Depende

.

Zookeeper hace que un caso de uso bien de cerraduras distribuidos. Zookeeper tener z-nodos que son como directorio con datos.

Incluso curador Netflix tiene gran cantidad de recetas ya hecho y de usar. Como: elección del líder, bloqueo distribuido y muchos más.

Creo que tenemos cliente del cuidador del zoológico para C #. Sin duda debe probar esta opción. # Option3

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top