Introdução
Eu trabalho em uma empresa onde corremos muitos trabalhos em lote de processamento de milhões de registros de dados a cada dia e eu tenho pensado recentemente sobre todas as máquinas que se sentam ao redor de cada e todos os dias sem fazer nada por várias horas. Não seria bom se pudéssemos usar essas máquinas para reforçar o poder de processamento dos nossos sistemas? Neste conjunto de artigos que eu vou olhar para os potenciais benefícios da contratação de um escritório da rede usando ambientes virtualizados.
Na parte 1 eu dei uma visão geral do sistema e tecnologias eu estarei usando, bem como discutidos alguns dos possíveis motivos pelos quais você gostaria de criar uma rede de escritório.
Job Control
Se você estiver indo para ser executado empregos, então você vai precisar de alguma maneira de gerenciá-los. Seu sistema de controle do trabalho (em seu servidor de emprego) precisa ser muito bem pensada antes mesmo de tentar executar uma rede de escritório. Então, em primeiro lugar, quais são as tarefas de um sistema de controle de trabalho:
- Mão empregos fora a pedido dos trabalhadores
- Dizer aos trabalhadores que tipo de postos de trabalho para executar
- Empregos faixa
- Garantir que as tarefas só são executadas uma vez
- Fornecer dados de emprego aos trabalhadores, ou, pelo menos, dizer-lhes onde obtê-lo
O sistema também deve ser extensível, uma solução que funciona por enquanto em um único caso pode ser prorrogado para executar vários tipos de trabalhos como a empresa vê o valor em uma solução de grid. Por exemplo, os trabalhos podem ganhar prioridades, mais de um tipo de trabalho pode existir (ou seja, bases de código várias), eventualmente você pode até mesmo executar várias máquinas de trabalho diferentes que são otimizados para cada tipo de trabalho (embora isso afastar-se do trabalhador genérico 'idéia). Sempre tento pensar no futuro no desenvolvimento de sistemas, uma visão de curto prazo pode levar à frustração de longo prazo e tempo de desenvolvimento aumentou.
Servidor de trabalho
Nós vamos precisar de um lugar para controlar o nosso trabalho de, este deve ser o único sistema na sua rede que tem um fixo resource locator, será que um endereço IP, nome do host, URL (usando DNS interno), etc Isto é porque os trabalhadores precisam saber onde procurar emprego, os trabalhadores precisam encontrar o sistema de controle de trabalho (não o sistema de controle de trabalho encontrar os trabalhadores).
O servidor de trabalho em si não tem realmente uma tarefa complicada (em um sistema básico de qualquer forma), ele precisa armazenar uma lista de empregos, distribuir empregos, receber os resultados, e, posteriormente, armazená-los para posterior recuperação. Como essas peças (como "mão de empregos") são definidos pode ser muito básico. Mais tarde, podemos estender o sistema para incluir uma interface de administração para adicionar, editar, apagar, suspender os trabalhos, mas isso está além deste exercício.
Não há nenhuma razão que seja, então, que o seu servidor de trabalho não poderia ser uma máquina virtual rodando dentro do seu servidor de processamento principal, desde que não drena muitos recursos a partir dele. O servidor de trabalho no entanto não precisam de alta disponibilidade, se ele vai para baixo em uma noite de sexta-feira você vai perder um fim de semana inteiro de processamento, potencialmente custando-lhe um par de semanas de tempo de processamento (quando comparado ao seu servidor de processamento principal sozinho) . Você pode querer colocar o seu servidor de trabalho em um ambiente de balanceamento de carga para alta disponibilidade.
Configuração básica
A configuração básica para o nosso servidor de trabalho será composto do que eu estou chamando um dos meus servidores LIMP (isto é Li nux, m ySql, P HP). O código em execução no thea trabalhadores vão realmente descobrir o que empregos ele pode ser executado através da interação com bancos de dados com o trabalho do sistema de controle. Mais tarde, poderíamos criar um serviço web e realmente entregar os trabalhos em vez de ter os trabalhadores fazem o trabalho duro em si, mas por agora vamos continuar a usar o princípio KISS (Keep it Simple, Stupid!).
Então, vamos criar três mySQL tabelas para lidar com postos de trabalho. Estes serão postos de trabalho ``, `jobRecords`, e `jobResults`.
Aqui eu estou usando SQL camarada uma ótima alternativa pouco para phpMyAdmin só porque é mais fácil de instalar no CentOS (para os outros o vêem: 10 ótimas alternativas para phpMyAdmin )
Esta tabela é composta de 5 campos simples,
- ID: Identifique o trabalho
- Nome: Poderia ser uma referência do cliente, ou qualquer número de outros identificadores
- Status: Você precisa saber onde o trabalho está, por exemplo,
- 0: Não iniciado
- 1: Peguei
- 2: Completed
- started_by: Quem começou a fazer o trabalho? Isto não é totalmente necessário, mas é bom ter um. Eu sugiro que os trabalhadores de rastreamento pelo seu endereço IP em sua rede
- started_at: Quando é que o trabalhador iniciar o trabalho? Acompanhando os trabalhos que não tenham concluído dentro de X quantidade de tempo que sabemos que precisamos para pegar o trabalho, mais uma vez e começar a processar por outro trabalhador. Os trabalhadores poderiam parar o processamento / go off-line para qualquer número de razões, falta de energia, acidente, perda de rede, etc
It is easy how this table could be extended with a few additional fields to allow for statistics tracking, a finish time column to see how long the job took, a counter to see how many workers picked up the job (obviously this needs to tend to 1), job priority, the list can go on and on. In more complex job scenarios it would be possible to specify how much memory the worker would need access to (and therefore only use suitable workers), or even what type of worker would be required.
Lets add a few example jobs:
The next table again is quite simple to understand, these are our job records. They are linked to the main jobs table by a column `jobs_id`. The make up of this table very much depends on the data that you need to supply to your workers, lets make a very simple example where we have four columns:
- id: ID of the record
- name: Person's name
- address: Person's address
- jobs_id: The job ID that this record is linked to
The third and final table consists of a results table, it has much the same make up as our records table, and with the addition of some columns could be part of the records table:
- job_record_id: Link the result to the job table
- result: The result data
…and that's all you need for job control! (albeit at a very basic level) In my case I'm pointed to another table where my data to process was located, but this could just as easily been a file, parameters to run simulation code, you name it.
Selecting a job
Como dito anteriormente, os trabalhadores vão fazer o nosso trabalho de gestão para nós agora, para tudo o que precisamos realmente fazer é encontrar um trabalho que precisa de tratamento e obter as informações. Como poderíamos fazer isso? Bem escolher os nossos critérios de seleção de emprego e procurar emprego, em SQL eu fiz o seguinte:
- Pegue todos os trabalhos que não estão marcados como completa, mas do nosso trabalhador e redefini-las (substituto __ME__ com um identificador mais fácil, seria o endereço IP):
UPDATE `empregos` SET `estado` = 0 WHERE `estado` = 1 AND `` = started_by __ME__;
- Usando nosso critério de seleção de emprego, selecione um trabalho e dizer ao sistema de controle que este trabalhador está a lidar com ele:
UPDATE `empregos` SET `estado` = 1, `` = started_by __ME__, `started_at` = NOW () WHERE `estado` = 0 OR
(`Estado` = 1 AND `started_at`> DATE_SUB (NOW (), INTERVAL HOUR X)) ORDER BY `id` ASC;
Pegando trabalhos que não apresentaram resultados em X quantidade de tempo que assegurar que todos os trabalhos são executados em caso de um trabalhador deixar de funcionar ou se ausentar sem licença.
- Em seguida pegue os detalhes empregos seguido pelos registros próprios:
SELECT * FROM `WHERE` empregos started_by `= __ME__ LIMIT 1;
SELECT * FROM `job_records WHERE` id `= __JOBID__;
Após a conclusão do trabalho que inserir registros nosso resultado e marcar o trabalho como completo. Lembre-se que os trabalhos podem suspender / resumir a qualquer momento permitem alguma robustez em seu script. Pode ser que a tarefa a meio suspende a atualização do sistema de controle de trabalho, assim verificar o número de registros em um emprego e o número de resultados salvo de volta para o sistema de controle de trabalho seria uma medida acertada.
Além disso, embora isso demonstra como os trabalhos podem ser selecionados e gerenciados a partir de um quadro SQL-query você deve realmente ser abstraindo o seu controle de trabalho de modo que se você decidir passar a usar um serviço web, um sistema baseado em arquivo, XML , ou qualquer outro número de sistemas que não afetará o código acima dele.
Configuração do trabalho
O próximo aspecto a considerar é o tamanho do trabalho e configuração. Ao jogar com a configuração de trabalho que podem atingir um excelente equilíbrio entre a velocidade, a replicação de processos e confiabilidade. Dê uma cenários deum casal:
- Emprego assumem um dia cada um para executar: Isto significa que os seus trabalhadores precisam de 15 dias para processar cada trabalho (lembre-se 10% da energia para 2/3rds do tempo). Este não é claramente um sábio configuração, o tamanho do trabalho é muito grande! Levaria pelo menos o dobro do tempo para conseguir um emprego processados deve o trabalhador ir AWOL inicial (tempo de pegar que não tenha retornado um resultado mais o tempo de reprocessamento). Em um ideal que você tem pelo menos um trabalho completo facilmente apuradas até o final de cada período de tempo ocioso, de que maneira você mantém os postos de trabalho mais típico e, no pior caso, um trabalho levaria dois dias para o primeiro processo deveria vão faltar.
- Emprego assumem um minuto para executar: Isto significa que os seus trabalhadores levar cerca de 15 minutos para executar cada trabalho. Embora isto possa inicialmente parecer ideal, você ganha de processamento de trabalho adicional durante a hora do almoço, coffee breaks, reuniões, etc este cenário coloca pressão sobre outras áreas do seu sistema e apresenta seus próprios problemas. Por exemplo, em primeiro lugar a sua razão de tempo de configuração / processamento vai ir para a direita para baixo, perdendo assim a eficiência do sistema. Sua rede vai ser constantemente streaming de informações do trabalho para a equipe de trabalhadores que são vários frustrante dong seu trabalho do dia a dia. Você também vai colocar mais pressão sobre o seu servidor de processamento de trabalho, pois tem de prato para fora lotes e lotes de pequenas peças de trabalho em uma base regular. Por fim, nesta situação, se seu servidor de emprego desce você vai criar um log de volta enorme de trabalho incompleto enquanto trabalhos maiores poderia, continuou alegremente inconscientes de processamento que o servidor estava passando por dificuldades de trabalho.
Na realidade não haverá uma configuração ideal para a sua configuração de rede, muito depende dos recursos disponíveis, tipos de trabalho, emprego requisitos prazos de entrega, capacidade de rede, e assim por diante. No entanto algumas orientações seria:
- Trabalhos em tamanho de modo que cada trabalhador pode passar por pelo menos 3-4 empregos em um período de 15 horas (o mais longo período de tempo provável idle)
- Brincar com o tamanho do trabalho para que o tempo de configuração torna-se bastante insignificante comparado com o tempo de processamento (tendo em conta o ponto acima).
- Se um trabalho não for concluído em o dobro do tempo (talvez menos) você espera que ele completa ela assume que sua AWOL ido e começar a processá-lo com outro trabalhador. Isto significa que você pode ter que esperar até três vezes o comprimento normal de um trabalho para a conclusão (possivelmente mais, se o trabalho subseqüente falhar). Você pode querer reduzir este tempo, mas tome cuidado para não reduzi-lo muito como você pode começar a duplicar tarefas de processamento em uma base regular.
- Empregos devem ser independentes dos requisitos de fora, tanto quanto possível. O servidor de emprego, por exemplo, só deve ser contactado no início e final de cada trabalho.
- Não sature sua rede, isso vai ter dois efeitos negativos, sua equipe vai encontrar durante o dia utilizando a rede frustrante e problemas podem ser experimentados com conexões tempo limite um problema que só vai piorar à medida que você escala sua grade.
- Garantir os empregos podem ser executados em seus trabalhadores. Se os trabalhos se tornam muito espaço de memória trabalhos intensivos ou intensivos de disco começará a abortar ea única coisa que você notará é uma gota no número de trabalhos processados sem motivo real.
Resultados da apresentação de uma Job
Ao apresentar os resultados de um trabalho é importante verificar que os resultados não tenham sido apresentados por outro trabalhador, especialmente se o trabalhador atual tem estado dormente por algum tempo.
Quando os resultados são submetidos garantir que o número de resultados corresponde ao número de registros dentro do trabalho.
Como dito anteriormente, e não pode ser mais enfatizado, construir tolerância a falhas em recuperação de trabalhos e apresentação de resultados. Os trabalhadores podem (e provavelmente vai) entrar em modo de suspensão no mais inconveniente de vezes e isso precisa ser servidos. Além disso, mais uma vez abstrair sua submissão resultados ajudarão atender a futuras mudanças no seu sistema de controle de trabalho muito mais fácil de lidar.
Sumário
Neste sectiona vimos o que é um servidor de controle de trabalho precisa fazer e como obter um sistema bastante básico configurado. Discutimos como recuperar um trabalho a partir do sistema de controle ea melhor forma de configurar tarefas para obter o máximo de nossa grade de seu sistema de escritório. Para terminar, um parágrafo ou dois sobre como enviar os resultados de volta para o servidor de controle de trabalho era apresentado.
- Um servidor de controle de trabalho gere empregos e garante que todas as unidades de trabalho estão concluídas
- Abstraindo o seu trabalho select / resultados submissão podemos mudar a tecnologia do servidor de controle sem problemas muito
- Configure seus trabalhos para garantir que eles são executados com rapidez e eficiência, sem colocar demasiada pressão sobre a infra-estrutura de rede, e sem duplicar o processamento de tarefas em uma base regular.
- Certifique-se de construir tolerância a falhas e checking erro em suas rotinas, os trabalhadores podem suspender e retomar e mais inconveniente de vezes. Lembre-se de verificar se os resultados já foram apresentados por outro trabalhador.
Próxima vez
Na parte 3 , vamos criar a nossa máquina de processamento virtual e estabelecer as nossas máquinas de janelas para se tornar ocioso trabalhadores a tempo.