Essa é uma revisão anterior do documento!
Visão geral da arquitetura
Nessa arquitetura utilizaremos 3 máquinas em um cluster swarm. A pgPool que irá fazer o balanceamento de carga e monitoramento constante do status das máquinas, bem como o switchover para uma nova máquina master caso a master original venha a cair. Teremos a máquina pgMaster que terá o papel de master e a pgSlave que terá o papel de standby ou slave. A máquina Master ficará em modo Escrita/Leitura e a Slave ficará em modo apenas Leitura. Quando uma consulta de leitura, ex: Select * From users;, poderá ser direcionada pelo pgPool para qualquer uma das duas máquinas, porém, uma consulta de escrita, ex: Insert Into…, só poderá ser direcionada para a máquina Master. Abaixo temos um desenho da infraestrutura de modo geral:
Configurando máquinas
* Configurando o DNS no resolv.conf
$ sudo vim /etc/init.d/resolv.conf
* adicione as linhas:
nameserver 8.8.8.8 nameserver 8.8.4.4
* Configurando o DNS no resolv.conf
$ sudo vim /etc/network/interfaces
* adicione as linhas, logo acima da linha dns-nameservers já existente:
dns-nameservers 8.8.8.8 dns-nameservers 8.8.4.4
Instalando e configurando o Docker
* Adicione a chave do repositório Docker
$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
* Adicione o repositório
$ sudo apt-add-repository 'deb https://apt.dockerproject.org/repo ubuntu-xenial main'
* Adicione o repositório
$ sudo apt-get update
* Instale o pacote do docker
$ sudo apt-get install -y docker-engine
* Adicionando o usuário atual do sistema ao grupo que pode usar o docker sem sudo
$ sudo usermod -aG docker $(whoami)
Instalando Docker Machine
* Obtenha o script
$ wget https://github.com/docker/machine/releases/download/v0.6.0/docker-machine-$(uname -s)-$(uname -m)
* Troque o nome do script
$ mv docker-machine-Linux-x86_64 docker-machine
* Dando permissão de executável
$ chmod +x docker-machine
* Movendo o script para ficar disponível para os usuários
$ sudo mv docker-machine /usr/local/bin
Criando e configurando o cluster com o Swarm
* Inicialize o cluster Swarm na máquina primária, no nosso caso, pgpool.ifce.edu.br
$ sudo docker swarm init --advertise-addr <IP_VALIDO_DA_MAQUINA>
* Obtenha o comando para adicionar novos nós manager
$ sudo docker swarm join-token manager
* Copie o código impresso na tela e execute-o nas outras máquinas. O código será semelhante ao código abaixo:
docker swarm join \ --token <TOKEN_MANAGER> \ <IP_VALIDO_DA_MAQUINA_LEADER>:2377
* Verifique se o cluster está ativo e com todas as máquinas adicionadas. Execute o comando abaixo:
$ sudo docker node ls A resposta será algo parecido com o texto abaixo: ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS xxxxxxxxxxxxxxxxxxxxxxxxx postgres-master Ready Active Reachable xxxxxxxxxxxxxxxxxxxxxxxxx postgres-slave Ready Active Reachable xxxxxxxxxxxxxxxxxxxxxxxxx * pgpool Ready Active Leader
* Adicione labels a cada um dos nós
$ docker node update --label-add pgpool pgpool $ docker node update --label-add pgmaster postgres-master $ docker node update --label-add pgslave postgres-slave
Baixando o repositório git do projeto postgres-docker-cluster
* Gere a chave ssh de cada uma das máquinas para ser adicionada no projeto do gitlab
$ ssh-keygen -t rsa -C "suporte@ifce.edu.br" -b 4096
* Imprima a chave gerada e copie seu conteúdo para as chaves de deploy no gitlab em: Project > Settings > Repository. Use o comando abaixo para imprimir a chave:
$ cat ~/.ssh/id_rsa.pub
* Clone o projeto
$ git clone git@gitlab.ifce.edu.br:dgti/postgres-docker-cluster.git
Fazer deploy dos serviços no Cluster Swarm usando DockerCompose
* Suba os serviços
$ cd postgres-docker-cluster $ docker stack deploy --compose-file=docker-compose.yml postgres