¿Cómo dividir el trabajo en una red de computadoras?

11

Imagine un escenario de la siguiente manera: Digamos que tiene una computadora central que genera muchos datos. Estos datos deben pasar por algún procesamiento, que desafortunadamente lleva más tiempo que generarlos. Para que el procesamiento se ponga al día con el tiempo real, conectamos más computadoras esclavas.

Además, debemos tener en cuenta la posibilidad de que los esclavos abandonen la red a mitad del trabajo, así como la adición de esclavos adicionales. La computadora central debe garantizar que todos los trabajos se hayan completado satisfactoriamente, y que los trabajos eliminados por un esclavo se vuelvan a asignar a otro.

La pregunta principal es: ¿Qué enfoque debo usar para lograr esto?

Pero quizás lo siguiente me ayudaría a llegar a una respuesta: ¿Hay un nombre o patrón de diseño para lo que estoy tratando de hacer?

¿Qué dominio de conocimiento necesito para lograr el objetivo de que estas computadoras se comuniquen entre sí? (p. ej., ¿será suficiente una base de datos, de la que tengo algún conocimiento, o esto involucrará sockets, de los cuales aún no tengo conocimiento?)

¿Hay algún ejemplo de tal sistema? La pregunta principal es un poco general, por lo que sería bueno tener un punto de partida / punto de referencia.

Tenga en cuenta que estoy asumiendo restricciones de c ++ y windows, por lo que se agradecerán las soluciones que apunten en esa dirección.

Morpork
fuente
1
Busque sistemas de cola o flujo de trabajo, ejemplos: aws.amazon.com/sqs en.wikipedia.org/wiki/Message_queue, etc. El sistema de colas puede encargarse de la distribución, verificación y reasignación.
Luc Franken
2
El término que estás buscando es paralelización . Antes de seguir este camino, asegúrese de que su problema se pueda resolver en paralelo (por ejemplo, el resultado para el elemento n no depende del resultado para el elemento n-1 ).
Blrfl
Mira boinc
@Blrfl Creo que la paralelización generalmente no está asociada con esto, la paralelización generalmente está asociada con la ejecución multiproceso o multiproceso en una sola máquina usando múltiples núcleos / procesadores o ejecución simultánea en la misma máquina. La informática distribuida es a lo que se refiere y en su descripción no tiene garantías de concurrencia, solo garantías de asincronía (es decir, ejecución no determinista que puede ser concurrente, sincrónica o retrasada en la cola)
Jimmy Hoffa
3
Me sorprende que nadie haya mencionado hadoop.
Kevin

Respuestas:

12

¿Hay algún ejemplo de tal sistema?

Si. Este patrón se conoce como computación distribuida (o programación distribuida o cualquier palabra genial que desee poner después de distribuida). Mi sugerencia será no construir esto internamente antes de buscar otras soluciones. Puede consultar esta pregunta de desbordamiento de pila para conocer varias opciones. Y luego toma una decisión calculada.

Manoj R
fuente
3
No olvides la nueva palabra favorita para esto: ¡la nube ! o computación en la nube . Si lo hace con sus propias computadoras, las personas las llaman nube personal o mini nube . Comercializando tonterías, esto se ha conocido como lo dijiste como computación distribuida durante años, simplemente lanzando allí para que el OP sepa dónde lee sobre cosas de la nube de las que está hablando exactamente esto.
Jimmy Hoffa
3
@JimmyHoffa: la palabra "nube" se usa con la misma frecuencia para indicar que sus datos, así como el software que utiliza para trabajar con ellos, están en Internet en algún lugar en lugar de su máquina local. Y, sin embargo, en otras ocasiones, significa que está utilizando una máquina virtual que se ejecuta en un clúster en lugar de un solo host de máquina virtual monolítica; La ventaja obvia son las failovers transparentes de tiempo de inactividad cero.
tdammers
2
@tdammers es cierto, pero, no obstante, el tipo de sistema descrito por el OP es uno de los muchos que utilizan el apodo de marketing de la Nube, junto con, como ya señaló, prácticamente todo lo demás. Eso es lo que lo convierte en una palabra de moda, fue inventado sin definición, por lo que la gente lo aplicó a toneladas de cosas diferentes, por lo que efectivamente significa todo y nada. ¡Hurra por las palabras de moda!
Jimmy Hoffa
1
@JimmyHoffa: También es lo que hace que mencionar la palabra "nube" aquí sea completamente no constructivo.
tdammers
3
Podría ser una buena palabra para usar contra la administración. "¿Cuál es su solución a este problema de procesamiento de datos?" "Bueno, podríamos distribuirlo a una red de computadoras y calcularlas en paralelo". MIRADA EN BLANCO. "Podemos construir una mini nube". "BIEN CONTINUAR"
Morpork
4

Como se observó en otras respuestas, este campo se conoce como computación distribuida , computación en cuadrícula , computación en clúster y computación de alto rendimiento .

Permítanme agregar la distinción de que, cuando un sistema puede redimensionarse después de comenzar a coincidir con la carga de trabajo, se dice que es " elástico ", y esto es diferente de la computación en cuadrícula tradicional. Esa es una de las razones (no relacionadas con el marketing) del término " computación en la nube ": el usuario no necesita planificar la capacidad, y el número y la ubicación de las máquinas que llevan a cabo la computación no tienen características como una nube.

Además, su requisito de que el maestro vuelva a programar tareas fallidas se denomina propiedad de " tolerancia a fallas " de ese sistema. (Enlace obligatorio a esta caricatura )

¿Qué enfoque debe usar para construir su propia nube privada? En mi orden o preferencia:

  1. No construya su propia nube , use la infraestructura proporcionada por otros. Amazon llama a esto Virtual Private Cloud , Rackspace solo Private Cloud ; Estoy seguro de que puede encontrar otras ofertas y compararlas.

  2. No construya su propio motor informático distribuido , utilice el motor proporcionado por otros. Si insiste en usar sus máquinas, use al menos la mayor cantidad de software posible que haya sido provisto y probado por otros. Puede usar Hadoop desde C ++ a través de la interfaz Pipes o desde cualquier ejecutable a través de la API de Streaming . Hay una interfaz de transmisión similar en Spark .

  3. No codifique todos los componentes desde cero , use componentes de la comunidad. Si, por alguna razón, ha leído hasta ahora y desea implementar sus propios componentes en la nube, no comience desde la biblioteca estándar de C ++. Los componentes principales que necesitará son:

    • un sistema de colas, como se señala en un comentario , para enviar tareas desde el maestro a los nodos de procesamiento y enviar confirmaciones de resultados desde los nodos de procesamiento al maestro
    • un sistema de archivos distribuido, de modo que los nodos de procesamiento puedan acceder a los datos para operar.

    Hay muchas alternativas para ambos. Para hacer cola, RabbitMQ tiene un instalador de Windows, al igual que ZeroMQ . Para los sistemas de archivos distribuidos, realmente no tengo suficiente experiencia en Windows: parece que puedes organizar los recursos compartidos SMB en un DFS , pero no puedo darte ninguna pista aquí. Podría pensar, como se señaló en otra respuesta, utilizar una base de datos distribuida como MongoDB para los datos; Se ejecuta en Windows .

También podría pensar en usar MPI (generalmente la implementación de OpenMPI , generalmente a través de su envoltorio Boost ), pero observe que los programas MPI no son elásticos ni tolerantes a fallas per se; debes ocuparte de eso tú mismo (al menos proporcionan algunos mecanismos para lograrlo ). Es por eso que le recomendaría primero que evalúe un marco de distribución que tenga tales propiedades.

logc
fuente