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: 112.192 ]

Por: Rafael Marangoni em 02/12/2010


Configurando o Pacemaker



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.

O Pacemaker é um CRM (Cluster Resource Manager) que possui muitas funcionalidades extremamente interessantes, uma delas é a capacidade de replicar as informações do cluster entre os nós de maneira rápida e transparente. Desta forma, todas as tarefas administrativas (como configuração do cluster) precisam ser executadas em um nó somente, e já são replicadas para todo o cluster automaticamente.

Assim, cada comando crm deste artigo deve ser executado somente uma vez, em qualquer um dos nós do cluster.

Para verificar as configurações do cluster:

# crm_verify -L

Para ver o status do cluster e retornar ao prompt:

# crm_mon -1

Para listar as configurações do cluster:

# crm configure show

Configurando Stonith

O Stonith é um mecanismo de segurança do cluster, que faz com que o sistema possa desligar com "força" um nós com problema do cluster. Para que funcione bem, é preciso que seja um recurso de hardware. A Dell possui a placa iDAC6, a HP e IBM também.

Neste caso, vamos desabilitar o Stonith, para ativar, utilize as informações contidas em:
Executando o comando deverá surgir um erro de que o Stonith não está configurado.

# crm_verify -L

Vamos desativar o Stonith para acabarem os erros:

# crm configure property stonith-enabled=false

Checando se está ok:

# crm_verify -L
(não deverá retornar nada, aí estará ok)

Configurações gerais do cluster

Configurando quorum para 2 nós (mais informações ler no site do pacemaker).

# crm configure property no-quorum-policy=ignore

Configurando peso para que o recurso seja transferido de um nó para outro.

Obs.: Quando um servidor cai, e retorna, esta configuração evite que o pacemaker mantenha o serviço no servidor ativo, e não retorne para o servidor primário que estava fora. Evita ficar trocando de serviço, e é importante, por exemplo caso a base de dados tenha sido desatualizada no servidor que caiu e retornou.

# crm configure rsc_defaults resource-stickiness=100

Exibindo a configuração:

# crm configure show
node node1.clusterbr.int
node node2.clusterbr.int
property $id="cib-bootstrap-options" \
        dc-version="1.0.9-89bd754939df5150de7cd76835f98fe90851b677" \
        cluster-infrastructure="openais" \
        expected-quorum-votes="2" \
        stonith-enabled="false" \
        no-quorum-policy="ignore"
rsc_defaults $id="rsc-options" \
        resource-stickiness="100"


Configurando o DBIP

Para adicionar o IP do cluster, execute:

# crm configure primitive DBIP ocf:heartbeat:IPaddr2 \
params ip=10.0.0.190 cidr_netmask=24 \
op monitor interval=30s


Exibindo o status:

# crm_mon -1
============
Last updated: Fri Oct 29 17:47:53 2010
Stack: openais
Current DC: node1.clusterbr.int - partition with quorum
Version: 1.0.9-89bd754939df5150de7cd76835f98fe90851b677
2 Nodes configured, 2 expected votes
1 Resources configured.
============

Online: [ node2.clusterbr.int node1.clusterbr.int ]

DBIP   (ocf::heartbeat:IPaddr2):       Started node2.clusterbr.int  


Repare que o status do cluster exibe onde o recurso está rodando. Neste caso está rodando no node2, mas poderia estar no node1 no seu caso.

Inserindo o DRBD no Cluster

Primeiro, vamos adicionar o recurso postgres:

# crm configure primitive drbd_postgres ocf:linbit:drbd \
params drbd_resource="postgres" \
op monitor interval="15s"


Agora vamos configurar a gestão primário/secundário ao cluster:

# crm configure ms ms_drbd_postgres drbd_postgres \
meta master-max="1" master-node-max="1" \
clone-max="2" clone-node-max="1" \
notify="true"


Configurando o cluster para montar o dispositivo DRBD (montando /dev/drbd0 no /var/lib/pgsql):

# crm configure primitive postgres_fs ocf:heartbeat:Filesystem \
params device="/dev/drbd0" directory="/var/lib/pgsql" fstype="ext3"


Inserindo o PostgreSQL no cluster:

# crm configure primitive postgresql ocf:heartbeat:pgsql \
op monitor depth="0" timeout="30" interval="30"


Agora, para facilitar a gerência, vamos agrupar DBIP, postgresql e a montagem do dispositivo DRBD. O nome do grupo será "postgres":

# crm configure group postgres postgres_fs DBIP postgresql

Fixando o grupo postgres para rodar no mesmo nós que o master do DRBD:

