Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Objetivo
Manter a disponibilidade do servio de banco de dados PostgreSql de maneira automatizada, utilizando um recurso nativo de PITR do PostgreSQL. Documentar completamente os passos para uma implantao sobre Debian GNU / Linux 5.x "Lenny".
Escopo
A proposta de um sistema de alta disponibilidade Nvel 1 e continuidade do servio de at 99%, em cenrios aplicveis, e com simplificao do plano de contingncias, no focando em outras caractersticas como replicao, balanceamento de carga e fail over.
Para estas outras caractersticas, contamos com outras solues interessantes que poderiam se aplicar em conjunto ao projeto e elevar a disponibilidade at Nvel 4 e continuidade de servios de 99,999% buscando eliminar SPOF (Simple Point of Failure, porm com uma complexidade maior.
Por exemplo PgPool, Slony-I, SqlRelay, Bucardo, GlusterFS, PaceMaker, bancos de dados geograficamente distribuidos entre vrios centros de dados.
Precaues
Antes de iniciar a implementao dessa soluo, importante saber que o banco de dados primrio enviar constantemente arquivos para o servidor secundrio, afim de que esse receba exatamente as mesmas atualizaes que aquele. Dessa forma, extremamente importante que os dois bancos de dados estejam sempre ativos e que haja comunicao entre as duas mquinas, na forma do compartilhamento NFS. Caso surja algum problema que afete o mapeamento NFS ou o funcionamento em standby do servidor secundrio, os arquivos deixaro de ser consumidos e passaro a se acumular no disco de uma das mquinas, podendo
1 de 19
inviabilizar a soluo ou at mesmo causar o travamento do servidor principal, em funo do esgotamento da capacidade do disco. Considerando o fluxo de informaes do banco e os parmetros definidos no arquivo de configurao, esses arquivos acumulados podem alcanar o tamanho de 23 GB dirios, sendo extremamente recomendado o uso de uma soluo adicional de monitoramento do espao em disco, tanto do servidor principal como do secundrio.
Premissas
Para aplicao dessa soluo, subentende-se que o ambiente j tenha um servidor Debian Lenny rodando o servio de banco de dados (PostgreSQL) e que haja mais um servidor disponvel, com a instalao bsica do Debian Lenny. necessrio, ainda, que os sistemas tenham seus repositrios configurados segundo o documento Configurar APT No Debian. Considera-se, nos procedimentos abaixo, que a ltima verso estvel do PostgreSQL disponvel nos repositrios do Debian a 8.3.
Pinning
Caso a verso do banco de dados em uso no servidor primrio seja anterior ltima, pode ser necessrio fazer APT PINNING pacote do postgresql, impedindo que haja upgrade da verso do de verso, liberando somente atualizaes de segurana. Para isso, edite o arquivo /etc/apt/preferences nas duas mquinas, incluindo o trecho abaixo (a verso listada e o pacote so exemplos): Package: postgresql-8.1 Pin: version 8.1.* Pin-Priority: 1001
IPs Utilizados
necessrio saber, de antemo, os IPs que sero utilizados na implementao desses procedimentos. Nesse documento, como exemplo, so utilizados os seguintes IPs:
2 de 19
Para mapear o NFS corretamente, necessrio utilizar o mesmo uid e gid do usurio postgres nas mquinas primria e secundria. Para isso, descubra os dados desse usurio na mquina primria atravs do seguinte comando:
Antes de instalar o postgresql na mquina secundria, crie manualmente o usurio postgres, utilizando o mesmo uid e gid da mquina primria (no exemplo, 103 e 106, respectivamente), atravs dos seguintes comandos:
debianpgcluster2:~# groupadd --gid 106 postgres debianpgcluster2:~# adduser --system --home /var/lib/postgresql --shell /bin/bash --uid 103 --gid 106 --disabled-password postgres
Procedim
entos
Este documento se iniciou baseado na Proposta de Alta Disponibilidade para PostgreSQL, mas contm mudanas conceituais importantes sobre aquele.
Inclua nesse arquivo o nome das duas mquinas reais, conforme exemplo abaixo: #versao 25Mai2010 127.0.0.1 localhost 10.200.27.32 debianpgcluster2 10.200.27.17 debianpgcluster1 # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters PostgreSQL HA WAL shipping 3 de 19
Instalar heartbeat, mon, postgresql, postgresql-contrib, nfs, rsync e sudo na mquina secundria
ff02::3 ip6-allhosts debianpgcluster2:~# apt-get update debianpgcluster2:~# apt-get upgrade debianpgcluster2:~# apt-get install heartbeat nfs-kernel-server rsync mon postgresql postgresql-contrib sudo
Configurar
Inclua nesse arquivo o compartilhamento do diretrio /pgsql-archive, conforme exemplo abaixo. As opes do NFS definem que as escritas sero sncronas, para maior garantia de integridade, e que no sero permitidos comandos remotos de root, por questes de segurana. #versao 25Mai2010 # /etc/exports: the access control list for filesystems which may be exported # to NFS clients. See exports(5). # # Example for NFSv2 and NFSv3: # /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check) # # Example for NFSv4: # /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check) # /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check) # /pgsql-archive 10.200.27.17(rw,sync,no_subtree_check,root_squash)
Expo
rtar o diretrio da mquina secundria Criar um arquivo para verificao de montagem e alterar propriedade
debianpgcluster2:~# exportfs -a debianpgcluster2:~# su postgres -c 'touch /pgsql-archive/mounted.txt'
4 de 19
O servio somente voltar a ficar ativo num evento de falha do servidor primrio. Enquanto no ocorrerem problemas, o servidor secundrio operar continuamente em standby.
Para que o heartbeat consiga redirecionar as requisies, preciso que o PostgreSQL responda queries em todas as interfaces. Nessa configurao, a segurana passa a ser provida pelo pg_hba.conf. Para isso, edite a opo listen_addresses, do arquivo postgresql.conf, segundo o exemplo abaixo:
#versao 31Mai2010 listen_addresses = '*' # what IP address(es) to listen on; # comma-separated list of addresses; # defaults to 'localhost', '*' = all # (change requires restart)
Caso seja necessrio, libere o acesso a consultas para o IP virtual (10.200.27.18, no exemplo) e o IP do servidor secundrio (10.200.27.32, no exemplo), incluindo esses endereos no pg_hba.conf da mquina primria. Utilize esse mesmo arquivo de configurao na mquina secundria. Obs.: Esse arquivo deve conter todos os clientes (ou redes) que acessaro o banco de dados. No exemplo abaixo, foi includo o IP 10.200.27.40, simulando a configurao de um cliente. Deve-se definir o mtodo de autenticao que for apropriado. No exemplo, foi utilizado o md5. #versao 27Mai2010 # Database administrative login by UNIX sockets local all postgres # TYPE DATABASE USER CIDR-ADDRESS
# "local" is for Unix domain socket connections only local all all # IPv4 local connections: host all all 127.0.0.1/32 # IPv6 local connections: host all all ::1/128 host all all 10.200.27.32/32 host all all 10.200.27.18/32 md5 md5
5 de 19
Crie o arquivo /etc/ha.d/resource.d/trigger, conforme o modelo abaixo. Obs.: Os scripts de ao do heartbeat precisam aceitar os mesmos parmetros dos que esto em /etc/init.d , seguindo o padro LSB. #!/bin/sh #versao 08out2009 por Joao Cosme de Oliveira Junior case "$1" in start) echo "starting failover postgresql" su postgres -c 'touch /pgsql-archive/trigger.done' exit 0 ;; stop) echo "uneed to stop anything" exit 0 ;; esac
Criar e
Crie o arquivo conforme o modelo abaixo. Note que o tempo para considerar um n morto (deadtime) precisa ser o dobro do tempo usado (interval) no programa mon.
importante notar que '''no''' haver retorno automtico ao n primrio, mesmo que ele seja restabelecido, para evitar inconsistncia nos dados do banco. Aps um chaveamento, o n secundrio ter dados vlidos mais novos que o n primrio e ser necessria uma interveno manual para o failback, fazendo a retirada dos dados do n secundrio e carga no n primrio, numa parada programada.
6 de 19
#versao 25Mai2010 keepalive 1 deadtime 20 warntime 10 initdead 60 logfile /var/log/ha.log auto_failback off bcast eth0 node debianpgcluster1 node debianpgcluster2
Crie o arquivo conforme o modelo abaixo. Nele configurado o IP virtual e definido que o servio ser oferecido preferencialmente pela mquina primria.
A seqncia de parada de alta disponibilidade ser trigger e depois chaveamento de ip. O servio postgresql estar SEMPRE ativo (em modo recovery) na mquina secundria, para ficar lendo e consumindo os arquivos WAL. #versao 31Mai2010 debianpgcluster1
No modelo abaixo, definido o mtodo "1" de autenticao como criptografado "sha1" e configurada a senha "pgha". Utilize alguma senha difcil de deduzir e igual nas duas mquinas.
Para que o contedo do arquivo possa ser lido apenas pelo usurio root, execute o comando abaixo:
7 de 19
Cria
Editar
Inclua nesse arquivo a ltima linha do modelo abaixo, alterando as configuraes para a sua realidade. As outras linhas apenas ilustram o formato do fstab e dever ser adequadas a cada servidor.
#versao 25Mai2010 # /etc/fstab: static file system information. # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 /dev/hda1 / ext3 errors=remount-ro 0 1 /dev/hda5 none swap sw 0 0 /dev/hdc /media/cdrom0 udf,iso9660 user,noauto 0 0 /dev/fd0 /media/floppy0 auto rw,user,noauto 0 0 10.200.27.32:/pgsql-archive/ /pgsql-archive nfs rw,sync,soft,intr 0 0
Im
Rode o comando abaixo e verfique a sua sada. Nesse momento, deve existir apenas o arquivo mounted.txt, de propriedade de postgres.postgres.
8 de 19
Para que o heartbeat consiga redirecionar as requisies, preciso que o PostgreSQL responda queries em todas as interfaces. Nessa configurao, a segurana passa a ser provida pelo pg_hba.conf. Para isso, edite a opo listen_addresses, do arquivo postgresql.conf, segundo o exemplo abaixo:
#versao 31Mai2010 listen_addresses = '*' # what IP address(es) to listen on; # comma-separated list of addresses; # defaults to 'localhost', '*' = all # (change requires restart)
Configure o WAL archiving, conforme o modelo abaixo. '''Importante:''' As configuraes definidas nesse exemplo foram a gerao de um arquivo WAL a cada 60 segundos, mesmo sem atividade. Isso garante um tempo mximo para uma janela de perda de dados, mas gera um grande volume de arquivos. Obs.: Ateno para as aspas simples. # - Archiving archive_mode = on # allows archiving to be done # (change requires restart) archive_command = 'test -f /pgsql-archive/mounted.txt && test ! -f /pgsql-archive/%f && rsync -a %p /pgsql-archive/%f' # command to use to archive a logfile segment archive_timeout = 60 # force a logfile segment switch after this # time; 0 is off
Antes de executar o comando abaixo, verifique se a mquina secundria est ativa, pois o postgresql precisar do compartilhamento nfs para gravar os arquivos WAL.
Edite o arquivo conforme o modelo abaixo. O HAPM derrubar o heartbeat na mquina primria caso no obtenha resposta na porta local 5432 (banco de dados). Obs.: O parmetro "time" precisa ser maior que os "initdead" e "deadtime" do heartbeat. ######################################################################## ### # # # hapm.conf # # # # This file haves hapm configurations # # # # High Availability Port Monitor is a Free Software under GNU/GPL License # # # # This is a Brazilian Project created by: # # # # - Alexandre Antonio Antunes de Almeida # # - Joao Eriberto Mota Filho # # - Rosemeri Dantas de Oliveira # # # ######################################################################## ### # You must make one line by IP/Port. Use one IP and port by line only. #socket=127.0.0.1:5432 socket=10.200.27.17:5432
# This is the time in seconds to check the port status. Caution to use small # values here or your processor will be very busy. You must use a value # between 0 and 3600. To use small values check performance with #top # command (see CPU idle field). time=120
10 de 19
# The Heartbeat start/stop script path heartbeat=/etc/init.d/heartbeat # Check where Heartbeat make the PID file and set it below. # Default is /var/run/heartbeat.pid heartbeatpid=/var/run/heartbeat.pid
#versao 25Mai2010 keepalive 1 deadtime 20 warntime 10 initdead 60 logfile /var/log/ha.log auto_failback off bcast eth0 node debianpgcluster1 node debianpgcluster2
Crie o arquivo conforme o modelo abaixo. Nele definido o n primrio e configurado os recursos a serem gerenciados pelo heartbeat: o IP virtual e o servio de banco de dados.
IMPORTANTE:
* O heartbeat controlar o incio e parada do postgresql. * Os dois recursos configurados nesse arquivo (IP virtual e banco de dados) inicializaro somente aps o tempo definido do parmetro ''initdead'', do arquivo ''ha.cf''.
No modelo abaixo, definido o mtodo "1" de autenticao como criptografado "sha1" e configurada a senha "pgha". Utilize alguma senha difcil de deduzir e igual nas duas mquinas.
Para que o contedo do arquivo possa ser lido apenas pelo usurio root, execute o comando abaixo:
Entre no prompt do psql como superusurio postgres e comece o processo de criao de um backup inicial com a identificao YYYYMMDD, conforme exemplificado abaixo: debianpgcluster1:~# su - postgres postgres@debianpgcluster1:~$ psql Bem vindo ao psql 8.3.9, o terminal iterativo do PostgreSQL. Digite: \copyright para mostrar termos de distribucao \h para ajuda com comandos SQL \? para ajuda com comandos do psql \g ou terminar com ponto-e-vi-rgula para executar a consulta \q para sair
O execuo do comando vai durar um tempo proporcional ao tamanho dos bancos de dados no servidor.
Como o engine do banco de dados estar em execuo, poder haver avisos de arquivos alterados durante a compactao.
12 de 19
inicial
postgres@debianpgcluster1:~$ psql Bem vindo ao psql 8.3.9, o terminal iterativo do PostgreSQL. Digite: \copyright para mostrar termos de distribuicao \h para ajuda com comandos SQL \? para ajuda com comandos do psql \g ou terminar com ponto-e-vi-rgula para executar a consulta \q para sair
Antes de executar os comandos abaixo, certifique-se de que o PostgreSQL esteja parado. Podese mover a antiga base de dados "main" ou apag-la. Os comandos abaixo armazenam essa antiga base no diretrio "main.old1".
invoke-rc.d postgresql-8.3 stop cd /var/lib/postgresql/8.3/ mv main main.old1 tar -xzvf /pgsql-archive/backup_20100525.tar.gz rm -rf main/pg_xlog/*
Crie o arquivo conforme o modelo abaixo. Se houver um chaveamento, o postgresql renomear esse arquivo para "recovery.done". Obs.: Ateno para aspas simples.
Conceda a propriedade desse arquivo ao usurio postgres e remova os arquivos de log, caso existam.
Configurar o Mon
O Mon servir para evitar situaes de split-brain caso haja uma interrupo na rede, j que no usaremos conexo direta de controle de heartbeat (cabo crossover) entre as mquinas. Para configur-lo, siga as instrues do documento Como Configurar MON Para Monitorar . Remotamente Em Sistemas Debian
Reiniciar o cluster
de alta disponibilidade
1. Reinicie a mquina secundria. Ela precisa ser iniciada primeiro, para disponibilizar o diretrio NFS para a primria.
2. Para que a mquina secundria no interprete o reboot do n primrio como uma queda do PostgreSQL HA WAL shipping 14 de 19
3. Reinicie a mquina primria. Os recursos configurados no heartbeat (IP virtual e postgresql) iniciaro aps decorido o tempo definido no parmetro ''initdead'', no arquivo ''ha.cf'' (60 segundos, nesse modelo).
4. Confira se o diretrio compartilhado foi montado corretamente na mquina primria. O comando abaixo dever retornar ao menos o arquivo ''mounted.txt''.
5. Caso a montagem do diretrio NFS no tenha sido bem sucedida, force esse procedimento atravs do seguinte comando:
debianpgcluster1:~# mount -a
OBSERVAES:
* A mquina secundria permanecer com o servio postgresql em modo ''recovery'' at que ocorra um chaveamento.
* Num chaveamento, o IP virtual repassado para a mquina secundria, o postgresql recebe o ''trigger.done'' e o servio sai do modo ''recovery'', passando a responder transaes. * '''No''' haver retorno automtico de servio para o n primrio. Esse procedimento dever ser feito manualmente, durante uma parada programada, seguindo os passos abaixo.
Isso porque durante algum tempo a secundria recebeu dados novos e vlidos.
Se for possvel tolerar algum downtime, o modo mais simples fazer uma parada programada de tudo para retirar os dados da secundria, carregar na primria e refazer o backup inicial para a secundria.
* Parar o cliente que origina as queries. * Bloquear temporariamente por iptables as queries vindas do cliente.
Garant
Extrair todos
Carregar
Parar ambos os
postgresql
debianpgcluster1:~# /etc/ha.d/resource.d/postgresql-8.3 stop
Aguarde o servio postgresql levantar na mquina primria. Esse tempo dever corresponder ao parmetro ''initdead'' mais o tempo necessrio para o prprio postgresql iniciar.
Refazer o
backup inicial
Agora refaa todos os passos para criar o backup inicial da mquina primria e depois copiar para a mquina secundria.
Desbloquear
Voc pode desbloquear as queries sobre os servidores postgresql. Os passos dependem do mtodo utilizado no bloqueio.
Bibliografia
[0] http://www.postgresql.org/docs/8.3/interactive/continuous-archiving.html
[1] http://www.postgresql.org/docs/8.3/interactive/warm-standby.html
[2] http://www.linux-ha.org/wiki/Ha.cf
18 de 19
[3] http://www.linux-ha.org/wiki/Haresources
[4] http://www.linux-ha.org/wiki/Authkeys
[5] http://www.linux-ha.org/wiki/Configuration
[6] http://www.linuxwebcluster.com/documentation/high-availability-linux-setup-heartbeat-ipfailping-node-configuration.html
[7] http://www.linuxvirtualserver.org/docs/ha/heartbeat_mon.html
[8] hapm/
http://joaocosme.wordpress.com/2009/10/30/ha-em-postgresql-warm-stand-by-heartbeat-
PostgreSQL
HA
WAL
shipping
19
de
19