DataARTIGO

Alta disponibilidade (Cluster) no PostgreSQL

Como vai funcionar?

O Host1 vai estar disponível para trabalhar com sua aplicação e o Host2 fica em Stand-by (Ele não pode ser acessado).
Pro algum motivo o Host1 para de responder, e agora o que vai acontecer?
O Host2 assume a posição do Host1 de modo transparente ao usuário, só que podemos ter algum tempo de delay para a sincronização e perder algumas informações.

Configurando servidores

Instalação feita em cima do “Debian Lenny” (Nos dois servidores) que utiliza pacotes DEB.
Vamos usar os seguintes software: Postgresql-8.3, postgresql-contrib-8.3, heartbeat-2, nfs-kernel-server e hapm

Instalando software:

apt-get install postgresql-8.3 heartbeat-2 nfs-kernel-server hapm  postgresql-8.3-contrib

Vamos criar o WAL no Host2, o arquivo deve ter permissões de escrita e leitura para ambos os servidores, com o user root:

mkdir /psql-archive<br />chown postgres.postgres /pgsql-archive<br />echo "/psql-archive IP_HOST1 (rw,sync,no_subtree_check)" >> /etc/exports<br />exportfs -a<br />su postgres -c "touch /psql-archive/mounted"

Criando o WAL no HOST1, o arquivo deve ter permissões de escrita e leitura para ambos os servidores, com o user root:

mkdir /psql-archive<br />chown postgres.postgres /psql-archive<br />mount IP_HOST2:/psql-archive /psql-archive

Vamos colocar o WALs ON no Host1. Devemos editar o arquivo “/etc/postgresql/8.3/main/postgresql.conf” colocando o archive_mode como ON e modificando o archive_command (Vamos copiar o Data Base com rsync):

archive_mode = on<br />archive_command = "test -f /psql_archive/mounted && test ! -f /psql_archive/%f && rsync -a %p /psql_archive/%f"

Restart no PostgreSQL Host1:

/etc/init.d/Postgresql-8.3 restart

Fazendo backup de todo Data Base sem para o PostgreSQL Host1:

psql -U postgres

Com isso você vai acessar o console do seu PostgreSQL.

select pg_start_backup('nome_do_seu_bkp');<br />pg_start_backup<br />\q

Após sair do console vamos gerar backup do banco de dados.

su - postgres<br />cd /var/lib/Postgresql/8.3/<br />tar -zcvf /psql-archive/nome_do_seu_bkp.tar.gz *

Isso pode demorar um pouco, dependendo do tamanho do seu Data Base. Após terminar o backup acesse o console do PostgreSQL.

psql -U postgres

Com isso você vai acessar o console do seu PostgreSQL.

select pg_stop_backup();<br />pg_stop_backup<br />\q

No Host2 vamos colocar o backup ON:

mv /var/lib/Postgresql/8.3/main /var/lib/Postgresql/8.3/main.old<br />mv /psql-archive/nome_do_seu_bkp.tar.gz /var/lib/Postgresql/8.3/<br />cd /var/lib/Postgresql/8.3/<br />tar -zxvf nome_do_seu_bkp.tar.gz -C /var/lib/Postgresql/8.3/<br />cd main/<br />rm -Rf ./pg_xlog/*

Vamos editar o arquivo recovery.conf que está dentro do main/ do $PGDATA:

restore_command = '/usr/lib/postgresql/8.3/bin/pg_standby -d -l -r 3 -s 60 -t /psql_archive/trigger.done /psql_archive %f %p %r 2>>/tmp/pg_standby.log'

Start no PostgreSQL Host2:

/etc/init.d/Postgresql-8.3 start

Caso você tente acessar agora o console do PostgreSQL do Host2, ele vai dar erro por motivo do Start-by esta ON.

Mais sobre PostgreSQL

Fundador da nuveo.ai/levpay (com Banco Rendimento) e Matemático pelo IME-USP. Trabalha no dia a dia com inteligência artificial, rede neural (usando técnicas de machine e deep learning) e visão computacional. Com a necessidade de processar grandes volumes de dados o seu foco de pesquisa e desenvolvimento incluem Go, Racket/Clojure (apaixonado por dialeto lisp), Python, sistemas distribuídos, concorrência e já passou por diversos projetos Open Source https://github.com/avelino.

Ver perfil