Skip to content

Instantly share code, notes, and snippets.

@sebawebber
Last active August 1, 2016 22:39
Show Gist options
  • Select an option

  • Save sebawebber/aa10e9b893e9d648bc10cf6cd09fc56f to your computer and use it in GitHub Desktop.

Select an option

Save sebawebber/aa10e9b893e9d648bc10cf6cd09fc56f to your computer and use it in GitHub Desktop.
SR replication howto

Setup do HOT Standby com Streamming replication

Antes de começar

Remoção dos diretórios de dados (PGDATA)

Antes de iniciar, remova o pare o banco de dados e remova o diretório de dados anterior e recrie-o novamente:

systemctl stop postgresql-9.5
rm -rf /var/lib/pgsql/9.5/data
/usr/pgsql-9.5/bin/postgresql95-setup initdb

Caso tenha sido criado o laboratório anterior de warm standby, remova-o também:

systemctl stop standby-9.5
rm -rf /standby
rm -f /usr/lib/systemd/system/standby-9.5.service
systemctl daemon-reload

Ajustes do SELinux

Desabilite o SELinux, ajustando o arquivo /etc/selinux/config e ajustando o parametro abaixo:

SELINUX=disabled

Atenção! Reinicie o servidor para aplicar essa configuração.

Libere acesso ao servidor PostgreSQL no firewall

Para liberar acesso ao servidor, é necessário aplicar a regra abaixo:

firewall-cmd --add-port=5432/tcp --zone=public --permanent

NOTA: A zona public pode não ser a padrão, sendo assim, execute o comando abaixo para identificar a zona correta:

firewall-cmd --get-active-zones

Tarefas do servidor Master

Ajustes no pg_hba.conf

Edite o arquivo pg_hba.conf disponível no diretório de dados (normalmente em /var/lib/pgsql/9.5/data):

vim /var/lib/pgsql/9.5/data/pg_hba.conf

Ajuste a linha da conexão local, liberando acesso senha ao usuário postgres nas conexões via socket:

local   all     all     trust

Faça reload no banco de dados para aplicar as configurações:

systemctl reload postgresql-9.5

Ajustes do Master

Ajustes dos parâmetros necessários

Abra um terminal psql, conforme abaixo:

psql -U postgres

... e ajuste os parâmetros abaixo:

ALTER SYSTEM SET listen_addresses to '*';
ALTER SYSTEM SET wal_level to hot_standby;
ALTER SYSTEM SET wal_keep_segments TO 256;
ALTER SYSTEM SET max_wal_senders TO 3;

Para utilizar o pg_rewind, também é necessário ajustar o parâmetro wal_log_hints, conforme abaixo:

ALTER SYSTEM SET wal_log_hints TO on;

Saia do psql e reinicie o banco de dados:

systemctl restart postgresql-9.5

Criação de um usuário para manutenção (e replicação)

Em um terminal do psql, rodando com o privilégio de SUPERUSER, execute:

CREATE ROLE replicador PASSWORD 'target' LOGIN REPLICATION;

Saia do psql e ajuste o arquivo de configuração pg_hba.conf, normalmente em /var/lib/pgsql/9.5/data/pg_hba.conf, adicionando a seguinte regra:

host    replication replicador  10.0.10.5X/32   md5

Importante: Lembre de substituir o ip 10.0.10.5X pelo endereço ip dado pelo instrutor, respectivo ao seu colega.

Com isso, efetue o reload do banco para aplicar as novas regras de conexão:

systemctl reload postgresql-9.5

Ajustes do Standby

Efetue os comandos abaixo na máquina do colega.

Crie o diretório de dados (PGDATA) para a instância standby, conforme abaixo:

mkdir /standby
chown postgres. /standby/
chmod 700 /standby/

Logue com o usuário postgres no sistema operacional:

su - postgres

Agora, execute a chamada do pg_basebackup e efetue a cópia do banco master:

/usr/pgsql-9.5/bin/pg_basebackup -U replicador -h 10.0.10.5X --progress --xlog-method=stream --checkpoint=fast -D /standby/pgdata -R

Importante: Lembre de substituir o ip 10.0.10.5X pelo endereço ip dado pelo instrutor, respectivo ao seu colega.

Após a cópia finalizar, ajuste o postgresql.conf, normalmente em /var/lib/pgsql/9.5/data/postgresql.conf, ajustando os seguintes parâmetros:

port = 5555
hot_standby = on
hot_standby_feedback = on

Importante: Lembre de descomentar o parametro para que o mesmo tenha efeito.

Criação do serviço no SO

Copie o serviço existente (postgresql-9.5.service):

cd /usr/lib/systemd/system/
cp postgresql-9.5.service standby-9.5.service

Agora edite as linhas abaixo:

Environment=PGDATA=/standby/pgdata

Atualize o deamon do systemctl e habilite que o servidor inicie automaticamente:

systemctl daemon-reload
systemctl enable standby-9.5

Para finalizar, inicie o banco de dados:

systemctl start standby-9.5

Replications Slots

Ajustes do Master

Para habilitar os replication slots, é necessário abrir um terminal psql e ajustar o seguinte parâmetro:

ALTER SYSTEM SET max_replication_slots to 2;

Após o ajuste, reincie o banco de dados para aplicar a nova configuração:

systemctl restart postgresql-9.5

Por fim, abra um terminal psql e crie o replication slot:

SELECT * FROM pg_create_physical_replication_slot('lab_tt');

Ajustes do Standby

Edite o arquivo de configuração recovery.conf, disponivel no diretório de dados (PGDATA) do standby /standby/pgdata/recovery.conf e adicione a linha abaixo:

primary_slot_name = 'lab_tt'

Reinie o standby para aplicar a configuração:

