quarta-feira, 15 de janeiro de 2014

Alta disponibilidade com PostgreSQL - Streaming Replication + Hot Standby

O PostgreSQL é um poderoso Sistema de Gestão de Banco de Dados (SGBD), com inúmeros recursos. Este post irá mostrar como fazer Streaming Replication e Hot Standby com o postgreSQL, permitindo assim transfirir as alterações de dados de um computador para um outro computador, estando eles geograficamente distantes. O funcionamento normal da nossa Streaming Replication é conforme imagem abaixo:
Dessa forma, o usuário acessa um sistema de comércio eletrônico e faz suas compras na internet. Suas solicitações serão enviadas para um servidor Web (onde está hospedado o site de comércio eletrônico). Por conseguinte, o servidor web irá coletar/alterar os dados no SGBD, que no nosso caso é o PostgreSQL no computador Master. O master irá transferir todas as alterações nos dados do SGBD para o PostgreSQL que está no computador Slave. Caso tenhamos algum problema com o nosso SGBD PostgreSQL Master, poderemos ativar rapidamente o Slave, promovendo-o a Master. Conforme imagem abaixo:
Dessa forma, após promover o Slave à Master, basta que o servidor web seja direcionado para o novo SGBD Master, que terá os dados atualizados e disponíveis para o seu sistema de comércio eletrônico. Considerações De uma forma geral, configurar os computadores (Master e Slave) para fazer Streaming Replication e Hot Standby será necessário alterar os seguintes arquivos: /etc/postgresql/9.1/main/pg_hba.conf e /etc/postgresql/9.1/main/postgresql.conf Para que um computador com o PostgreSQL faça Streaming Replication para outro computador é necessário que ambos estejam com plataformas equivalentes, por exemplo: Ubuntu 64 bits em ambas as máquinas, irá funcionar. Não funcionará um computador com Ubuntu 32 bits e outro com Ubuntu 64 bits. O ambiente Em nosso ambiente, teremos um computador denominado "Master" identificado pelo IP fictício: "185.25.2.160" com o PostgreSQL 9.1. Também teremos um outro computador denominado "Slave" identificado pelo IP fictício: "171.43.98.90". Configurando o Master Primeiramente iremos acessar o computador Master e em seguida liberar o acesso para o Slave se conectar ao PostgreSQL do Master. Pode ser utilizado o SSH para se conectar ao computador Master e fazer as devidas configurações. Essa configuração para liberar o acesso é feita no arquivo: pg_hba.conf
$ sudo vi /etc/postgresql/9.1/main/pg_hba.conf
Altere o arquivo adicionando a seguinte linha
hostssl  replication    all    171.43.98.90/32    trust
hostssl: Será utilizada uma conexão com SSL. replication: É o nome do usuário que se conectará ao PostgreSQL. all: É a base de dados, neste caso "all" significa que pode se conectar a qualquer uma. 171.43.98.90/32: É o IP da máquina que se conectará ao nosso SGBD Master. Neste caso será informado o IP do Slave. trust: Método de autenticação no nosso servidor Master. Agora temos a configuração de conexão do nosso servidor PostgreSQL. Vamos agora configurar o próprio PostgreSQL. Essa configuração é feita através do arquivo: postgresql.conf
$ sudo vi /etc/postgresql/9.1/main/postgresql.conf
Localize a linha que contém os seguintes parâmetros e altere-os, conforme indicado abaixo: listen_addresses, altere para listen_addresses = '*'. ssl: altere para ssl = true. Caso não encontre a linha, busque por: Security and Authentication. wal_level: altere para wal_level = hot_standby. max_wal_senders: altere para max_wal_senders = 1. max_sender_delay: altere para max_sender_delay = 200ms. wal_keep_segments: altere para wal_keep_segments = 200. Configurando o Slave Primeiramente iremos acessar o computador Slave. Como já mencionado anteriormente, costumo acessar o servidor através de SSH. A configuração do SGBD Slave é feita nos arquivos: postgresql.conf e recovery.conf Primeiramente vamos alterar o postgresql.conf.
$ sudo vi /etc/postgresql/9.1/main/postgresql.conf
Localize a linha que contém os seguintes parâmetros e altere-os, conforme indicado abaixo: listen_addresses, altere para listen_addresses = '*'. ssl: altere para ssl = true. Caso não encontre a linha, busque por: Security and Authentication. wal_level: altere para wal_level = hot_standby. max_wal_senders: altere para max_wal_senders = 1. max_sender_delay: altere para max_sender_delay = 200ms. wal_keep_segments: altere para wal_keep_segments = 200. hot_standby: altere para hot_standby = on. Agora vamos criar o arquivo recovery.conf.
$ sudo vi /var/lib/postgresql/9.1/main/recovery.conf
Este arquivo deve conter os seguintes parâmetros:
standby_mode = 'on'
primary_conninfo = 'host=185.25.2.160 port=5432'
trigger_file = '/var/lib/postgresql/9.1/main/failover.trg'
standby_mode: indica que o SGBD PostgreSQL está como Slave. primary_conninfo: endereço do servidor Master. trigger_file: nome arquivo que promoverá o Slave à Master. Basta que este arquivo exista, mesmo que vazio, na pasta de dados do PostgreSQL (/var/lib/postgresql/9.1/main/) para que o Slave saiba que deve ser promovido à Master. Agora finalizamos a configuração do nosso servidor Slave. Sincronizando os dados do Master para o Slave Consideremos que o Master esteja com o PostgreSQL rodando perfeitamente e com os clientes fazendo as manipulações nos dados. Há várias formas de sincronizar um banco de dados em dois computadores. A forma que vou explicar se aplica a seguinte situação: O servidor Master está em funcionamento e continuará em funcionamento durante o sincronismo (que pode demorar, dependendo de alguns aspectos, como: Link de internet, tamanho da base de dados). 1º Passo: No computador Slave, pare o PostgreSQL.
$ sudo su postgres
$ cd /var/lib/postgresql/9.1/main/
$ /etc/init.d/postgres stop
2º Passo: No computador Master, execute os seguintes comandos, alterando os nomes em caixa alta, conforme o seu sistema.
$ sudo su postgres
$ cd /var/lib/postgresql/9.1/main/
$ psql -p 5432 -c "SELECT pg_start_backup('Streaming_Replication', true)" postgres   
$ rsync -e "ssh -l root -p 22" -C -av --progress -h --exclude recovery.done --exclude postmaster.pid --exclude postmaster.opts --exclude pg_log --exclude recovery.conf --exclude pg_xlog --exclude server.crt --exclude server.key /var/lib/postgresql/9.1/main postgres@IP_OU_HOST_DO_SLAVE:/var/lib/postgresql/9.1/
Após a execução do último comando, será solicitado a senha do usuário do postgres. Os arquivos server.crt e server.key são os certificados para o usuário root, de forma que não necessita informar a senha do usuário root. Após a conclusão do sincronismo é necessário executar o seguinte comando:
$ psql -p 5432 -c "SELECT pg_stop_backup()" postgres 
3º Passo: No computador Slave, execute o seguinte comando:
$ rm -r pg_xlog/*
Iniciando a replicação No Slave, inicie o PostgreSQL com o comando:
$ /etc/init.d/postgres start
Para termos certeza de que a nossa streaming replication está funcionando perfeitamente execute o comando a seguir, tanto no Master quanto no Slave, e analise o seu resultado:
$ ps aux | egrep 'postgres: wal'
Estando tudo correto deverá mostrar algo desse tipo: No Master: postgres: wal sender process postgres 171.43.98.90(58412) streaming 2E0/9800428 No Slave: postgres: wal receiver process streaming 2E0/B47C1F8 Desta forma está feita nossa Streaming Replication com o PostgreSQL.

Nenhum comentário:

Postar um comentário