Introdución
Eu traballo nunha empresa na que corremos moitos traballos en lote procesar millóns de rexistros de datos de cada día e eu estiven a pensar recentemente sobre as máquinas que se sentan ao redor de cada día sen facer nada durante varias horas. Non sería bo se puidésemos utilizar esas máquinas para reforzar o poder de procesamento dos nosos sistemas? Neste conxunto de artigos que eu vou ollar para os potenciais beneficios da contratación dunha oficina de reixa utilización de ambientes virtualizados.
Na parte 1 eu dei unha visión xeral do sistema e as tecnoloxías que están empregando, así como discutir algunhas das posibles razóns polo que desexa crear unha rede de oficina.
Job Control
Se indo para ser executado emprego, entón vai ter algunha forma de xestiona-los. O seu sistema de control do traballo (no seu servidor de emprego) ten que ser moi ben pensada antes de intentar realizar unha rede de oficina. Entón, en primeiro lugar, cales son as tarefas dun sistema de control de traballo:
- Distribuír os traballos, a petición dos traballadores
- Diga traballadores que tipo de postos de traballo para realizar
- Traballos Pista
- Asegúrese de que os traballos son executado só unha vez
- Proporcionar datos de emprego aos traballadores, ou polo menos dicirlles onde obtelo
O sistema tamén debe ser extensible, unha solución que funciona de momento nun único caso pode ser estendido para realizar varios tipos de traballos como a empresa ve o valor nunha solución de rede. Por exemplo, os traballos poden gañar prioridades, máis dun tipo de traballo pode existir (ou sexa, varias bases de código), finalmente pode incluso realizar varias máquinas de traballo diferentes que son optimizados para cada tipo de traballo (a pesar de que non se afasta do traballador xenérico 'idea). Sempre intento pensar no futuro no desenvolvemento de sistemas, unha visión a curto prazo pode levar á frustración a longo prazo e tempo de desenvolvemento máis grande.
Servidor de traballo
Nós imos ter un lugar para controlar o noso traballo de, este debe ser o único sistema na súa rede que ten un fixo Resource locator, sexa un enderezo IP, o nome do host URL (usando DNS interno), etc Isto é porque os traballadores teñen que saber onde buscar emprego, os traballadores teñen que atopar o sistema de control de traballo (non o sistema de control de traballo atopar os traballadores).
O servidor de traballo en si non ten realmente unha tarefa complicada (nun sistema básico de todos os xeitos), el que almacenar unha lista de empregos, man de postos de traballo, recibir os resultados, e, posteriormente, almacena-los para a súa posterior recuperación. Como estas pezas (como "man de empregos") son definidos pode ser moi básico. Máis tarde, pode estender o sistema para incluír unha interface de administración para engadir, editar, borrar, suspender os traballos, pero iso está fóra deste exercicio.
Non hai ningunha razón que sexa, entón, que o teu servidor de traballo non podería ser unha máquina virtual executando dentro do seu servidor de procesamento principal, sempre que non drena moitos recursos del. O servidor de traballo con todo é necesario alta dispoñibilidade, se vai para abaixo nunha noite de venres vai perder un fin de semana enteiro de procesamento, potencialmente custando-lle un par de semanas por valor de tempo de procesamento (en comparación co seu servidor de procesamento principal só) . Pode querer poñer o seu servidor de traballo nun ambiente de balanceo de carga para alta dispoñibilidade.
Configuración básica
A configuración básica para o noso servidor de traballo consistirá en que eu estou chamando un dos meus servidores Bizkit (que é Li nux, m ySql, P HP). O código a executar en traballadores Thea vai realmente descubrir o que pode facer traballos, interactuar con bases de datos con emprego de sistemas de control. Posteriormente, poderiamos crear un servizo web e realmente mão empregos en vez de ter os traballadores fan o traballo duro en si, pero por agora imos seguir usando o principio KISS (Keep it Simple, Stupid!).
Entón, imos crear tres MySQL táboas para manexar os traballos. Estes serán os `emprego`, `jobRecords` e `jobResults`.
Aquí está a usar SQL camarada unha boa alternativa pouco para phpMyAdmin só porque é máis fácil de instalar no CentOS (para outros o ven: 10 óptimas alternativas para phpMyAdmin )
Esta táboa está composta por 5 campos simple,
- ID: Identificar o traballo
- nome: Podería ser unha referencia de cliente, ou calquera número de outros identificadores
- Estado: Ten que saber onde o traballo está, por exemplo,
- 0: Non iniciado
- 1: Colleu
- 2: Feito
- started_by: Quen comezou a facer o traballo? Iso non é totalmente necesario, pero é un bo ter. Eu suxiro que os traballadores de seguimento polo seu enderezo IP na súa rede
- started_at: Cando o traballador iniciar o traballo? Ao seguir os traballos que non teñan completado dentro X cantidade de tempo que sabemos que necesitamos para incorporarse o traballo unha vez máis e comezar a procesar por outro traballador. Os traballadores poderían deixar o procesamento / go off-line para calquera número de razóns, falta de enerxía, accidente, perda de rede, etc
É doado como esta táboa pode ser estendido con algúns campos adicionais para permitir estatísticas de seguimento, unha columna de tempo de chegada para ver canto tempo o traballo levou, un contador para ver cantos traballadores colleu o traballo (obviamente iso necesita tenden a 1), a prioridade dos traballos, a lista pode ir sobre e sobre. En escenarios de traballo máis complexos sería posíbel especificar a cantidade de memoria que o traballador precisaría para enlazar (e, polo tanto, utilizar só os traballadores máis axeitados), ou mesmo o tipo de traballador sería necesario.
Permite engadir un exemplo poucos empregos:
A seguinte táboa de novo é moi sinxelo de entender, son datos que o noso traballo. Eles están conectados á táboa de traballos principal por unha columna `jobs_id`. A composición desta táboa depende moito dos datos que precisa ofrecer aos seus traballadores, imos facer un exemplo moi sinxelo, onde temos catro columnas:
- id: identificación do rexistro
- nome: o nome da persoa
- Enderezo: Enderezo da Persoa
- jobs_id: A ID de traballo que este rexistro está ligado á
A táboa terceiro e último está formado por unha táboa de resultados, que ten o mesmo facer se como a nosa táboa rexistros, e coa adición de algunhas columnas podería ser parte da táboa de rexistros:
- job_record_id: vincular o resultado para a mesa de traballo
- Resultado: Os datos do resultado
... E iso é todo que precisa para o control de traballo! (Aínda que a un nivel moi básico) No meu caso eu estou vinculado a outra táboa onde os meus datos para proceso foi localizado, pero isto pode só como facilmente ser un arquivo, os parámetros para executar código de simulación, o seu nome.
Seleccionando un emprego
Como mencionado anteriormente, os traballadores van facer o noso traballo de xestión para nós agora, para todo o que necesitamos realmente facer é atopar un traballo que precisa de procesamento e obter a información. Como faríamos isto? Ben escoller os nosos criterios de selección de emprego e buscar emprego, en SQL eu fixen o seguinte:
- Tome todos os traballos que non están marcadas como concluídas, mais do noso traballador e redefini-las (substitúa ME__ __ cun identificador máis doado, sería a dirección IP):
UPDATE `jobs` SET `status` = 0 WHERE `status` = 1 AND `started_by` = __ME__;
- Using our job selection criteria, select a job and tell the control system that this worker is dealing with it:
UPDATE `jobs` SET `status` = 1, `started_by` = __ME__, `started_at` = NOW() WHERE `status` = 0 OR
(`status` = 1 AND `started_at` > DATE_SUB(NOW(), INTERVAL X HOUR)) ORDER BY `id` ASC;
By grabbing jobs that haven't returned results in X amount of time we ensure that all jobs are run in the event of a worker crashing or going AWOL.
- Next grab the jobs details followed by the records themselves:
SELECT * FROM `jobs` WHERE `started_by` = __ME__ LIMIT 1;
SELECT * FROM `job_records` WHERE `id` = __JOBID__;
Upon completion of the job we insert our result records and mark the job as complete. Remember as jobs can suspend/resume at any time allow for some robustness in your script. It might be that the task suspends half way through updating the job control system, so checking the number of records in a job and the number of results saved back to the job control system would be a wise move.
In addition, whilst this demonstrates how jobs can be selected and managed from an SQL-query frame you should really be abstracting your job control so that if you decide to switch to using a web service, a file based system, XML , or any other number of systems it will not affect the code above it.
Job Configuration
The next aspect to consider is job size and configuration. By playing with job configuration we can strike an excellent balance between speed, process replication, and reliability. Take a couple of scenarios:
- Jobs take 1 day each to run: This means that your workers need 15 days to process each job (remember 10% of the power for 2/3rds of the time). This is clearly not a wise configuration, your job size is way too big! It would take at least double the time to get a job processed should the initial worker go AWOL (time to pick up that it hasn't returned a result plus reprocessing time). In an ideal you'd have at least one full job easily cleared by the end of each long idle period, that way you keep the jobs ticking over and at worst case a job would take two days to process should the first go missing.
- Traballos levar 1 minuto para executar: Isto significa que os traballadores levar uns 15 minutos para realizar cada traballo. Aínda que isto poida parecer inicialmente ideal, gañou procesamento traballo adicional durante a hora do xantar, coffee breaks, reunións, etc este escenario pon presión sobre outras áreas do seu sistema e presenta os seus propios problemas. Por exemplo, en primeiro lugar a súa razón de tempo de configuración / procesamento está a ir dereito para abaixo, perdendo así a eficiencia do sistema. Súa rede vai ser constantemente información sobre o traballo de streaming para o equipo varios traballadores frustrante que son dong seu traballo do día a día. Tamén vai poñer máis presión sobre o seu traballo como servidor de procesamento que ten que repartir lotes e lotes de pequenas pezas de traballo nunha base regular. Por fin, nesta situación, o seu servidor de emprego descende vai crear un rexistro de volta enorme de traballo incompleto mentres traballos maiores podería de procesamento continuou alegremente inconscientes de que o servidor estaba pasando por dificultades de emprego.
En realidade, non haberá unha configuración ideal para a súa instalación da reixa, moi depende dos recursos dispoñibles, tipo de traballo, requisitos do traballo tempo de produción, capacidade de rede, e así por diante. Con todo, algunhas directrices sería:
- Traballos en tamaño de xeito que cada traballador pode pasar por polo menos 3-4 emprego nun período de 15 horas (o máis longo período de tempo probable idle)
- Xoga co tamaño do traballo de xeito que o tempo de configuración tórnase bastante insignificante comparado co tempo de procesamento (tendo en conta o punto anterior).
- Se un traballo non é concluído en dobrar a cantidade de tempo (quizais menos) se espera para completa-lo asumir que a súa AWOL ir e comezar a proceso-lo con outro traballador. Isto significa que pode ter que esperar ata tres veces a lonxitude normal de un traballo para a conclusión (posiblemente máis o traballo posterior falla). Pode querer reducir este tempo, pero Tomé coidado para non reduci-lo moito como podes comezar a duplicación de tarefas de procesamento nunha base regular.
- Jobs debe ser independente das esixencias externas, na medida do posible. O servidor de emprego, por exemplo, só debe atoparse no inicio e final de cada traballo.
- Non saturar a súa rede, este terá dous efectos negativos, o seu equipo vai atopar durante o día a través da rede frustrante e os problemas poden ser probados con conexións tempo de espera dun problema que só vai peor cando escalar a reixa.
- Garantir os postos de traballo poden ser executados nos seus traballadores. Os traballos fanse moito espazo de memoria traballos intensivos ou intensivos disco comeza a abortar eo único que notará é unha gota no número de traballos procesados sen motivo real.
Entregaren os resultados dun traballo
Ao presentar os resultados dun traballo é importante comprobar que os resultados non foron presentados por outro traballador, especialmente se o traballador actual estivo dormente por algún tempo.
Cando os resultados son presentados asegurar que o número de resultados coincide co número de rexistros dentro do traballo.
Como mencionado anteriormente, e non pode ser máis enfatizado, construír tolerancia a fallos na recuperación de traballos e presentación de resultados. Os traballadores poden (e seguramente) entrar no modo de suspensión no máis inconveniente de veces e iso debe ser servidos. Also once again abstracting away your results submission will help cater for future changes to your job control system much easier to deal with.
Resumo
In this section we have looked at what a job control server needs to do and how to get a very basic system set up. We discussed how to retrieve a job from the control system and how best to configure jobs to get the most our of your office grid system. To finish, a paragraph or two on submitting results back to the job control server was presented.
- A job control server manages jobs and ensures that all work units are completed
- By abstracting your job select/results submission we can change the technology of the control server without much problems
- Configure your jobs to ensure that they are run quickly and efficiently without putting too much pressure on your network infrastructure, and without duplicating processing tasks on a regular basis.
- Ensure that you build fault tolerance and error checking into your routines, workers can suspend and resume and the most inconvenient of times. Remember to check if results have already been submitted by another worker.
Next time
In part 3 we'll create our virtual processing machine and set up our windows machines to become idle-time workers.