Un grupo de archivos nuevos con nombres de archivo únicos "aparece" regularmente 1 en un servidor. (Al igual que cientos de GB de datos nuevos al día, la solución debe ser escalable a terabytes. Cada archivo tiene varios megabytes de tamaño, hasta varias decenas de megabytes).
Hay varias máquinas que procesan esos archivos. (Decenas, la solución debería ser escalable a cientos). Debería ser posible agregar y eliminar fácilmente nuevas máquinas.
Hay servidores de almacenamiento de archivos de respaldo en los que cada archivo entrante debe copiarse para el almacenamiento de archivos. Los datos no deben perderse, todos los archivos entrantes deben terminar entregados en el servidor de almacenamiento de respaldo.
Cada archivo entrante debe enviarse a una sola máquina para su procesamiento, y debe copiarse en el servidor de almacenamiento de respaldo.
El servidor receptor no necesita almacenar archivos después de enviarlos en su camino.
Aconseje una solución sólida para distribuir los archivos de la manera descrita anteriormente. La solución no debe basarse en Java. Las soluciones unidireccionales son preferibles.
Los servidores están basados en Ubuntu, se encuentran en el mismo centro de datos. Todas las demás cosas se pueden adaptar a los requisitos de la solución.
1 Tenga en cuenta que omito intencionalmente información sobre la forma en que los archivos se transportan al sistema de archivos. La razón es que los archivos están siendo enviados por terceros por varios medios heredados diferentes hoy en día (curiosamente, a través de scp y ØMQ). Parece más fácil cortar la interfaz de clúster cruzado en el nivel del sistema de archivos, pero si una u otra solución realmente requerirá un transporte específico, los transportes heredados pueden actualizarse a ese.
Respuestas:
Aquí hay una solución para lo que estás buscando. No hay Java involucrado en la fabricación de este sistema, solo bits de código abierto fácilmente disponibles. El modelo presentado aquí puede funcionar con otras tecnologías diferentes a las que estoy usando como ejemplo.
Esta configuración debería poder ingerir archivos a velocidades de velocidad extremas dados suficientes servidores. Obtener velocidades de ingesta agregadas de 10 GbE debería ser factible si lo aumenta demasiado. Por supuesto, procesar esa cantidad de datos tan rápido requerirá aún más servidores en su clase de máquina de procesamiento. Esta configuración debería escalar hasta mil nodos, y probablemente más allá (aunque hasta qué punto depende de qué, exactamente, estás haciendo con todo esto).
Los profundos desafíos de ingeniería estarán en el proceso de gestión del flujo de trabajo oculto dentro del proceso AMQP. Eso es todo software, y probablemente creado a medida para las demandas de su sistema. ¡Pero debería estar bien alimentado con datos!
fuente
Dado que ha aclarado que los archivos llegarán a través de scp, no veo ninguna razón para que exista el servidor front-end, ya que el mecanismo de transporte es algo que se puede redirigir en la capa 3.
Pondría un director LVS (par) al frente, con un grupo de servidores de procesamiento detrás y una política de redireccionamiento de turnos. Eso hace que sea muy fácil agregar y restar servidores al grupo, aumenta la confiabilidad porque no hay un servidor front-end que se caiga, y significa que no tenemos que abordar la pregunta pull / push sobre cómo obtener los archivos de el front-end a los servidores de procesamiento porque no hay front-end.
Cada servidor de grupo debe hacer dos cosas al recibir un archivo: en primer lugar, copiarlo en el almacenamiento de archivo, luego procesar el archivo y enviarlo en su camino.
fuente