Estou executando testes com PostgreSQL hot standby com 1 mestre e exatamente 1 escravo.
Estou usando as instruções deste guia: http://www.howtoforge.com/how-to-set-up-a-postgresql-9.0-hot-standby-streaming-replication-server-with-repmgr-on-opensuse -11,4
Estou usando PostgreSQL versão 9.1, repmgr 1.1.0 e Ubuntu 10.04 LTS.
Eu segui os passos até o passo 6 no guia onde corri
repmgr -D /var/lib/postgresql/9.1/main -d pgbench -p 5432 -R postgres --verbose standby clone pgmaster
em pgslave.
Então eu fiz um
/etc/init.d/postgresql start
nele e o script (aparentemente) foi concluído com sucesso.
No entanto, a execução do psql gera um erro:
psql: FATAL: o sistema de banco de dados está iniciando
Qualquer ajuda para prosseguir é bem-vinda.
Pesquisei e percebi que o problema era por não habilitar o hot_standby no servidor standby. Escrevi uma versão corrigida, atualizada e simplificada do artigo acima como uma odt para futura referência pessoal. Aqui está o texto na íntegra (convertido para html de odt usando openoffice.org) para aqueles que estão interessados em configurar um único clone somente leitura de um banco de dados usando repmgr:
Single Slave Streaming Replication with PostgreSQL
Introduction
Este guia visa ajudá-lo a configurar rapidamente um servidor PostgreSQL 9.1 com um banco de dados e replicá-lo para um escravo que pode ser usado para consultas somente leitura. Não há conceito de failover envolvido aqui, e o escravo terá apenas uma cópia somente leitura dos dados do mestre.
1. Ferramentas necessáriasUma distribuição GNU/Linux estável (SO recomendado: CentOS 6.2 x86-64 )
PostgreSQL 9.1 – você pode instalar a partir daqui: http://yum.postgresql.org/ (certifique-se também de que os seguintes pacotes ou seus equivalentes estejam instalados)
postgresql
postgresql-client
postgresql-contrib
postgresql-server
postgresql-server-dev
2 estações de trabalho - um mestre que executa o banco de dados primário e um escravo que executa o banco de dados somente leitura replicado (para o propósito deste documento, seus respectivos endereços IP foram substituídos por pgmaster e pgslave , então faça essas alterações em /etc/hosts de ambas as máquinas se você quiser seguir as seguintes instruções palavra por palavra)
2. Verificação de instalação e criação de senhaExecute /etc/init.d/postgresql start em ambos os sistemas para verificar se o PostgreSQL está funcionando ou não.
Execute /etc/init.d/postgresql stop em ambos os sistemas para parar o PostgreSQL. Não usaremos o PostgreSQL até terminarmos algumas tarefas relacionadas à configuração.
Defina uma senha para o usuário postgres em ambos os sistemas. Este usuário por padrão não tem senha, mas precisamos de uma senha para ajudar a criar um túnel SSH entre pgmaster e pgslave.
Execute sudo passwd postgres em ambos os sistemas e digite uma nova senha Unix para ambos.
3. Criação do Túnel SSHNo pgmaster faça o seguinte:
su postgres
ssh-keygen -t rsa (pressione enter a cada prompt)
ssh-copy-id -i ~/ssh/id_rsa.pub pgslave (você precisa inserir a senha postgres do pgslave)
ssh pgslave e veja se consegue logar sem senha
Repita as etapas acima no pgslave
su postgres
sh-keygen -t rsa
ssh-copy-id -i ~/ssh/id_rsa.pubaster
ssh pgmaster e veja se consegue logar sem senha
Certifique-se de sair da máquina remota depois de terminar de verificar a conectividade
4. Editando postgresql.conf no pgmasterVocê precisa fazer as seguintes alterações no arquivo postgresql.conf que reside no diretório de configuração dentro de /etc/postgresql/ em sua máquina pgmaster :
listen_addresses = '*'
wal_level = hot_standby
checkpoint_segments=30
archive_mode=on
archive_command='cd .'
max_wal_senders=2
wal_keep_segments=5000
5. Editando postgresql.conf no pgslaveVocê precisa fazer a seguinte alteração no arquivo postgresql.conf que reside no diretório de configuração dentro de /etc/postgresql/ na máquina pgslave :
hot_standby=ligado
6. Editando pg_hba.conf no pgmastgerVocê precisa fazer as seguintes alterações no arquivo pg_hba.conf que reside no diretório de configuração dentro de /etc/postgresql/ na máquina pgmaster :
hospedar todos os 192.168.5.0/24 confiáveis
replicação de host toda a confiança 192.168.5.0/24
7. Adicionando a pasta bin do PostgreSQL ao PATHHá um monte de utilitários postgresql bacanas que usaremos aqui, então vamos definir a variável PATH para que ela saiba onde encontrá-los
Execute localizar pgbench
A saída será algo como /usr/lib/postgresql/9.1/bin/pgbench
Excluindo a palavra final pgbench, copie o caminho acima e adicione-o à sua variável de caminho.
Execute nano ~/.bashrc
add line export PATH+=:/usr/lib/postgresql/9.1/bin/ (ou qualquer local que o comando de localização revelou)
Feche o arquivo e salve as alterações
Pode ser necessário fazer logoff e login (ou abrir um novo shell) para que as alterações entrem em vigor.
8. Carregando o servidor PostgreSQL do pgmaster com dados fictíciosNo pgmaster, inicie primeiro o servidor PostgreSQL: /etc/init.d/postgresql start
Criamos um banco de dados de teste e o carregamos com alguns dados fictícios com os seguintes comandos:
su postgres
criadob pgbench
pgbench -i -s 10 pgbench
9. Apagando os dados do pgslave e verificando a conectividade do pgmasterVamos apagar o diretório de dados do pgslave, então execute o seguinte nessa máquina:
Primeiro pare o servidor PostgreSQL /etc/init.d/postgresql stop
Vá para a pasta do diretório de dados padrão do PostgreSQL: cd /var/lib/pgsql/data (ou para o diretório de dados padrão para sua instalação)
Esvazie o diretório completamente com rm -rf *
Agora execute psql -h pgmaster -d pgbench e veja se consegue acessar o banco de dados no pgmaster através do pgslave .
10. Instalando repmgrEmbora a replicação de um único escravo seja bastante direta, estamos usando uma ferramenta chamada repmgr para ajudar a tornar o processo ainda mais simples. Aqui está como você o instala:
Pegue o código-fonte repmgr de http://projects.2ndquadrant.it/sites/default/files/repmgr-1.1.0.tar.gz e copie-o para /tmp para instalação.
Tenha os seguintes pacotes instalados para garantir que a compilação repmgr seja possível:
faço
gcc
postgresql-devel
libxslt-devel
pam-devel
libopenssl-devel
krb5-devel
Extraia o arquivo baixado e entre na pasta do código-fonte.
Compilar com make USE_PGXS=1
Instalar com make USE_PGXS=1 install
Execute abaixo dois comandos para verificar se o repmgr está instalado corretamente:
repmgr --versão
repmgrd --versão
11. Clonando pgmaster em pgslave usando repmgrExecute su postgres e faça o login como o usuário postgres no pgslave
Execute isso para clonar o banco de dados: repmgr -D /var/lib/pgsql/data -d pgbench -p 5432 -R postgres --verbose standby clone pgmaster
Observe que o parâmetro -D /var/lib/pgsql/data deve ser substituído pelo local apropriado da pasta de dados no pgslave
Observe também que 5432 é a porta padrão em que o PostgreSQL é executado.
Quando a execução do comando terminar (vai demorar alguns segundos para terminar se você tiver usado o pgbench para inserir dados aleatórios), você pode iniciar o PostgreSQL no pgslave com /etc/init.d/postgresql start
12. Testando a replicação de streamingParabéns! Você configurou com sucesso o pgslave para copiar o banco de dados do pgmaster via replicação de streaming. Observe que, por estar em modo de recuperação contínua, o pgslave só pode ser usado para executar consultas somente leitura e nenhuma inserção ou modificação é possível .
Insira alguns valores em sample_table em pgmaster .
execute select * from sample_table; no prompt psql do pgslave após conectar ao banco de dados pgbench.
Se tudo funcionou corretamente, você poderá visualizar tupples recém-adicionados na saída do pgslave .
ConclusãoAcabamos de aprender como configurar rapidamente um banco de dados PostgreSQL para atuar como um espelho somente leitura para outro banco de dados. Observe que, caso o escravo fique offline, ele recuperará automaticamente os dados do mestre e logo estará atualizado. A replicação de streaming está no nível do banco de dados, portanto, você precisa executar o comando na parte 11 para cada novo banco de dados que precisa ser replicado por meio da replicação de streaming.