==== 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