Pular para o conteúdo

HowTo: Como criar Cluster Linux - Ativo/Passivo para Postgres com DRBD, Pacemaker e Corosync

Este artigo explica como configurar (e monitorar) um Cluster Linux Ativo/Passivo para PostgreSQL, usando Pacemaker, DRBD e Corosync.
Rafael Marangoni rafatmb
Hits: 120.543 Categoria: Banco de Dados Subcategoria: Postgres
  • Indicar
  • Impressora
  • Denunciar

Parte 5: Configurando o PostgreSQL

Este artigo explica como configurar (e monitorar) um Cluster PostgreSQL Ativo/Passivo, usando Pacemaker, Corosync e DRBD. Escrito por Rafael Marangoni, do time de Servidor Linux da BRLink.

Precisaremos iniciar o serviço do DRBD em ambos os nós, para criar a configuração inicial do Postgres:

# /etc/init.d/drbd start

Como foi feito anteriormente, o node1 será o primário. Para checar, no node1 execute:

# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:09
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----
ns:8388316 nr:0 dw:0 dr:8388316 al:0 bm:512 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0


A informação "Primary/Secondary" indica que o servidor local (onde executamos o comando) é o primário e o outro servidor é o secundário.

A informação "UpToDate/UpToDate", indica que o recursos está sincronizado entre os nós.

Vamos formatar o dispositivo DRBD, somente no node1:

# mkfs.ext3 /dev/drbd0

Agora conseguiremos montar o dispositivo. O ponto de montagem que utilizaremos será a pasta padrão do PostgreSQL (nos sistemas baseados em RedHat). Somente no node1:

# mount -t ext3 /dev/drbd0 /var/lib/pgsql

Somente no node1, mudar o proprietário do diretório montado (/var/lib/pgsql):

# chown postgres.postgres /var/lib/pgsql

Somente no node1, vamos iniciar a base do postgresql:

# su - postgres
$ initdb /var/lib/pgsql/data
$ exit


Eu prefiro habilitar trusted authentication em ambos os IPs dos nós e do Cluster.

Somente no node1:

# echo "host all all 10.0.0.191/32 trust" >> /var/lib/pgsql/data/pg_hba.conf
# echo "host all all 10.0.0.192/32 trust" >> /var/lib/pgsql/data/pg_hba.conf
# echo "host all all 10.0.0.190/32 trust" >> /var/lib/pgsql/data/pg_hba.conf


Outra configuração importante é configurar o PostgreSQL para ouvir em todas as interfaces.

Somente no node1:

# vi /var/lib/pgsql/data/postgresql.conf

Descomentar e mudar somente a seguinte linha:

listen_addresses = '0.0.0.0'

Agora podemos iniciar o postgres, somente no node1:

# /etc/init.d/postgresql start

Vamos criar um usuário para administrar o postgres, com senha. Somente no node1:

# su - postgres
$ createuser --superuser admpgsql --pwprompt


Setar uma senha para o usuário admpgsql.

Vamos criar uma base de testes e populá-la com o pgbench, somente no node1:

# su - postgres
$ createdb pgbench
$ pgbench -i pgbench


O PGBench popula a base com algumas informações, apenas para testar o PostgreSQL:

pgbench -i pgbench
NOTA: tabela "pgbench_branches" não existe, ignorando
NOTA: tabela "pgbench_tellers" não existe, ignorando
NOTA: tabela "pgbench_accounts" não existe, ignorando
NOTA: tabela "pgbench_history" não existe, ignorando
creating tables...
10000 tuples done.
20000 tuples done.
30000 tuples done.
40000 tuples done.
50000 tuples done.
60000 tuples done.
70000 tuples done.
80000 tuples done.
90000 tuples done.
100000 tuples done.
set primary key...
NOTA: ALTER TABLE / ADD PRIMARY KEY criará índice implícito "pgbench_branches_pkey" na tabela "pgbench_branches"
NOTA: ALTER TABLE / ADD PRIMARY KEY criará índice implícito "pgbench_tellers_pkey" na tabela "pgbench_tellers"
NOTA: ALTER TABLE / ADD PRIMARY KEY criará índice implícito "pgbench_accounts_pkey" na tabela "pgbench_accounts"
vacuum...done.


Agora poderemos acessar a base e checar se está tudo certo, somente no node1:

# psql -U admpgsql -d pgbench

pgbench=# select * from pgbench_tellers;
tid | bid | tbalance | filler
-----+-----+----------+--------
1 |   1 |        0 |
2 |   1 |        0 |
3 |   1 |        0 |
4 |   1 |        0 |
5 |   1 |        0 |
6 |   1 |        0 |
7 |   1 |        0 |
8 |   1 |        0 |
9 |   1 |        0 |
10 |   1 |        0 |
(10 registros) 