# crm configure colocation postgres_on_drbd inf: postgres ms_drbd_postgres:Master

Configurando o postgres para rodar depois do DRBD:

# crm configure order postgres_after_drbd inf: ms_drbd_postgres:promote postgres:start

Exibindo a configuração atual:

# crm configure show
node node1.clusterbr.int
node node2.clusterbr.int
primitive DBIP ocf:heartbeat:IPaddr2 \
        params ip="10.0.0.190" cidr_netmask="24" \
        op monitor interval="30s"
primitive drbd_postgres ocf:linbit:drbd \
        params drbd_resource="postgres" \
        op monitor interval="15s"
primitive postgres_fs ocf:heartbeat:Filesystem \
        params device="/dev/drbd0" directory="/var/lib/pgsql" fstype="ext3"
primitive postgresql ocf:heartbeat:pgsql \
        op monitor interval="30" timeout="30" depth="0" \
        meta target-role="Started"
group postgres postgres_fs DBIP postgresql \
        meta target-role="Started"
ms ms_drbd_postgres drbd_postgres \
        meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
colocation postgres_on_drbd inf: postgres ms_drbd_postgres:Master
order postgres_after_drbd inf: ms_drbd_postgres:promote postgres:start
property $id="cib-bootstrap-options" \
        dc-version="1.0.9-89bd754939df5150de7cd76835f98fe90851b677" \
        cluster-infrastructure="openais" \
        expected-quorum-votes="2" \
        stonith-enabled="false" \
        no-quorum-policy="ignore"
rsc_defaults $id="rsc-options" \
        resource-stickiness="100"


Vamos setar o nó preferencial do Cluster.

É importante que o Pacemaker saiba qual é o nó que preferimos para que os serviços rodem. Neste caso, vamos selecionar o node1:

# crm configure location master-prefer-node1 DBIP 50: node1.clusterbr.int

Note que o peso de preferência é 50. Assim se o serviço estiver rodando no node2, pacemaker não mudará para o node1 a menos que o node2 pare de funcionar. Isto porque configuramos o peso do resource-stickiness to 100 (que é o peso para troca de nós).

Assim, mesmo que o node1 se recupere de uma queda, o cluster vai manter os serviços no node2.

Exibindo status:

# crm_mon -1
============
Last updated: Fri Oct 29 19:54:09 2010
Stack: openais
Current DC: node2.clusterbr.int - partition with quorum
Version: 1.0.9-89bd754939df5150de7cd76835f98fe90851b677
2 Nodes configured, 2 expected votes
2 Resources configured.
============

Online: [ node2.clusterbr.int node1.clusterbr.int ]

Master/Slave Set: ms_drbd_postgres
     Masters: [ node2.clusterbr.int ]
     Slaves: [ node1.clusterbr.int ]
Resource Group: postgres
     postgres_fs        (ocf::heartbeat:Filesystem):    Started node2.clusterbr.int
     DBIP       (ocf::heartbeat:IPaddr2):               Started node2.clusterbr.int
     postgresql (ocf::heartbeat:pgsql):                 Started node2.clusterbr.int


Neste momento você poderá ver alguns erros nesta tela. Se isto ocorrer, faça um reboot em ambos os servidores para completar as configurações do Corosync/Pacemaker.

Depois do reboot, quem deverá subir os serviços do DRBD e postgresql será o corosync, portanto isto poderá levar um tempo a mais no reboot.

Depois do reboot, cheque se as configurações estão iguais acima e tente conectar no DBIP (10.0.0.190), na porta TCP 5432 para acessar as bases do postgresql.

Para testar o cluster, você poderá desligar um nó, ou parar o serviço do corosync nele.

Gerenciamento do Cluster

Comandos úteis para a gestão do Cluster.

Migrando um recurso para outro nó:

# crm resource migrate postgres node1.clusterbr.int

Para remover o comando de migração forçada acima:

# crm resource unmigrate postgres

Para limpar mensagens de recursos:

# crm resource cleanup postgres

Para parar o serviço do PostgreSQL:

# crm resource stop postgresql

Para iniciar o serviço do PostgreSQL:

# crm resource start postgresql

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 básico - Testado e pronto para ser usado

PostGIS no Slackware

Instalando PostgreSQL 8.1 com extensão para dados espaciais (PostGis) e interface de gerenciamento (PgAdmin3)

Automação comercial livre no Slackware 12

Postgres e os Sistemas Alterdata

  
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 [email protected], 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...

[[email protected] ~]# 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
[[email protected] ~]#

[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 [email protected], 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
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts