Introdução
Eu trabalho em uma empresa onde corremos muitos trabalhos em lote processando milhões de registros de dados de cada dia e eu estive pensando recentemente sobre todas as máquinas que se sentam em torno de cada dia sem fazer nada durante 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 de grade utilização de ambientes virtualizados.
Na parte 1 eu dei uma visão geral do sistema e as tecnologias que estarão usando, bem como discutimos algumas das possíveis razões por que 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:
- Distribuir os trabalhos, a pedido dos trabalhadores
- Diga trabalhadores que tipo de postos de trabalho para executar
- Empregos Pista
- Certifique-se que os trabalhos são executado apenas 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 estendido para executar vários tipos de trabalhos como a empresa vê o valor em uma solução de rede. Por exemplo, os trabalhos podem ganhar prioridades, mais de um tipo de trabalho pode existir (ou seja, várias bases de código), eventualmente você pode até mesmo executar várias máquinas de trabalho diferentes que são otimizados para cada tipo de trabalho (apesar de que não se afasta 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 a longo prazo e tempo de desenvolvimento maior.
Servidor de trabalho
Nós vamos precisar de um lugar para controlar o nosso trabalho de, este deve ser o único sistema em sua rede que tem um fixo resource locator, seja 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, mão de 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 dele. O servidor de trabalho no entanto é necessário 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 no valor de tempo de processamento (quando comparado com o 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 consistirá em o que eu estou chamando um dos meus servidores Bizkit (que é Li nux, m ySql, P HP). O código em execução em trabalhadores Thea vai realmente descobrir o que ele pode executar trabalhos, interagindo com bancos de dados com emprego de sistemas de controle. Posteriormente, poderíamos criar um serviço web e realmente mão empregos ao invés de ter os trabalhadores fazem o trabalho duro em si, mas por agora vamos continuar usando o princípio KISS (Keep it Simple, Stupid!).
Então, vamos criar três mySQL tabelas para lidar com os trabalhos. Estes serão os `empregos`, `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 por 5 campos simples,
- ID: Identifique o trabalho
- nome: Poderia ser uma referência de cliente, ou qualquer número de outros identificadores
- Status: Você precisa saber onde o trabalho está, por exemplo,
- 0: Não iniciado
- 1: Pegou
- 2: Concluído
- started_by: Quem começou a fazer o trabalho? Isso não é totalmente necessário, mas é um bom ter. Eu sugiro que os trabalhadores de rastreamento pelo seu endereço IP em sua rede
- started_at: Quando o trabalhador iniciar o trabalho? Ao acompanhar 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
É fácil como esta tabela pode ser estendido com alguns campos suplementares para permitir estatísticas de rastreamento, uma coluna de tempo de chegada para ver quanto tempo o trabalho levou, um contador para ver quantos trabalhadores pegou o trabalho (obviamente isso precisa tendem a 1), a prioridade dos trabalhos, a lista pode ir sobre e sobre. Em cenários mais complexos de trabalho seria possível especificar a quantidade de memória que o trabalhador precisaria de acesso (e, portanto, usar apenas os trabalhadores mais adequados), ou mesmo que tipo de trabalhador seria necessário.
Permite adicionar um exemplo poucos empregos:
A próxima tabela novamente é bastante simples de entender, estes são dados que o nosso trabalho. Eles estão ligados à tabela de trabalhos principal por uma coluna `jobs_id`. A composição desta tabela depende muito dos dados que você precisa fornecer a seus trabalhadores, vamos fazer um exemplo muito simples, onde temos quatro colunas:
- id: identificação do registro
- nome: o nome da pessoa
- Endereço: Endereço da Pessoa
- jobs_id: A ID de trabalho que este registro está ligado à
A tabela terceiro e último é constituído por uma tabela de resultados, que tem o mesmo tornar-se como a nossa tabela registos, e com a adição de algumas colunas poderia ser parte da tabela de registos:
- job_record_id: Vincular o resultado para a mesa de trabalho
- Resultado: Os dados do resultado
... E isso é tudo que você precisa para o controle de trabalho! (Embora a um nível muito básico) No meu caso eu estou apontou para outra tabela onde meus dados para processo foi localizado, mas isso pode apenas como facilmente ter sido um arquivo, os parâmetros para executar código de simulação, o nome dele.
Selecionando um emprego
Como mencionado 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 processamento e obter as informações. Como faríamos isso? Bem escolher os nossos critérios de seleção de emprego e procurar emprego, em SQL eu fiz o seguinte:
- Tome todos os trabalhos que não estão marcadas como concluídas, mas do nosso trabalhador e redefini-las (substitua ME__ __ com um identificador mais fácil, seria o endereço IP):
UPDATE `empregos` SET `status` = 0 WHERE `status` = 1 AND `started_by` = __ ME__;
- Usando os nossos critérios de seleção de emprego, selecionar um trabalho e dizer ao sistema de controle que este trabalhador está lidando com isso:
UPDATE `empregos` SET `status` = 1, `started_by` = __ ME__, `started_at` = NOW () WHERE `status` = 0 OR
(`Status` = 1 AND `started_at`> DATE_SUB (NOW (), INTERVAL HOUR X)) ORDER BY `id` ASC;
Ao pegar empregos 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 seguidos pelos registros próprios:
SELECT * FROM `empregos` onde `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 concluído. Lembre-se que os trabalhos podem suspender / retomar a qualquer momento permitem alguma robustez em seu script. Pode ser que a tarefa suspende a meio a atualização do sistema de controle de trabalho, então verificar o número de registros em um trabalho eo número de resultados salvos 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 sobre o trabalho de modo que se você decidir passar a usar um serviço web, um sistema de arquivos baseado em XML , ou qualquer outro número de sistemas que não afetará o código acima.
Configuração do trabalho
O próximo aspecto a considerar é o tamanho do trabalho e configuração. Ao jogar com a configuração do trabalho, podemos encontrar um equilíbrio excelente entre a velocidade, a replicação de processos, e confiabilidade. Dedique alguns cenários OFA casal:
- Empregos tomar 1 a cada dia para ser executado: Isto significa que os 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 processado deve o trabalhador ir AWOL inicial (tempo de pegar que não retornou um resultado mais o tempo de reprocessamento). Em um ideal que você tem pelo menos um trabalho completo facilmente apuradas até ao final de cada período de tempo ocioso, de que maneira você mantém os postos de trabalho mais típico e, na pior caso, um trabalho levaria dois dias para o primeiro processo deveria vão faltar.
- Empregos levar 1 minuto para executar: Isto significa que os trabalhadores levar cerca de 15 minutos para executar cada trabalho. Embora isto possa parecer inicialmente ideal, você ganha processamento trabalho adicional durante a hora do almoço, coffee breaks, reuniões, etc este cenário coloca pressão sobre outras áreas de seu sistema e apresenta seus próprios problemas. Por exemplo, em primeiro lugar a sua razão de tempo de configuração / processamento está a ir direito para baixo, perdendo assim a eficiência do sistema. Sua rede vai ser constantemente informações sobre o trabalho de streaming para a equipe vários trabalhadores frustrante que são dong seu trabalho do dia a dia. Você também vai colocar mais pressão sobre seu trabalho como servidor de processamento que tem que repartir lotes e lotes de pequenas peças de trabalho em uma base regular. Por fim, nesta situação, se o seu servidor de emprego desce você vai criar um log de volta enorme de trabalho incompleto enquanto trabalhos maiores poderia de processamento continuou alegremente inconscientes de que o servidor estava passando por dificuldades de emprego.
Na realidade, não haverá uma configuração ideal para a sua instalação da grade, muito depende dos recursos disponíveis, tipos de trabalho, requisitos do trabalho tempo de produção, capacidade de rede, e assim por diante. No entanto, algumas diretrizes 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)
- Jogue com o tamanho do trabalho de modo 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 dobrar a quantidade de tempo (talvez menos) se espera para concluí-lo assumir que a 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 subsequente falha). Você pode querer reduzir esse tempo, mas tome cuidado para não reduzi-lo muito como você pode começar a duplicação de tarefas de processamento em uma base regular.
- Jobs deve ser independente das exigências externas, tanto quanto possível. O servidor de emprego, por exemplo, só deve ser contactado no início e final de cada trabalho.
- Não saturar sua rede, este terá dois efeitos negativos, sua equipe vai encontrar durante o dia usando a rede frustrante e os problemas podem ser experimentados com conexões tempo limite um problema que só vai piorar quando você escalar a grade.
- Garantir os empregos podem ser executados em seus trabalhadores. Se os trabalhos tornam-se muito espaço de memória trabalhos intensivos ou intensivos disco vai começar a abortar ea única coisa que você notará é uma gota no número de trabalhos processados sem motivo real.
Entregarem os resultados de um trabalho
Ao apresentar os resultados de um trabalho é importante verificar se 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 apresentados assegurar que o número de resultados coincide com o número de registos dentro do trabalho.
Como mencionado anteriormente, e não pode ser mais enfatizado, construir tolerância a falhas na 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. Também mais uma vez abstraindo sua submissão resultados ajudarão atender a futuras alterações ao seu sistema de controle de trabalho muito mais fácil de lidar.
Resumo
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 trabalhos para obter o máximo de nosso sistema de grade escritório. Para finalizar, um parágrafo ou dois sobre como enviar os resultados de volta para o servidor de controle de trabalho foi apresentado.
- Um servidor de controle de trabalho gere empregos e garante que todas as unidades de trabalho são concluídas
- Ao abstrair o seu trabalho Select / resultados submissão podemos mudar a tecnologia do servidor de controle sem muitos problemas
- Configure seus trabalhos para garantir que eles são executados de forma rápida e eficiente, sem colocar demasiada pressão sobre a infra-estrutura de rede, e sem duplicar tarefas de processamento em uma base regular.
- Certifique-se de construir a 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 configurar nossas máquinas de janelas para se tornar ocioso dos trabalhadores a tempo.