# Openstack

OpenStack é um software de código aberto, capaz de gerenciar os componentes de múltiplas infraestruturas virtualizadas. Assim como o sistema operacional gerencia os componentes de nossos computadores, o OpenStack é chamado de Sistema Operacional da Nuvem, por cumprir o mesmo papel em maior escala. É considerado uma plataforma de software, por fornecer APIs que, em conjunto, são capazes de controlar todos os recursos disponíveis na oferta dessa infraestrutura: máquinas virtuais, rede, armazenadores e balanceadores de carga. Até mesmo um painel de controle web está presente entre o conjunto de software do OpenStack - a maior parte escrita em Python.
O OpenStack é um conjunto de projetos de software de código aberto usados para configurar e operar infraestrutura de computação e armazenamento em nuvem. A Rackspace (provedor de infraestrutura americano) e a NASA (agência espacial americana) foram os principais contribuidores iniciais para o projeto. A Rackspace forneceu sua plataforma "Cloud Files" para implementar o aspecto de armazenamento (Object Storage) do OpenStack, enquanto que a NASA entrou com o "Nebula" para implementar o lado computacional (Compute).
O consórcio OpenStack, desde então, agregou mais de 100 membros em menos de um ano, incluindo a Canonical (responsável pelo Ubuntu), Dell, Citrix, Red Hat, IBM, Cisco, Hewlett-Packard, SUSE, VMware, Yahoo!, entre outros.
O OpenStack apresenta seus serviços através de APIs compatíveis com os serviços EC2 e S3 da Amazon AWS e, portanto, aplicações escritas para estes serviços do AWS podem ser usados com OpenStack também.
Há 3 famílias de serviço principais no OpenStack, mais conhecidos por seus nomes próprios:
* Infraestrutura Computacional (Nova)
* Infraestrutura de Armazenamento (Swift)
* Gerenciamento de Imagens (Glance)

## Infraestrutura Computacional (Nova)

Nova é o gerenciador da infraestrutura computacional de uma nuvem OpenStack. Todas as atividades necessárias para manter o ciclo de vida das instâncias de uma nuvem OpenStack são controlados pelo Nova. Ele gerencia todas as necessidades de recursos computacionais, rede, autorização, e escalabilidade da nuvem. O Nova é uma plataforma de gerenciamento, mas não possui nenhuma capacidade de virtualização em si mesmo; ao invés disto, ele usa as APIs libvirt para interagir com os hypervisors suportados. Os serviços são disponibilizados pelo Nova através de web services compatíveis com os da Amazon.

### Funções e Funcionalidades

* Gerenciamento do ciclo de vida das instâncias de máquinas virtuais;
* Gerenciamento dos recursos computacionais;
* Rede e Autorização;
* API REST;
* Comunicação assíncrona "eventualmente consistente";
* Suporte a múltiplos hypervisors: Xen, XenServer/XCP, KVM, UML, VMware, vSphere e Hyper-V.

### Componentes

O Nova é composto dos seguintes componentes principais:
* API Server (nova-api);
* Message Queue (rabbit-mq server);
* Compute Workers (nova-compute);
* Network Controller (nova-network);
* Volume Worker (nova-volume);
* Scheduler (nova-scheduler).

### API Server (nova-api)

O API Server (“Servidor de APIs”) fornece uma interface para que o mundo exterior interaja com a infraestrutura da nuvem. O API Server é o único componente do Nova que o mundo exterior usa para gerenciar a infraestrutura. O gerenciamento é feito através de web services, utilizando uma API compatível com a da Amazon (EC2). Há também uma API própria da OpenStack. O API Server, por sua vez, se comunica com os outros componentes necessários através da Message Queue.

### Message Queue (Rabbit MQ Server)

Os componentes do OpenStack comunicam-se entre si através do protocolo AMQP (Advanced Message Queue Protocol) implementado pela Message Queue ("Fila de Mensagens"). O Nova usa chamadas assíncronas para as requisições, com um mecanismo de call-back que é acionado quando a resposta é recebida. Uma vez que a comunicação é assíncrona, nenhuma das pontas fica bloqueada por muito tempo em um estado de espera. Isto é especialmente importante dado que muitas ações invocadas através das APIs envolvem tempos longos, como criar uma instância ou fazer o upload de uma imagem.

### Compute Workers (nova-compute)

Os compute workers ("trabalhadores") são basicamente daemons que lidam com o ciclo de vida das instâncias de máquinas virtuais. Eles recebem requisições de gerenciamento através da Message Queue e executam as operações correspondentes. Há vários workers em uma instalação típica do OpenStack. Uma instância é criada por qualquer dos workers disponíveis, dependendo do algoritmo de escalonamento em uso.

### Network Controller (nova-network)

O Network Controller ("Controlador de Rede") lida com a configuração de rede das máquinas hospedeiras (nodos). Ele executa operações como alocação de endereços IP, configuração de VLANs, implementação de grupos de segurança e configuração de redes para os nodos.

