Configurando mestre
Utilizaremos o usuário
postgres por ser "liberado" para acessar os arquivos de configuração do PostgreSQL:
su postgres
Desative o PostgreSQL:
sudo /etc/init.d/postgresql stop
Acesse o arquivo
/etc/postgresql/9.4/main/postgresql.conf e altere os seguintes itens (não esquecer de descomentar eles retirando o "#" da frente caso tenham):
listen_address = "*" # ou aqui você coloque o IP dos servidores que acessaram, no caso utilizo * para todos
wal_level = logical
max_wal_senders = 3
max_replication_slots = 3 #Quantidade máxima de escravos que replicarão
hot_standby = on
Salvem e saiam do arquivo, agora acesse o arquivo
/etc/postgresql/9.4/main/pg_hba.conf onde utilizaremos o usuário postgres para replicar os dados e acesso de fora do servidor, digite em qualquer parte do código (preferível na última linha):
host replication postgres 0.0.0.0/0 trust
No caso eu coloquei 0.0.0.0/0, mas você pode colocar o IP do escravo para caso seja exclusivo para ele. Inicie o servidor:
sudo /etc/init.d/postgresql start
Caso queira ver o status utilize:
pg_lsclusters
E confira se o status está online, seguimos agora para o próximo passo que é a configuração no escravo.
Configurando escravo - Finalizando
Pararemos o servidor caso em uso:
sudo /etc/init.d/postgresql stop
Novamente como no mestre, utilizaremos o usuário postgres, supondo que estamos na "home" do usuário e que ela seja na pasta
/var/lib/postgresql, no ESCRAVO execute:
pg_basebackup -P -R -X stream -c fast -h XXX.XXX.XXX.XXX -U postgres -D 9.4/main/
No local de XXX.XXX.XXX.XXX coloquem o IP do servidor MESTRE (tá na cara, mas tem que dizer de qualquer modo) e aguardem.
No servidor MESTRE devemos acessar o PostgreSQL para "reservar o slot" para o usuário, portanto voltando ao MESTRE acesse o PostgreSQL e execute o que vem a seguir:
# psql -U postgres
SELECT * FROM pg_create_physical_replication_slot('DIGITE_UM_NOME_DE_USUARIO_PARA_ESCRAVO');
Só isso no mestre, agora voltando ao ESCRAVO, acesse o arquivo recovery.conf, ainda supondo que esteja na home do usuário postgres e que seja /var/lib/postgresql, acesse o arquivo
9.4/main/recovery.conf e acrescente a linha:
primary_slot_name = 'NOME_DE_USUARIO_DIGITADO_PARA_ESCRAVO_AQUI'
Salve o arquivo e saia, apenas isso. Agora sincronizaremos os dados DO servidor mestre PARA o escravo:
sudo rsync -av XXX.XXX.XXX.XXX:/etc/postgresql/ /etc/postgresql/
Pronto, a partir disso você já sincronizou os arquivos, inicie o servidor:
sudo /etc/init.d/postgresql start
Voltando para o servidor veremos o status da replicação:
# psql -U postgres
SELECT * FROM pg_stat_replication;
Onde deve aparecer:
-[ RECORD 1 ]----+------------------------------
pid | 4265
usesysid | 10
usename | postgres
application_name | walreceiver
client_addr | XXX.XXX.XXX.XXX
client_hostname |
client_port | 63704
backend_start | 2015-01-10 17:42:59.555191-05
backend_xmin |
state | streaming
sent_location | 0/50DF5F8
write_location | 0/50DF5F8
flush_location | 0/50DF5F8
replay_location | 0/50DF5F8
sync_priority | 0
sync_state | async
Onde XXX.XXX.XXX.XXX dessa vez é o IP do escravo, se o state diz que está em streaming já está funcionando a replicação, agora se quiser teste criando um banco de dados no servidor (obviamente que não tenha no escravo senão, não tem graça. :v)
CREATE DATABASE testereplicacao;
E confira se no ESCRAVO criou o mesmo banco de dados, se sim, a replicação já está funcionando. Caso queira ver quais slots de replicação estão sendo usados use:
SELECT * FROM pg_replication_slots;
Caso queira ver o status de replicação use:
SELECT * FROM pg_stat_replication;
Caso queira apagar um slot utilize:
SELECT pg_drop_replication_slot('DIGITE_O_NOME_DE_USUARIO_ESCOLHIDO_PARA_ESCRAVO');
Desculpem por possíveis erros de língua portuguesa, talvez falta de informação etc. Este é meu primeiro artigo então peço desculpas por tudo e obrigado por lerem até o final!