# Sistemas de Informação Distribuídos/Infraestrutura
## Redes
### Serviços de Nomes

Serviço de nomes, DNS (Domain Name System, (Sistema de Resolução de Nomes), como é mais conhecido. Trata-se de um recurso usado em redes TCP/IP (o protocolo utilizado na internet e na grande maioria das redes) que permite acessar computadores sem que o usuário ou sem que o próprio computador tenha conhecimento de seu endereço IP; usa para tal uma forma de nomeação dinâmica.

## Identificação

Em sistemas distribuídos, para que haja uma utilidade, é necessário que os nós distribuídos possam se achar uns aos outros e localizar as informações que necessitam. Esse é o problema que este capítulo busca tratar.

## Sincronização

A sincronização de dados nada mais é do que o processo que fazer com que em um ambiente distribuído, os dados de todos os novos sejam os mesmos e assim todo o sistema esteja consistente. Existem vários desafios e estudos sobre este assunto, os quais são abordados neste capítulo.

## Tecnologias para distribuição
### Sistemas de Arquivos Distribuídos
#### Conceitos

Para o entendimento do conceito de sistemas de arquivos distribuídos e suas aplicações em sistemas de informação distribuídos, precisamos ter algumas definições fundamentais. A primeira definição é de serviço, que é um conjunto de facilidades oferecidas aos nós de uma rede por um software que opera em uma ou mais máquinas. Um servidor por suas vez, é o software que opera em uma máquina e que trata de oferecer o serviço. Outra definição é a de cliente, que nesse caso utiliza o serviço do servidor em uma ou várias máquinas. Por último, um sistemas de arquivos é uma parte de um sistema operacional que trata de oferecer um repositório de dados de longa duração. Com esse contexto podemos definir um Sistema de Arquivos Distribuído, que é um sistema onde vários servidores são responsáveis por oferecer o serviço de arquivos para vários clientes instalados em diferentes máquinas. Uma curiosidade sobre sistemas de arquivos é que existem sistemas operacionais que utilizam o mesmo interfaceamento dos sistemas de arquivos para outras funcionalidades além do armazenamento de dados. Um exemplo disso é o UNIX que possui certos arquivos especiais que, na verdade, funcionam como uma interface para dispositivos de entrada e saída. São arquivos “virtuais” para a manipulação fácil destes dispositivos.
Já faz muito tempo que a estrutura de árvore de diretórios é utilizada para organizar o acesso dos usuários aos arquivos em disco. Hoje em dia é a estrutura mais difundida embora existam outras possibilidades em estudo. O uso de ávores de diretorios se popularizou com os sistemas UNIX e DOS. Por exemplo, no UNIX cada arquivo é identificado pelo seu nome e pelo caminho até ele. O caminho é uma sequência de diretórios separados pelo caractere “/” (barra) que indicam a localização lógica do arquivo. Agrupando os arquivos em diretórios e subdiretórios facilita-se a sua manipulação por parte dos usuários. Acrescentando-se o nome do arquivo ao path obtem-se o pathname. Dada a localização lógica de um arquivo, isto é, o caminho até ele, é necessário analisar os componentes deste caminho a fim de encontrar a localização física do arquivo. É preciso descobrir em quais blocos de quais discos de quais servidores se encontra o arquivo em questão. Quando os arquivos de um sistema estão distribuídos entre vários servidores localizados em diferentes máquinas, é desejável que a localização destes arquivos seja transparente aos usuários do sistema. Em outras palavras, quando o usuário desejar ter acesso a um determinado arquivo, ele não deve ter que se preocupar com a localização física do arquivo. Assim, não precisaria saber em qual disco de qual servidor ele esta guardado. Da mesma forma, quando um cliente deseja guardar informações em um arquivo em disco, ele deve apenas fornecer o caminho e o nome do arquivo no qual elas devem ser gravadas.
Algumas características são desejáveis em um sistema de arquivos distribuídos:
* Disponibilidade;
* Escalabilidade;
* Heterogeniedade;
* Segurança;
* Tolerância a Falhas;
* Operações atômicas;
* Acesso concorrente.

#### Servidores de arquivos distribuídos

Abaixo temos sucintamente características dos principais sistemas de arquivos distribuídos.
* NFS: O Network File System, desenvolvido pela SUN Microsystems, é o sistema de arquivos distribuídos mais utilizado em ambiente UNIX. Isto ocorre gracas a iniciativa da SUN de lançar publicamente a especicação do protocolo NFS que permitiu que qualquer fabricante fosse capaz de lancar os seus proprios clientes e servidores NFS. Atualmente, existem implementações do NFS para praticamente todas as plataformas relevantes e todas elas podem compartilhar o sistema de arquivos entre si. No entanto, o NFS apresenta uma série de problemas dentre os quais se destacam a sua velocidade relativamente baixa e a falta de consistência entre os caches dos clientes.
* ANDREW: Desenvolvido na Universidade Carnegie-Mellon, o Andrew File System foi o primeiro sistema de arquivos a oferecer um serviço de alta escalabilidade possibilitando que dezenas de milhares de clientes compartilhassem os arquivos oferecidos por centenas de servidores. Este era o objetivo principal do projeto e foi alcançado através da adoção da semântica de sessão e da utilização de grandes caches em discos locais dos clientes. A fim de limitar a possível falta de segurança em um sistema tão grande, o ANDREW adota uma série de mecanismos como, por exemplo, o Kerberos Authentication Server que permite a autenticação mútua de servidores e clientes.
* CODA: Desenvolvido a partir do ANDREW, o CODA oferece uma alta disponibilidade através da adoção de uma técnica otimista de replicação. A grande peculiaridade deste sistema são as ferramentas que permitem o acesso ao sistema de arquivos a partir de computadores portateis. Existe até a possibilidade de operacão desconectada durante a qual clientes podem acessar o sistema de arquivos sem estabelecer contato com os servidores.
* SPRITE: O Sprite Network Operating System, desenvolvido na Universidade da Califórnia em Berkeley oferece um servico de arquivos muito rápido além de garantir a consistência das informações cacheadas pelos clientes. Foi o primeiro sistema a adotar uma política na qual o espaco reservado para o cache varia dinâmicamente podendo ocupar toda a memória disponível tanto nos servidores quanto nos clientes. Alem do sistema de arquivos distribuído, o SPRITE oferece, ainda, a possibilidade de migração de processos entre as máquinas de uma rede local.
Existe ainda o GoogleFS que é um sistema proprietário de arquivos distribuídos. O seu objetivo é organizar as informações dos sistemas de informação do google, podendo prover então uma gama de serviços como o Gmail a usuários do mundo inteiro. O GoogleFS nasceu da necessidade de gerenciar arquivos gigantescos da sua ferramenta de busca, que precisava persistir dados históricos. O antecessor deste filesystem é o “Bigfiles”, criado no início da empresa google por seus criadores.

#### Estudo de caso

Um estudo de caso eminente nos dias atuais, no que se diz respeito a sistemas de arquivos distribuídos, é o surgimento do GmailFS. Na verdade o GmailFS nada mais é do que um modo de explorar um sistema de informação distribuído que provê ao seu usuário um gigantesco espaço de armazenamento. Ou seja, na realidade o GmailFS não é de fato um sistema de arquivos, porém ele pode ser emulado como tal. A empresa Google disponibiliza aos seus usuários um serviço de emails que utiliza na sua infra-estrutura o GoogleFS, que por sua vez gerencia todo os dados usados pelos emails. Nesse sistema de informação (o Gmail), e por consequência no GmailFS, existem algumas limitações como tamanho máximo de arquivos a serem armazenados e tamanho máximo do disco virtual. Porém, estes problemas podem ser facilmente gerenciados por software uma vez que são problemas estáticos. Ou seja, se quero gravar um arquivo que possui 50mb no meu GmailFS, o software que controla o interfaceamento entre sistema operacional local (GmailFS) e Gmail pode fragmentar este arquivo em vários outros arquivos menores no Gmail. Assim o resultado é o armazenamento transparente para o usuário que utiliza o GmailFS.

### Bancos de Dados Distribuídos

Banco de dados distribuído (BDD) é uma coleção de vários bancos de dados logicamente inter-relacionados, distribuídos por uma rede de computadores. Existem dois tipos de banco de dados distribuídos, os homogêneos e os heterogêneos. Os homogêneos são compostos pelos mesmos bancos de dados, já os Heterogêneos são aqueles que são compostos por mais de um tipo de banco de dados. Este capítulo irá mostrar detalhes e os desafios de bancos de dados em sistemas distribuídos.

### Grades Computacionais
#### Definição

Nos dias atuais, as funções de processamento são limitadas pelas restrições de seu computador pessoal ou mesmo dos servidores e mainframes de sua empresa. Esse cenário é muito comum por se ter um processamento local em uma rede também local, sendo um sistema operacional e suas aplicações executados sem problemas de sobrecarga ou a necessidade de processamento adicional. Porém, podemos imaginar um outro cenário onde seria possível solicitar a solução de qualquer problema para uma entidade, sendo que essa entidade solicitasse outros recursos computacionais quantos forem necessários. Esse cenário está muito perto do alcance de todos e é definido como Grades Computacionais. Muitas empresas investem em pesquisa relacionados a grades computacionais, tendo como exemplo a IBM, Hewlett-Packard e SUN Microsystems. Este tipo de processamento envolve milhares ou milhões de pequenos computadores interconectados através de redes locais ou redes de longas distâncias, como a Internet.

#### Preparando aplicações para grid computing

Nem todas as aplicações podem ser convertidas para executarem em Grades Computacionais. Aplicações que necessitam de interação com o usuário geralmente não se adequadam a grades por serem aplicações que tem um processamento interativo. Um exemplo disso são processadores de texto, onde interações do usuário ocorrem a todo momento e que geralmente não necessitam de um grande poder computacional. Por outro lado, as aplicações que não possuem interação e necessitam de um alto processamento computacional são totalmente indicados para serem executados em uma gride computacional.
Para a conversão de aplicações já implementadas em modo mono-processado (processamento local) para grades computacionais é importante ressaltar que não há uma ferramenta automatizada. Ou seja, por este motivo na maioria das vezes, a conversão de uma aplicação complexa de modo mono-processado para grades computacionais pode não valer a pena.

#### Criando uma estrutura de Grid Computing

Essa tarefa pode ser um tanto complicada e exige aplicações que são ferramentas para que a gerência de tarefas seja possível. Um exemplo é o Globus Toolkit que consiste em um conjunto de serviços que facilitam o processo de construção de uma estrutura de computação em grid. Estes serviços podem ser usados para submissão e controle de aplicações, descoberta de recursos, movimentação de dados e segurança no grid.
OBS.: refêrencia para instalação ?!?!?!?!

#### Exemplos de aplicação de grades computacionais

Abaixo são encontrados alguns exemplos de sistemas de informação e projetos que se beneficiam da infra-estrutura de grides computacionais para tornar um objetivo em comum possível.
* SETI@HOME: Usuários de todo o mundo analisam dados oriundos de laboratórios de astronomia. Poder de processamento de 265 TeraFlops.
* FightAids@HOME: como as drogas interagem com as mutações do vírus da AIDS. Computação voluntária.
* DataGrid: Infra-Estrutura de grade para análise de dados em pesquisas científicas.
* TeraGrid: O objetivo da TeraGrid é construir a maior, mais rápida e mais abrangente infra-estrutura para pesquisa científica.
* Gmail: Usuários de todo o mundo usam uma interface para troca de emails que tem o objetivo de persistência dos seus dados para toda vida disponível sempre que for necessário.
Em um sistema de informação distribuído, grades computacionais podem ser de extrema importância uma vez que necessitam distribuir tarefas dependendo da necessidade do usuário.