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