### Volume Workers (nova-volume)

Volume workers são usados para o gerenciamento de volumes do tipo LVM, realizando operações como criação, deleção, conexão e desconexão de um volume a uma instância. Volumes são uma maneira de prover armazenamento persistente para uso das instâncias, uma vez que o disco principal associado a uma instância não é persistente, e quaisquer mudanças realizadas nele são perdidas quando o disco é desconectado ou a instância terminada. Quando um volume é conectado a uma instância, porém, ou mesmo quando ela é terminada, ele mantém seu conteúdo. Os dados podem ser acessados reconectando-se o volume à mesma ou outra instância.
Todo dado importante acumulado durante o ciclo de vida de uma instância deve ser escrito em um volume, de modo que possa ser acessado mais tarde. Isto tipicamente se aplica ao armazenamento de bancos de dados, etc.

### Scheduler (nova-scheduler)

O scheduler ("escalonador") mapeia as chamadas feitas às APIs aos componentes apropriados. Ele roda como um daemon chamado nova-scheduler e escolhe um determinado servidor compute, network ou volume a partir de um pool de recursos disponíveis dependendo do algoritmo de escalonamento configurado. Um escalonador pode basear suas decisões em fatores tais como carga, memória, distância física, arquitetura da máquina, etc. O nova-scheduler possui uma arquitetura "plugável".
Atualmente o nova-scheduler implementa apenas alguns algoritmos básicos:
* chance ("sorte"): Neste método, um host compute é escolhido aleatoriamente dentre as zonas de disponibilidade.
* availability zone ("zona de disponibilidade"): Semelhante ao chance, mas o host compute é escolhido aleatoriamente dentro de uma determinada zona de disponibilidade.
* simple ("simples"): Neste método, hosts cuja carga esteja menor são escolhidos para rodar a instância. A informação de carga pode ser obtida a partir de um load balancer ("balanceador de carga").

## Infraestrutura de Armazenamento (Swift)

O Swift implementa um repositório para armazenar objetos equivalente ao serviço S3 da Amazon (Simple Storage Service). O Swift é capaz de armazenar bilhões de objetos através de uma API. Suporta, também, redundância, tolerância à falha e streaming de audio e vídeo. É extremamente escalável tanto em termos de tamanho (vários petabytes) como capacidade (quantidade de objetos).

### Funções e Funcionalidades

* Armazenagem de um grande número de objetos;
* Armazenagem de objetos de grande tamanho;
* Redundância de Dados;
* Capacidade de Arquivar – Trabalha com grandes datasets;
* Repositório de dados para máquinas virtuais e aplicações;
* Capacidade de streaming de audio e vídeo;
* Armazenagem segura de objetos;
* Backup e Arquivo;
* Extremamente escalável.

### Componentes

* Swift Proxy Server;
* Swift Object Server;
* Swift Container Server;
* Swift Account Server;
* O Anel;

### Swift Proxy Server

Os clientes interagem com o Swift através de um Proxy Server ("servidor proxy") usando uma API. O Proxy Server localiza as entidades apropriadas e redireciona as requisições para elas.
O Proxy Server também lida com falhas das entidades por meio de redirecionamentos das requisições para entidades de salvaguarda ("handoff entities").

### Swift Object Server

O Object Server ("servidor de objetos") é um repositório do tipo "blob" (Binary Large Object, ou objeto binário grande). Sua responsabilidade é lidar com o armazenamento, recuperação e deleção de objetos do repositório. Objetos são tipicamente arquivos binários, armazenados no sistema de arquivos (filesystem) juntamente com metadados na forma de "extended file attributes" (xattr).
Observação: xattr é suportado em vários filesystems tais como ext3, ext4, XFS, Btrfs, JFS e ReiserFS no Linux. Mas funciona melhor sob XFS, JFS, ReiserFS, Reiser4, e ZFS. Considera-se que XFS é a melhor opção.

### Swift Container Server

O Container Server ("servidor de armazenamento") lista os objetos em um dado container (Object Server). As listas são mantidas em bancos de dados SQLite. O Container Server também mantém estatísticas como o número de objetos armazenados e o tamanho do espaço de armazenamento ocupado por um container.

### Swift Account Server

O Account Server ("servidor de contas") lista containers do mesmo modo que um Container Server lista objetos.

### O Anel

O Anel ("ring") contém informações sobre a localização física dos objetos armazenados pelo Swift. É um mapeamento dos nomes de entidades à suas localizações físicas. Entidades como Accounts, Containers e Objetos possuem seus próprios anéis separados.

## Gerenciamento de Imagens (Glance)

O Gerenciamento de Imagens é um sistema de busca e armazenamento de imagens de máquinas virtuais. Ele pode ser configurado para usar um dos seguintes serviços de armazenamento:
* Swift;
* Amazon S3 diretamente;
* Amazon S3 com Swift como intermediário.

### Funções e Funcionalidades

* Provê gerenciamento de imagens.

### Componentes

* Glance-control;
* Glance-registry.