Cluster de Computadores e Computação em Grade/Grid
Cluster de Computadores
Um cluster de computadores é um sistema que consiste em vários computadores conectados de forma que eles trabalhem como se fossem apenas um sistema.
Existem dois tipos de conexões entre os componentes de um sistema de cluster, as do tipo altamente acopladas, quando há um alto conhecimento entre cada um dos componentes deste sistema e as conexões abstratas, quando os componentes não sabem quase nada um do outro.
Em um Cluster os computadores são usualmente conectados por uma rede local (LAN Local Area Network) e cada nó (servidor) possui o seu hardware próprio, assim como uma instância do Sistema Operacional. Geralmente os nós possuem o mesmo sistema operacional (versão e tipo), assim como o mesmo hardware, porém em alguns casos, como o OSCAR (Open Source Cluster Application Resources) eles podem variar.
Os clusters ficaram populares quando os preços dos microcomputadores caíram e a performance dos seus processadores aumentaram. Em um certo ponto da história ficou mais barato criar um cluster local, conectando-se várias máquinas comuns em uma rede de alta velocidade, do que comprar um supercomputador. Os clusters são utilizados para rodar um programa de alta intensidade computacional em paralelo usando várias máquinas.
Pode-se criar um cluster usando apenas dois computadores, assim como através da utilização de um supercomputador. Um dos primeiros clusters de baixo custo, também conhecido como Stone Supercomputer foi realizado na década de 90. Este cluster foi implementado utilizando-se um toolkit do Linux chamado Parallel Virtual Machines e a Message Passing Interface provando que era possível construir uma máquina de alta performance a um baixo custo.
Enquanto a arquitetura de cluster pode ser utilizada para construir um cluster com poucas máquinas simples, ela também pode ser utilizada para se construir computadores de alta performance. A TOP500 é uma organização que divulga a cada 6 meses um ranking com os 500 computadores mais poderosos do mundo, e alguns destes sistemas são construídos através da utilização da arquitetura de cluster. As grandes empresas fabricantes de hardware estão sempre em uma disputa constante para ficar e manter-se em primeiro lugar desta lista. Esta lista sempre é divulgada em Junho e Novembro.
História
Atributos de um Cluster
Um cluster pode ser construído para diversas funcionalidades, desde para um sistema de negócio como um Web-Service, quanto para sistemas científicos de cálculo intensivo.
Um dos exemplos de cluster para sistemas científicos foi o utilizado no Projeto Genoma Humano, o qual foi um esforço internacional para se mapear o Genoma Humano e a identificação dos nucleotídeos que o compõem. Este projeto iniciou-se em 1990 e foi comunicado como encerrado em Abril de 2003, ele foi feito em 250 laboratórios, usando 5000 cientistas de 17 países diferentes. Com a evolução das máquinas e dos sistemas distribuídos, hoje ele poderia ser feito em 1 semana com apenas 2 pessoas.
Configurações de load balance são realizadas nos clusters para fazer com ele aproveite melhor o hardware disponível. O load balance é realizado pelo Master de forma a distribuir melhor as mensagens a serem processadas entre os nós do cluster.
Os clusters de computador são utilizados para tarefas de alta complexidade, ao invés de tarefas com altas taxas de leitura e escrita, como um banco de dados, ou um webservice. Estes clusters são utilizados por exemplo, para simular batidas de carros, analisar dados de prospecção de petróleo, processamento de imagens, processamento de alto volume de dados Big Data, para cálculos de predição. Um cluster que utiliza máquinas altamente acopladas se aproxima de um supercomputador.
Clusters de alta disponibilidade são aqueles onde existem nós redundantes e eles serão utilizados para entrar em operação quando alguma coisa falha. Estes clusters evitam o ponto simples de falha (single point of failure) e o Linux-HA é o exemplo mais comum deste tipo de cluster em software livre.
Cluster Load Balance
Load balance é uma maneira de distribuir os processos pelo cluster, de forma que eles sejam realizados da forma mais rápida possível, existem muitas formas de distribuir os processos entre os componentes do cluster.
A maneira mais simples de fazer um load balance é a chamada Round-Robin, onde os nós do cluster serão ordenados e cada processo que chega será direcionada ao próximo nó, quando o número de processos for maior que o número de nós, os nós receberão mais de um processo.
Uma outra forma de se distribuir os processos é escolher randomicamente um nó e direcionar o processo para ele, ou também conhecido como distribuição randômica.
Cada processo que será processado por um nó, é armazenado em uma fila, e existe uma distribuição que direciona os processos para o nó que contém a menor fila, assumindo que a menor fila é quem irá processar mais rápido.
Existem sistemas de load balance que calculam o tempo médio de processamento de cada nó, e sempre enviam os processos para as máquinas que possuem o menor tempo médio de processamento. Neste caso, para o cálculo, conta-se o tempo de envio da mensagem até a chegada da resposta.
Existem várias formas de se distribuir as tarefas em um sistema de cluster, mas é impossível determinar qual será a melhor maneira, sem saber pelo menos, como serão as mensagens que o sistema irá receber.
Clusters também são conhecidos por serem homogêneos, ou seja, as máquinas que fazem parte dele contém o mesmo sistema operacional e muitas vezes o mesmo hardware.
Configuração e Design
Um dos problemas de desenvolver um cluster é determinar o quão acoplado estarão os nós deste cluster. Por exemplo, um único processo poderá necessitar de uma frequente comunicação entre os nós, o que implica que este cluster deverá estar inserido em uma rede dedicada. Uma outra possível configuração extrema é quando os nós não necessitam de nenhuma comunicação entre si, o que ocorre nos Clusters Beowulf onde os slaves não se conhecem, o que é bem próximo a um sistema de GRID.
Em um cluster Beowulf tipicamente os nós tem sua própria versão do sistema operacional instalada, sua memória e discos locais. Porém em alguns casos, quando há uma rede dedicada, pode-se instalar um sistema de arquivos distribuído entre os nós, onde todos podem ler ou escrever nele.
Cluster Middleware
O cluster middleware é uma camada de software que orquestra a alocação de tarefas aos nós e torna possível com que o usuário veja um cluster como se fosse apenas uma máquina.
O middleware é responsável pela distribuição das tarefas no cluster e pelo controle do que já foi executado e o que ainda deverá ser executado.
Esta camada de software provê ao usuário uma interface, onde ele poderá se conectar tanto para submeter tarefas, quanto para analisar o que foi e está sendo executado no cluster.
Cluster Beowulf
Um exemplo bem conhecido de cluster de computadores, são os clusters baseados em máquinas Linux chamado de Beowulf. Este cluster consiste em uma rede de computadores que são controlados e acessados por uma máquina conhecida como master simples. O master é quem possui o middleware instalado e no caso do Cluster Beowulf ele possui uma interface para que o cluster possa ser acessado pelos seus usuários. Os nós deste sistema não precisam de nenhum software, somente o sistema operacional.
Em um cluster Beowulf os nós não se conhecem, apenas o master conhece os nós, assim como cada nó só conhece o master. Neste tipo de cluster, as tarefas processadas por eles, não podem necessitar de nenhuma comunicação entre si, ou seja cada nó deverá ser capaz de processar uma tarefa por completo.
Computação em Grid
A computação em Grid difere de um cluster, pois no grid as máquinas estão em localidades diferentes, redes diferentes. Em um grid temos diversas máquinas diferentes atuando como se fossem um único supercomputador.
Nos grids, cada nó irá executar uma função do início ao fim, sem precisar se comunicar com um outro ponto, com isso ele pode ser geograficamente distribuído. Os grids tendem a ser mais dispersos e mais, geograficamente espalhados, do que os clusters. Isso faz com que os grids sejam bem maiores que os clusters, e eles até podem ter controladores, porém caso tenham estes controladores serão também distribuídos. Grids também são conhecidos por serem heterogêneos, ou seja, as máquinas que eles usam para processar os dados, podem conter diferentes sistemas operacionais, assim como diferentes hardwares.
Um grid pode ser utilizado por apenas uma aplicação, porém geralmente eles são desenvolvidos para serem usados por várias aplicações diferentes ao mesmo tempo. Eles geralmente são construídos para ocupar o tempo de processamento ocioso de máquinas. Imagina que uma empresa tenha milhares de computadores, e sabemos que muitas vezes o potencial do hardware não será utilizado por completo o dia todo, neste caso, um grid pode ser instalado para que, quando as máquinas estiverem ociosas, eles assumam o lugar e comecem a processar tarefas.
A coordenação de tarefas entre os nós de um grid não é uma tarefa simples, pois estes nós podem estar espalhados em diversos pontos, por isso esta coordenação utiliza alguns dos exemplos vistos no post de sincronização, assim como alguns softwares específicos tiveram que ser desenvolvidos para controlar este fluxo de informações.
Exemplo de Grid
Um dos exemplos mais conhecidos de GRID é o chamado World Community Grid. Este Grid fica em um site, e vários projetos podem se submeter a utilizar o seu poder de processamento. Nele as pessoas podem baixar um software que ao ser instalado em sua máquina irá utilizar os momentos de baixo processamento dela, por exemplo quando você deixa o computador ligado e vai tomar um café, para processar pedaços de projetos que estão disponíveis no site.
Quando este post foi escrito, dentre os projetos disponíveis no World Community Grid, eram:
- Ajuda a lutar contra a tuberculose
- Luta contra a AIDS
- Melhorar formas de se encontrar água limpa para milhões de pessoas
- Melhorar o desempenho de células solares
- Ajuda a melhorar remédios contra câncer
- Luta contra o EBOLA
Cada um destes projetos possuem milhares de subtarefas, ao se conectar e escolher alguns deles, o seu sistema baixa uma subtarefa, que será processada enquanto sua máquina estiver ociosa, por exemplo, quando o protetor de tela assumir. Esta subtarefa, pode ser processada de uma vez só, ou pode ser processada em vários eventos, imagine que você vá ao banheiro, ou tomar café várias vezes em um dia e em todos estes momentos, a tarefa será processada e ao terminá-la, o resultado será enviado para o coordenador e novas tarefas serão baixadas.
No começo parece ser algo bem simples, mas imagine que é bem complicado adivinhar o quanto de tempo de processamento, uma máquina terá disponível, ao longo do dia, isso varia de máquina para máquina e de pessoa para pessoa. Com isso, no início recebe-se tarefas mais simples, e depois de um tempo, estima-se o quanto em média, sua máquina contribuirá, e isso ajudará a escolher quais tarefas enviar pro seu nó.
Um outro detalhe é, não dá pra confiar que toda tarefa enviada, será processada, imagine que o usuário pode entrar de férias, sua máquina pode ter algum problema físico, ou de software e com isso algumas tarefas serão perdidas. Então, toda tarefa tem uma data de validade, ao recebê-la, sua máquina vai processá-la, mas a sua resposta só será aceita até uma data limite. Caso o coordenador tenha enviado uma tarefa, para ser processada, se ele não receber uma resposta até a data limite, ele reenvia aquela tarefa pra um outro componente processar. Aqui temos um outro problema, caso este reenvio não seja processado novamente, esta tarefa pode ficar atrasada e travar um processo, então é hora de decidir se ela será enviada para mais de um componente processá-la em paralelo.
O controle dos componentes de um Grid parecia ser simples inicialmente, mas pode se mostrar bem complicado, existem várias outras possibilidades de problemas acontecerem e decisões serem tomadas para contornar eles, deixo isto como tarefa mental para os srs.