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.

[ Hits: 117.142 ]

Por: Rafael Marangoni em 02/12/2010


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


Página anterior     Próxima página

Páginas do artigo
   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
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

PostgreSQL no Slackware - Importando e Exportando arquivos TXT e CSV

Diagrama Entidade-Relacionamento com Dia e tedia2sql para o PostgreSQL

PostgreSQL - Instalação inicial no Debian Wheezy 64 bits

Sincronizando Dados do PostgreSQL no Elasticsearch

Encoding do Postgres (latin1) e encoding do SO (Debian/Ubuntu)

  
Comentários
[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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts