Introdução
Eu trabalho em uma empresa onde executar trabalhos de processamento batch muitos milhões de registros de dados de cada dia e eu tenho pensado recentemente sobre todas as máquinas que se sentam em torno de cada dia 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 as tecnologias que vai usar, 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 forma para administrá-los. Seu sistema de controle do trabalho (em seu servidor de trabalho) precisa ser muito bem pensada antes mesmo de tentar executar uma rede de escritório. Portanto, primeiramente, quais são as tarefas de um sistema de controle do trabalho:
- Distribua tarefas, a pedido dos trabalhadores
- Diga trabalhadores que tipo de trabalhos para serem executados
- empregos Track
- Certifique-se que os trabalhos 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 empregos que a empresa vê o valor em uma solução de rede. Por exemplo, os trabalhos podem ganhar prioridades, mais de um tipo de trabalho podem 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 (embora isso não se afastar do "trabalhador genérico 'idéia). Sempre tento pensar no futuro quando os sistemas em desenvolvimento, uma visão de curto prazo pode levar à frustração de longo prazo e tempo de desenvolvimento aumentou.
Trabalho de servidor
Nós vamos precisar de um lugar para o nosso trabalho de controle, este deve ser o único sistema em sua rede que tem um localizador de recursos fixos, seja um endereço IP, nome do host da 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 do trabalho encontrar os trabalhadores).
O servidor de trabalho em si não tem realmente uma tarefa complicada (em um sistema básico de qualquer maneira), ele precisa armazenar uma lista de postos de trabalho, distribuir tarefas, receber os resultados, e posteriormente guardá-las 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, então, que o seu servidor de emprego 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 porém não necessitam de alta disponibilidade, se ele vai para baixo em uma noite de sexta-feira você vai perder toda uma semana de tratamento, pode custar-lhe um par de semanas no valor de tempo de processamento (em comparação 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 por que eu estou chamando uma de Limp meus servidores (que é Li nux, ySql m, P HP). O código em execução trabalhadores the vai realmente trabalhar para fora o trabalho que ele pode executar, interagindo com bancos de dados com o trabalho do sistema de controle. Posteriormente, poderíamos criar um web service 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 os trabalhos. Estes serão «empregos», «jobRecords`, e `jobResults».
Aqui eu estou usando o SQL Buddy um pouco grande alternativa ao phpMyAdmin só porque é mais fácil de instalar no CentOS (para os outros, ver: 10 grandes alternativas ao phpMyAdmin )
Esta tabela é composta de 5 campos simples,
- ID: Identifique o trabalho
- Nome: Poderia ser uma referência de cliente, ou qualquer número de outros identificadores
- Estado: Você precisa saber onde o trabalho está, por exemplo,
- 0: Não iniciado
- 1: Peguei
- 2: Terminado
- started_by: Quem começou a fazer o trabalho? Isto não é totalmente necessário, mas é bom ter. Eu sugiro acompanhamento dos trabalhadores pelo seu endereço IP na rede
- started_at: Quando o trabalhador iniciar o trabalho? Ao acompanhar os trabalhos que não tenham concluído no prazo de X quantidade de tempo que sabemos que precisamos pegar o trabalho, mais uma vez e começar a processar por outro trabalhador. Trabalhadores podem parar o processamento / go off-line para qualquer número de razões, falta de energia, acidente, perda de rede, etc
É fácil como esse quadro poderia ser estendido com alguns campos suplementares para permitir estatísticas de acompanhamento, uma coluna horário de término para ver quanto tempo o trabalho tomou, 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 complexa tarefa seria possível especificar a quantidade de memória que o trabalhador terá acesso ao (e, portanto, usar apenas os trabalhadores mais adequados), ou mesmo que tipo de trabalho seria necessário.
Permite adicionar um exemplo de alguns trabalhos:
A tabela a seguir novamente é bem simples de entender, estes são dados que o nosso trabalho. Eles estão ligados à mesa de trabalho por meio de 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:
- gravar o id: identificação do
- nome: é o nome da pessoa
- endereço: o endereço Pessoa
- jobs_id: O trabalho de identificação de que este registro é ligada à
A tabela a terceira e última consiste em uma tabela de resultados, tem quase a mesma coisa compõem a nossa tabela de registros, e com a adição de algumas colunas poderiam ser parte da tabela de registros:
- mesa de trabalho job_record_id: Link para o resultado do
- 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 estou apontou para outra mesa onde os meus dados para processar foi localizado, mas isso pode apenas como facilmente sido um arquivo, os parâmetros para executar o código de simulação, o nome dele.
Selecionando um emprego
Como dito anteriormente, os trabalhadores vão fazer o nosso trabalho de gestão para nós, por agora, para tudo o que precisamos realmente fazer é encontrar um trabalho que precisa de tratamento e obter as informações. Como faríamos isso? Bem, escolhemos nossos critérios de seleção de emprego e procurar emprego, no SQL eu fiz o seguinte:
- Pegue todos os trabalhos que não são marcadas como concluídas, mas do nosso trabalhador e redefini-las (__ME__ substituir com um identificador, mais fácil seria o endereço IP):
UPDATE `jobs 'SET status` = 0 WHERE status = 1 `E` `= started_by __ME__;
- Usando nosso critério de seleção de emprego, selecione uma tarefa e dizer ao sistema de controle que este trabalhador está lidando com isso:
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 HORA)) ORDER BY `id` ASC;
Ao pegar os trabalhos que não retornou 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 de si:
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 a tarefa como concluída. Lembre-se que os trabalhos podem suspender / retomar a qualquer momento, permitir alguma robustez em seu script. Pode ser que a tarefa suspende a meio de atualizar o sistema de controle de trabalho, para 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, enquanto este demonstra como os trabalhos podem ser selecionados e gerenciados a partir de um quadro de consulta SQL que 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 baseado em arquivo XML , ou qualquer outro número de sistemas que não afetará o código acima dele.
Job Configuration
O próximo aspecto a considerar é a dimensão do trabalho e da 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. Pegue um par of cenários:
- Jobs ter um dia cada um para executar: Isso significa que os trabalhadores necessitam de 15 dias para processar cada trabalho (lembre-se de 10% da energia para 2/3rds do tempo). Este não é claramente uma configuração inteligente, o tamanho do trabalho é muito grande! Levaria pelo menos o dobro do tempo para conseguir um emprego processados caso o trabalhador vá 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é ao 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.
- Empregos tomar um minuto para executar: Isso significa que os trabalhadores levam cerca de 15 minutos para executar cada trabalho. Embora isto possa parecer inicialmente ideal, você ganha o processamento 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 configurar o seu ratio tempo de processamento está a ir direito para baixo, perdendo assim a eficiência do sistema. Sua rede vai ser constantemente fluindo informações sobre o trabalho aos trabalhadores vários funcionários que estão frustrando dong seu dia-a-dia. Você também vai colocar mais pressão sobre o seu trabalho como servidor de processamento tem de prato 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 enorme parte de trás do trabalho incompleto enquanto trabalhos maiores de continuação do processo poderia alegremente inconscientes de que o servidor estava passando por dificuldades de emprego.
Na realidade não haverá uma configuração ideal para a sua configuração de rede, depende muito dos recursos disponíveis, tipos de trabalho, as exigências da função tempo de resposta, capacidade de rede, e assim por diante. No entanto, algumas orientações seriam:
- trabalhos em tamanho de modo que cada trabalhador pode passar por pelo menos 3-4 postos de trabalho em um período de 15 horas (o mais longo período de tempo provável idle)
- Jogar com a dimensão do trabalho a fim de que o tempo de configuração torna-se bastante insignificante quando comparado com o tempo de processamento (tendo em conta o ponto anterior).
- Se um trabalho não for concluído em dobro a quantidade de tempo (talvez menos), você espera que ele completa ela assumir que AWOL seu passado e começar a processá-lo com outro trabalhador. Isto significa que você pode ter que esperar até três vezes o tamanho normal de um trabalho para a conclusão (possivelmente mais, se o trabalho subseqüente falha). Você pode querer reduzir este 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.
- Trabalhos devem ser independentes dos requisitos de fora, tanto quanto possível. O servidor de emprego, por exemplo, só deve ser contatado no início e no final de cada trabalho.
- Não sature sua rede, 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 a escala do grid.
- Certifique-se de trabalhos podem ser executados em seus trabalhadores. Se os trabalhos de tornar-se demasiado espaço de memória trabalhos intensivos ou intensivos de disco começará a abortar ea única coisa que você vai notar uma queda no número de trabalhos processados, sem motivo real.
Entregarem os resultados de um trabalho
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 apresentados garantir que o número de resultados corresponde ao número de registros dentro do trabalho.
Como dito anteriormente, e não pode ser subestimada, construir tolerância a falhas em recuperação de trabalhos e apresentação dos resultados. Os trabalhadores podem (e provavelmente vai) entrar em modo de suspensão no inconveniente na maioria das vezes e isso precisa ser atendidas. Além disso, mais uma vez abstrair sua submissão resultados ajudarão a atender a futuras mudanças no seu sistema de controle de trabalho muito mais fácil de lidar.
Resumo
Neste sectiona nós olhamos o que é um servidor de controle de trabalho precisa de 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 nosso sistema de grade de escritório. Para finalizar, um parágrafo ou dois sobre a apresentação dos 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 são concluídas
- Ao abstrair o trabalho de selecionar / submissão resultados podemos mudar a tecnologia do controle de servidor sem grandes problemas
- Configure o seu trabalho para garantir que eles sejam executados com rapidez e eficiência, 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 o inconveniente e na maioria das vezes. Lembre-se de verificar se os resultados já foram apresentados por outro trabalhador.
Da próxima vez
Na parte 3 , vamos criar o nosso processamento de máquina virtual e configurar o Windows para tornar as nossas máquinas de trabalhadores a tempo ocioso.