Depois disso, a configuração do postgres estará concluída.

Antes de iniciar a configuração do Pacemaker, vamos checar se o postgres rodará no node2, para evitarmos problemas futuros.

node1:

Em primeiro lugar, no node1 vamos parar o postgresql:

# /etc/init.d/postgresql stop

Desmontando o dispositivo DRBD:

# umount /dev/drbd0

Colocando o DRBD como secundário:

# drbdadm secondary postgres

node2:

Agora, no node2, vamos colocá-lo como primário para acesso ao recurso DRBD:

# drbdadm primary postgres

Montando o dispositivo:

# mount -t ext3 /dev/drbd0 /var/lib/pgsql/

E agora iniciando o postgres:

# /etc/init.d/postgresql start

Checando se nós conseguimos, através do node2, acessar o banco pgbench que foi populado pelo node1:

# psql -U admpgsql -d pgbench

pgbench=# select * from pgbench_tellers;
 tid | bid | tbalance | filler
-----+-----+----------+--------
   1 |   1 |        0 |
   2 |   1 |        0 |
   3 |   1 |        0 |
   4 |   1 |        0 |
   5 |   1 |        0 |
   6 |   1 |        0 |
   7 |   1 |        0 |
   8 |   1 |        0 |
   9 |   1 |        0 |
  10 |   1 |        0 |
(10 registros)     

O retorno do select é a garantia do sucesso. Podemos então iniciar as configurações do Cluster.

Antes disso, precisamos parar os serviços postgresql e DRBD, e desativá-los da inicialização.

node2:

# /etc/init.d/postgresql stop
# umount /dev/drbd0
# drbdadm secondary postgres
# /etc/init.d/drbd stop


node1:

# drbdadm primary postgres
# /etc/init.d/drbd stop


Em ambos os nós, executar:

# chkconfig --level 35 drbd off
# chkconfig --level 35 postgresql off


   1. Notas Preliminares
   2. Preparando os nós
   3. Instalando pré-requisitos
   4. Configurando o DRBD
   5. Configurando o PostgreSQL
   6. Configurando o Corosync
   7. Configurando o Pacemaker
   8. Criando página para exibir status via web
   9. Instalando PhppgAdmin para gerenciar o PostgreSQL
   10. Acessando via rede e monitorando o cluster
Nenhum artigo encontrado.

Como agendar um backup automático do PostgreSQL no Cron evitando o problema de senha

Replicação de dados síncrona com Postgres

Microsiga Protheus com Postgres

Programando PostgreSQL + PHP

psql - Conheça o básico

#1 Comentário enviado por removido em 06/12/2010 - 01:15h
Olha o título, olha o título do trabalho!...
10!
;-))
#2 Comentário enviado por mvquintella em 13/12/2010 - 18:54h
Olá.

Estou tentando esse procedimento mas estou empacando num ponto:

# mount -t ext3 /dev/drbd0 /var/lib/pgsql

Quando eu monto a pasta conforme o tutorial, (no meu caso como uso debian, o caminho que monto é /usr/local/pgsql) todas as pastas que estao dentro do pgsql somem (incluvise a pasa bin onde está localizado o initdb). Estou fazendo algo errado será??

Abs
#3 Comentário enviado por rafatmb em 14/12/2010 - 10:04h
Olá mvquintella,

Esta pasta /var/lib/pgsql no redhat (e afins) possui por exemplo a pasta data, onde o postgres armazena os dados da base.

Não tenho certeza qual é a pasta no debian. De qualquer modo, na primeira vez que você montar, você terá que usar o initdb para iniciarlizar os dados do postgres e popular a base.

Você chegou a esse ponto?

Abraço.
#4 Comentário enviado por mvquintella em 15/12/2010 - 10:19h
Olá!

No debian o caminho da pasta data fica no caminho: /usr/local/pgsql/data

No caso eu devo fazer a montagem assim certo?

# mount -t ext3 /dev/drbd0 /usr/local/pgsql

Só que quando eu faço esse procedimento, todos os arquivos que estão dentro de /usr/local/pgsql somem... Inclusive a pasta data.
Eu devo rodar o initdb antes de fazer a montagem então?

Talvez eu esteja fazendo alguma cabaçada, gostaria de tentar entender onde hehe

Obrigado!
#5 Comentário enviado por mvquintella em 15/12/2010 - 10:49h
Cara, obrigado pela ajuda. Provavelmente era alguma besteira que eu estava fazendo!
Recomecei do zero e consegui passar desse ponto. Conto com sua ajuda se eu travar em outro ponto heeein heheheh
Abs!
#6 Comentário enviado por rafaelbiagi em 05/03/2011 - 16:05h
Amigo, otimo artigo, bem explicado.
mas eu não sei o que acontece, segui certinho as configurações, um servidor pinga o outro mas esta apresentando o seguinte status no DRBD

