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.131 ]

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

Partição de tabelas no PostgreSQL

PostgreSQL: comandos básicos

Replicação de dados síncrona com Postgres

PostgreSQL 9.4 - Replicação com slots

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