systemctl restart standby-9.5

Habilitar replicação sincrona (Synchronous Replication)

Ajustes do Master

Para habilitar os replication slots, é necessário abrir um terminal psql e ajustar o seguinte parâmetro:

ALTER SYSTEM SET synchronous_standby_names to 'maquina_coleguinha';

Após o ajuste, faça um reload do banco de dados para aplicar a nova configuração:

systemctl reload postgresql-9.5

Ajustes do Standby

Edite o arquivo de configuração recovery.conf, disponivel no diretório de dados (PGDATA) do standby /standby/pgdata/recovery.conf e ajuste o parâmetro primary_conninfo adicionando o conteúdo abaixo:

application_name=maquina_coleguinha

A linha em questão, do arquivo recovery.conf vai ficar parecida com:

primary_conninfo = 'user=replicador password=target host=10.0.10.5X port=5432 application_name=maquina_coleguinha'

Importante: Lembre de substituir o ip 10.0.10.5X pelo endereço ip dado pelo instrutor, respectivo ao seu próprio servidor.

Reinie o standby para aplicar a configuração:

systemctl restart standby-9.5

Testes

Simular carga de dados no servidor master

Execute os comandos abaixo para simular uma carga de dados no servidor master:

createdb -U postgres tt
createdb -U postgres teste
createdb -U postgres gostei
/usr/pgsql-9.5/bin/pgbench -d gostei -U postgres -i
/usr/pgsql-9.5/bin/pgbench -d gostei -U postgres -T 30 -c 10 

Assumir o servidor standby

Importante: Execute essa instrução apenas quando o instrutor passar a solicitar.

Para assumir o servidor standby, execute o comando abaixo com o usuário postgres

/usr/pgsql-9.5/bin/pg_ctl promote /standby/pgdata

Outra opção seria adicionar o parâmetro trigger_file no arquivo recovery.conf, conforme abaixo:

trigger_file = '/tmp/pgsql.failover.trg`

E no sistema operacional executar o comando:

touch /tmp/pgsql.failover.trg
-- master
[root@lab50 pg_log]# systemctl stop postgresql-9.5
[root@lab50 pg_log]# systemctl stop standby-9.5
[root@lab50 pg_log]# rm -rf /standby/ /var/lib/pgsql/9.5/data/
[root@lab50 ~]# /usr/pgsql-9.5/bin/postgresql95-setup initdb
[root@lab50 ~]# vim /var/lib/pgsql/9.5/data/pg_hba.conf
local all all trust
[root@lab50 ~]# systemctl start postgresql-9.5
[root@lab50 ~]# psql -U postgres
postgres=# ALTER SYSTEM SET listen_addresses to '*';
postgres=# ALTER SYSTEM SET wal_level to hot_standby;
postgres=# ALTER SYSTEM SET wal_keep_segments TO 256;
postgres=# ALTER SYSTEM SET max_wal_senders TO 3;
[root@lab50 ~]# systemctl restart postgresql-9.5
[root@lab50 ~]# psql -U postgres
postgres=# CREATE ROLE coleguinha PASSWORD 'target' LOGIN REPLICATION;
-- standby
[root@lab51 data]# vim /etc/selinux/config
SELINUX=disabled
[root@lab51 data]# mkdir /standby
[root@lab51 data]# chown postgres. /standby/
[root@lab51 data]# chmod 700 /standby/
[root@lab51 data]# su - postgres
[postgres@lab51 ~]$ /usr/pgsql-9.5/bin/pg_basebackup -U coleguinha -h 10.0.10.50 --progress --xlog-method=stream --checkpoint=fast -D /standby/pgdata -R
[postgres@lab51 ~]$ vim /standby/pgdata/postgresql.conf
port = 5555
hot_standby = on
hot_standby_feedback = on # send info from standby to prevent
[root@lab51 data]# vim /usr/lib/systemd/system/standby-9.5.service
Type=forking
Environment=PGDATA=/standby/pgdata
[root@lab51 data]# systemctl daemon-reload
[root@lab51 ~]# systemctl start standby-9.5
--- replications slots
---- master
[root@lab50 ~]# psql -U postgres
postgres=# ALTER SYSTEM SET max_replication_slots to 2;
[root@lab50 ~]# systemctl restart postgresql-9.5
[root@lab50 ~]# psql -U postgres
postgres=# SELECT * FROM pg_create_physical_replication_slot('lab_tt');
----- standby
[root@lab51 ~]# vim /standby/pgdata/recovery.conf
primary_slot_name = 'lab_tt'
[root@lab51 ~]# systemctl restart standby-9.5
---- synchronous
----- master
[root@lab50 ~]# psql -U postgres
postgres=# ALTER SYSTEM SET synchronous_standby_names to 'maquina_coleguinha';
[root@lab50 ~]# systemctl reload postgresql-9.5
---- standby
[root@lab51 ~]# vim /standby/pgdata/recovery.conf
primary_conninfo = 'user=coleguinha password=target host=10.0.10.50 port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres application_name=maquina_coleguinha'
[root@lab51 ~]# systemctl restart standby-9.5
------- rewind
----- standby
[root@lab51 ~]# systemctl stop standby-9.5
[root@lab51 ~]# su - postgres
[postgres@lab51 ~]$ /usr/pgsql-9.5/bin/pg_rewind -D /standby/pgdata/ --source-server='user=postgres password=target host=10.0.10.50 port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres application_name=maquina_coleguinha'
--- mzster
postgres=# ALTER SYSTEM SET wal_log_hints TO on;
[root@lab50 ~]# vim /var/lib/pgsql/9.5/data/pg_hba.conf
[root@lab50 ~]# systemctl reload postgresql-9.5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment