==== 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:
{{:linux:postgres_docker_cluster.png?400|}}
====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
* 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 \
: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
==== Baixando o repositório git do projeto postgres-docker-cluster ====
* Gere a chave ssh de apenas da máquina pgpool.ifce.edu.br 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 apenas na máquina pgpool
$ git clone git@gitlab.ifce.edu.br:dgti/postgres-docker-cluster.git
==== Fazer deploy dos serviços no Cluster Swarm usando DockerCompose ====
* Liberação de portas no firewall de entrada e saída entre as 3 máquinas do cluster
Porta **TCP** **2377** para gerenciamento de comunicação entre os nós do cluster
Portas **TCP** e **UDP** **7946** para comunicação entre os nós
Porta **UDP** **4789** para o tráfego de rede
Portas **5440** e **5441** para conexão do postgres entre os nós
Porta **9898** para conexão de gerenciamento PCP do postgres
* Suba os serviços [Apenas na máquina pgpool]
$ cd postgres-docker-cluster
$ docker stack deploy --compose-file=docker-compose.yml postgres
==== Comandos úteis ====
* Fazer desassociação de um nó do cluster de forma manual caso o comando docker swarm leave -f não funcione:
sudo service docker stop
sudo rm -Rf /var/lib/docker/swarm
sudo service docker start