Replicação com PostgreSQL 9.4 + PGPool-II 3.4
Hoje irei postar o procedimento para criação de uma base de dados replicada em postgresql usando o pgpool-II. No ambiente de demonstração, existem três computadores virtuais rodando na plataforma XenServer:
- Servidor Banco de Dados 1 – 192.168.5.2
- Servidor Banco de Dados 2 – 192.168.5.3
- Servidor de Conexões (PGPool) – 192.168.5.1
- Usuário ‘postgres’
- Senha ‘ABCD1234’
Todos os servidores possuem o CentOS 6.7 instalado em sua versão mínima, nada mais. A configuração de cada VM vai variar de acordo com a sua necessidade. Vamos começar pelas máquinas de banco de dados. Os comandos abaixo devem ser executados em ambos os servidores de banco de dados.
# Instalar XenTools
mount /dev/cdrom /mnt 2>&1 && /mnt/Linux/install.sh -n && umount /mnt
# Desabilita SELinux
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# Instala o repositorio do PGPool-II
yum install http://www.pgpool.net/yum/rpms/3.4/redhat/rhel-6-x86_64/pgpool-II-release-3.4-1.noarch.rpm -y
# Instala o repositorio do PostgreSQL 9.4
yum install http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-redhat94-9.4-1.noarch.rpm -y
# Instalar utilitarios basicos
yum install postgresql94-server postgresql94-contrib pgpool-II-pg94-extensions sudo wget vim yum-presto yum-utils openssh-clients rsync -y
# Libera o acesso ao pg via rede
sed -i '/-A INPUT -i lo -j ACCEPT/ a -A INPUT -p tcp --dport 5432 -j ACCEPT' /etc/sysconfig/iptables
# Configurar o postgresql para inicializar automaticamente com o sistema
chkconfig postgresql-9.4 on
# Inicializa o banco de dados pela primeira vez
/etc/init.d/postgresql-9.4 initdb
# Inicia o Banco de dados
/etc/init.d/postgresql-9.4 start
# Altera a senha do usuario postgres
passwd postgres
# Reinicia o servidor
reboot
# Acessa a conta do usuário postgres e altera a senha dele no banco de dados
su - postgres
psql
alter user postgres with password 'ABCD1234';
\q
# Ainda na conta do usuário postgres, gerar a chave SSH em cada
# um dos servidores e exportar para o(s) outro(s) servidor(es)
ssh-keygen
ssh-copy-id -i ~/.ssh/id_rsa.pub <IP do outro servidor>
# Libera o acesso entre os servidores e a maquina cliente
cat >>/var/lib/pgsql/9.4/data/pg_hba.conf <<'EOT'
host all postgres 192.168.5.1/32 md5
host all postgres 192.168.5.2/32 md5
host replication postgres 192.168.5.2/32 md5
host all postgres 192.168.5.3/32 md5
host replication postgres 192.168.5.3/32 md5
EOT
# Configurações do PostgreSQL
cat >>/var/lib/pgsql/9.4/data/postgresql.conf <<'EOT'
listen_addresses = '*'
max_wal_senders = 1
wal_level = hot_standby
archive_mode = on
archive_command = 'test ! -f /var/lib/pgsql/9.4/data/archive_log/backup_in_progress || (test -f /var/lib/pgsql/9.4/data/archive_log/%f || cp %p /var/lib/pgsql/9.4/data/archive_log/%f)'
EOT
# Criar e configura a pasta de backup dos logs de transações do PG
install -o postgres -g postgres -m 700 -d /var/lib/pgsql/9.4/data/archive_log
# Reinicia o banco de dados
/etc/init.d/postgresql-9.4 restart
# Cria as extensões necessárias para o recovery dos bancos
echo 'CREATE EXTENSION "pgpool_recovery"' | \
su - postgres -c 'psql template1'
# Habilita pg_basebackup não-interativo
su - postgres
echo '*:*:*:postgres:ABCD1234' > .pgpass
chmod 0600 .pgpass
exit
# Habilita usuário postgres para iniciar e parar o serviço
# de banco de dados no sistema
cat >/etc/sudoers.d/pgpool-postgres <<'EOT'
postgres ALL=(ALL:ALL) NOPASSWD:/etc/init.d/postgresql-9.4 start
postgres ALL=(ALL:ALL) NOPASSWD:/etc/init.d/postgresql-9.4 stop
EOT
sed -i 's/^Defaults requiretty/Defaults !requiretty/g' /etc/sudoers
# Recovery scripts
# Primeiro estagio
cat >/var/lib/pgsql/9.4/data/1st_stage.sh <<'EOF'
#!/bin/sh
TS=$(date +%Y-%m-%d_%H-%M-%S)
MASTER_HOST=$(hostname -f)
MASTER_DATA=$1
RECOVERY_TARGET=$2
RECOVERY_DATA=$3
# Faz um backup removendo a pasta de dados atual
ssh -T $RECOVERY_TARGET \
"[ -d $RECOVERY_DATA ] && mv $RECOVERY_DATA $RECOVERY_DATA.$TS"
# Remove os arquivos de log antigos
rm $MASTER_DATA/archive_log/*
# Cria um arquivo de semaforo
touch $MASTER_DATA/archive_log/backup_in_progress
# Executa um backup do banco de dados
ssh -T $RECOVERY_TARGET \
"pg_basebackup -h $MASTER_HOST -D $RECOVERY_DATA --xlog"
# Configura o arquivo recovery.conf para efetuar o restore
echo "restore_command = 'cp $RECOVERY_DATA/archive_log/%f %p'" | \
ssh -T $RECOVERY_TARGET "cat > $RECOVERY_DATA/recovery.conf"
EOF
# Segundo Estágio
cat >/var/lib/pgsql/9.4/data/2nd_stage.sh <<'EOF'
#! /bin/sh
MASTER_DATA=$1
RECOVERY_TARGET=$2
RECOVERY_DATA=$3
port=5432
# Força o salvamento em disco de sequences nos arquivos de logs
psql -p $port -t -c 'SELECT datname FROM pg_database WHERE NOT datistemplate AND datallowconn' template1|
while read i
do
if [ "$i" != "" ];then
psql -p $port -c "SELECT setval(oid, nextval(oid)) FROM pg_class WHERE relkind = 'S'" $i
fi
done
# Força o salvamento em disco das transações atuais
psql -p $port -c "SELECT pgpool_switch_xlog('$MASTER_DATA/archive_log')" template1
# Copia os arquivos de log
rsync -avx --delete $MASTER_DATA/archive_log/ \
$RECOVERY_TARGET:$RECOVERY_DATA/archive_log/
# Remove o arquivo de semaforo
rm $MASTER_DATA/archive_log/backup_in_progress
EOF
# Script de reinicio remoto
cat >/var/lib/pgsql/9.4/data/pgpool_remote_start <<'EOF'
#!/bin/sh
ssh $1 sudo /etc/init.d/postgresql-9.4 start
EOF
# Seta as permissões dos arquivos criados
chmod +x /var/lib/pgsql/9.4/data/1st_stage.sh
chmod +x /var/lib/pgsql/9.4/data/2nd_stage.sh
chmod +x /var/lib/pgsql/9.4/data/pgpool_remote_start
# Reinicia o servidor
reboot
# Fim
Em seguida, o script para configuração do servidor de conexões (PGPool).
# Instalar XenTools
mount /dev/cdrom /mnt 2>&1 && /mnt/Linux/install.sh -n && umount /mnt
# Desabilita SELinux
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# Instala o repositorio do PGPool-II
yum install http://www.pgpool.net/yum/rpms/3.4/redhat/rhel-6-x86_64/pgpool-II-release-3.4-1.noarch.rpm -y
# Instala o repositorio do PostgreSQL 9.4
yum install http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-redhat94-9.4-1.noarch.rpm -y
# Instala utilitarios basico, pgclient e pgpool
yum install postgresql94 pgpoolAdmin pgpool-II-94 sudo wget vim yum-presto yum-utils openssh-clients rsync -y
# Habilita apache na inicialização
chkconfig httpd on
# Habilita pgpool na inicialização
chkconfig pgpool-II-94 on
# Libera porta 80 e 5432 no iptables
sed -i '/-A INPUT -i lo -j ACCEPT/ a -A INPUT -p tcp --dport 80 -j ACCEPT' /etc/sysconfig/iptables
sed -i '/-A INPUT -i lo -j ACCEPT/ a -A INPUT -p tcp --dport 5432 -j ACCEPT' /etc/sysconfig/iptables
# Adiciona o usuário postgres no sistema e configura
# as permissões no pgpool-II para este usuário
adduser postgres
chgrp -R postgres /etc/pgpool-II-94/
# Criar os arquivos de configurações básicos
cd /etc/pgpool-II-94/
mv pcp.conf.sample pcp.conf
echo "postgres:$(pg_md5 ABCD1234)" >> pcp.conf
mv pgpool.conf.sample pgpool.conf
mv pool_hba.conf.sample pool_hba.conf
sed -i 's/trust$/md5/g' pool_hba.conf
sed -i 's/\(enable_pool_hba =\) off/\1 on/g' pgpool.conf
sed -i "s/^listen_addresses = 'localhost'/listen_addresses = '*'/g" pgpool.conf
sed -i "s/^port = 9999/port = 5432/g" pgpool.conf
touch pool_passwd
pg_md5 -m -u postgres ABCD1234
sed -i 's/^load_balance_mode = off/load_balance_mode = on/g' pgpool.conf
sed -i 's/^replication_mode = off/replication_mode = on/g' pgpool.conf
# Agora, configurando os backends
sed -i 's/^\(backend_\)/# \1/g' pgpool.conf
cat >>pgpool.conf <<'EOT'
backend_hostname0 = '192.168.5.2'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/pgsql/9.4/data'
backend_hostname1 = '192.168.5.3'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/pgsql/9.4/data'
EOT
# Configurando recovery
sed -i 's/^\(recovery_\|client_idle_limit_in_recovery\)/# \1/g' pgpool.conf
cat >>pgpool.conf <<'EOT'
recovery_user = 'postgres'
recovery_password = 'ABCD1234'
recovery_1st_stage_command = '1st_stage.sh'
recovery_2nd_stage_command = '2nd_stage.sh'
client_idle_limit_in_recovery = -1
EOT
# Permissões dos arquivos do pgpool-II
mkdir /var/run/pgpool-II-94
chmod 777 /var/run/pgpool-II-94
mkdir /var/log/pgpool-II-94
chmod -R 777 /var/log/pgpool-II-94
touch /var/log/pgpool-II-94/pgpool_status
chmod 777 /var/log/pgpool-II-94/pgpool_status
chgrp -R postgres /etc/pgpool-II-94
# Libera acesso aos computadores da rede local
cat >>/etc/pgpool-II-94/pool_hba.conf <<'EOT'
host all all 192.168.5.0/24 md5
EOT
# Configura o gerenciador Web (pgpoolAdmin)
sed -i 's/\/usr\/local\/etc\/pgpool.conf/\/etc\/pgpool-II-94\/pgpool.conf/g' /var/www/html/pgpoolAdmin/conf/pgmgt.conf.php
sed -i 's/\/usr\/local\/etc\/pcp.conf/\/etc\/pgpool-II-94\/pcp.conf/g' /var/www/html/pgpoolAdmin/conf/pgmgt.conf.php
sed -i 's/\/usr\/local\/bin\/pgpool/\/usr\/bin\/pgpool/g' /var/www/html/pgpoolAdmin/conf/pgmgt.conf.php
sed -i "s/define('_PGPOOL2_PCP_DIR', '\/usr\/local\/bin');/define('_PGPOOL2_PCP_DIR', '\/usr\/bin');/g" /var/www/html/pgpoolAdmin/conf/pgmgt.conf.php
sed -i "s/define('_PGPOOL2_LANG', 'ja');/define('_PGPOOL2_LANG', 'en');/g" /var/www/html/pgpoolAdmin/conf/pgmgt.conf.php
sed -i "s/define('_PGPOOL2_VERSION', '3.2');/define('_PGPOOL2_VERSION', '3.4');/g" /var/www/html/pgpoolAdmin/conf/pgmgt.conf.php
chgrp -R apache /etc/pgpool-II-94
chmod -R g+rwx /etc/pgpool-II-94
# Fim
Caso tenha encontrado algum erro ou queira sugerir uma melhoria, não deixe de entrar em contato.





Deixe um comentário