version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:09

1: cs:WFConnection ro:Primary/Unknown ds:UpToDate/Outdated C r----
ns:0 nr:0 dw:20 dr:545 al:2 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:1675592472


Alguem saberia me dizer pq da esse WFConnection, no http://www.drbd.org/users-guide-emb/ch-admin.html ele só fala o que significa, mas não ajuda a resolver o problema.

Obrigado
Rafael Biagi
#7 Comentário enviado por leandrojpg em 28/11/2011 - 16:50h
boa tarde estou tentando fazer meu drbd com io pacemaker mas ao rodar o comando:
crm_mon -l, aprensenta a mensagem Failed actions:
DRBD_monitor_0 (node=node1, call=7, rc=6, status=complete): not configured
drbd_monitor_0 (node=node1, call=5, rc=6, status=complete): not configured
DADOS-MOUNT_start_0 (node=node1, call=15, rc=5, status=complete): not installed
postgres_fs_start_0 (node=node1, call=25, rc=1, status=complete): unknown error
drbd_r0_monitor_0 (node=node1, call=6, rc=6, status=complete): not configured
SRV-MOUNT_start_0 (node=node1, call=14, rc=5, status=complete): not installed
r0_fs_start_0 (node=node1, call=28, rc=1, status=complete): unknown error
DRBD_monitor_0 (node=node2, call=7, rc=6, status=complete): not configured
drbd_monitor_0 (node=node2, call=5, rc=6, status=complete): not configured
DADOS-MOUNT_start_0 (node=node2, call=12, rc=5, status=complete): not installed
postgres_fs_start_0 (node=node2, call=23, rc=1, status=complete): unknown error
drbd_r0_monitor_0 (node=node2, call=6, rc=6, status=complete): not configured
SRV-MOUNT_start_0 (node=node2, call=11, rc=5, status=complete): not installed
r0_fs_start_0 (node=node2, call=26, rc=1, status=complete): unknown error
#8 Comentário enviado por sbambam em 13/06/2012 - 22:48h
Prezados,

Gostaria de uma ajuda...

Ao executar o passo "yum install -y pacemaker corosync drbd83 kmod-drbd83 heartbeat" em pré-requisitos me deparo com as informaçoes abaixo. Eu acredito que não devo continuar sem esses pacotes...alguem pode dar uma luz...

[root@node1 ~]# yum install -y pacemaker corosync drbd83 kmod-drbd83 heartbeat
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
* base: centos.redeminastelecom.com.br
* epel: mirror.cogentco.com
* extras: centos.redeminastelecom.com.br
* updates: centos-mirror.hostdime.com.br
Setting up Install Process
Package pacemaker-1.1.6-3.el6.x86_64 already installed and latest version
Package corosync-1.4.1-4.el6_2.2.x86_64 already installed and latest version
No package drbd83 available.
No package kmod-drbd83 available.
Package heartbeat-3.0.4-1.el6.x86_64 already installed and latest version
Nothing to do
[root@node1 ~]#
#9 Comentário enviado por felipeogutierrez em 15/12/2012 - 22:26h

[6] Comentário enviado por rafaelbiagi em 05/03/2011 - 16:05h:

Amigo, otimo artigo, bem explicado.
mas eu não sei o que acontece, segui certinho as configurações, um servidor pinga o outro mas esta apresentando o seguinte status no DRBD

version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:09

1: cs:WFConnection ro:Primary/Unknown ds:UpToDate/Outdated C r----
ns:0 nr:0 dw:20 dr:545 al:2 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:1675592472


Alguem saberia me dizer pq da esse WFConnection, no http://www.drbd.org/users-guide-emb/ch-admin.html ele só fala o que significa, mas não ajuda a resolver o problema.

Obrigado
Rafael Biagi
Cara, voce tem que que dar um disconnect, detach e depois um connect. Se nao for com o connect tenta o discard-my-data
Falou
Felipe
#10 Comentário enviado por paulosantos41 em 12/09/2015 - 23:38h

Boa noite a todos,
eu estava fazendo esta configuração de cluster, e tudo funciona normalmente até o passo de criar o banco pgbench no node 1, mas quando vou checar se o banco pode ser acessado pelo node 2, o postgresql informa que não existe role para o usuário admpgsql. Alguém poderia me ajudar?

Estou utilizando o debian wheezy para fazer as configurações e estou seguindo todos os passos do artigo.

Contribuir com comentário

Entre na sua conta para comentar.