Corosync + PaceMaker + Lcmc no Debian Squeeze

O Pacemaker é um gerenciador de recursos de cluster ou cluster resource manager (CRM). Sua função é oferecer uma interface para que o usuário possa gerenciar o conjunto de clusters.

Para evitar dados corrompidos, a administração é feita através de uma estrutura centralizada. Quando um evento de falha é relatado, automaticamente é iniciado o processo de recuperação da disponibilidade da aplicação iniciando o recurso em outra máquina do cluster.

Características:

  1. Detecta e recupera falhas em computadores no nível de aplicação
  2. Administração centralizada através de shell
  3. Suporta cluster por quorate e resource-driven
  4. Suporte o envio de sinal de desligamento conforme o estado da aplicação
  5. Suporta aplicações com múltiplos nós (master/slave)
  6. Correção automática de falhas

Corosync Cluster Engine

Publicada em 2008, é considerada a evolução do Heartbeat. Possui recursos adicionais ao Heartbeat e com mais suporte.

Características:

  1. Confiabilidade na criação de réplicas de máquina de estado
  2. Reinício de aplicações em caso de falha
  3. Sistema de quorum com notificação caso uma aplicação ou máquina venha a falhar.

Resource Agent

Os Resource Agent's são scripts que contém uma série de comandos fornecendo uma interface para um recurso de cluster. Sua função é traduzir o resultado das operações executadas por um serviço verificando se ouve sucesso ou falha.

O Pacemaker suporta três tipos de agentes de recurso.

  1. LSB (Linux Standard Base)
  2. OCF (Open Cluster Framework)
  3. HRA (Heartbeat Resource Agents)

A maioria dos scripts estão no formato LSB ou OCF, o HRA tornou-se obsoleto.

Lcmc é uma ferramenta gráfica para gerenciamento de cluster disponibilizada pela pacemaker, a ferramente é escrita em java com isso podemos portar ela para qualquer plataforma.

O que eu vou utilizar:

  1. Debian Squeeze Nodo1
  2. Nome: debian25
  3. IP: 10.101.0.25
  4. Debian Squeeze Nodo2
  5. Nome: debian26
  6. IP: 10.101.0.26

Prepare o seu sistema com o seguinte script http://wiki.douglasqsantos.com.br/doku.php/confinicialsqueeze_en para que não falte nenhum pacote ou configuração.

Ajustes iniciais

Agora vamos mandar fazer um update dos repositórios e vamos fazer um upgrade do sistema nos dois nodos

aptitude update && aptitude dist-upgrade -y

Agora vamos ajustar o arquivo /etc/hosts dos dois nodos este arquivo tem que ficar como abaixo.

127.0.0.1       localhost
10.101.0.25     debian25.douglas.wiki.br       debian25
10.101.0.26     debian26.douglas.wiki.br       debian26

Agora vamos fazer a instalação dos seguintes pacotes nós dois nodos

aptitude install corosync pacemaker -y

SSH com troca de Chaves

Agora no Nodo1 vamos gerar as chaves de ssh para efetuarmos a conexão de ssh via troca de chaves

ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #ENTER
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): #ENTER
Enter same passphrase again: #ENTER
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
b2:88:e4:58:ff:c7:07:05:2a:55:05:03:1e:a4:43:1b root@debian25
The key's randomart image is:
+--[ RSA 2048]----+
|    E.+o+o.      |
|   . =....       |
|    +... .       |
|    ...   .      |
|  o  .. S.       |
| = o . o.        |
|. o o .. .       |
|     .  o .      |
|      .. .       |
+-----------------+

Agora no Nodo2 vamos gerar as chaves de ssh para efetuarmos a conexão de ssh via troca de chaves

ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #ENTER
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): #ENTER
Enter same passphrase again: #ENTER
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
4d:b0:df:ef:b1:08:fb:9f:2e:5c:fb:3c:b0:8f:d4:77 root@debian26
The key's randomart image is:
+--[ RSA 2048]----+
|        .        |
|         o       |
|        . .      |
|         + .     |
|        S o .    |
|             oo  |
|          .. o=oE|
|           o++o*o|
|          ..o=Bo+|
+-----------------+

Agora no Nodo1 vamos copiar as chaves para o Nodo2

ssh-copy-id 10.101.0.26
The authenticity of host '10.101.0.26 (10.101.0.26)' can't be established.
RSA key fingerprint is 8b:af:fc:ac:d7:8a:44:d5:30:ad:1e:b9:de:95:78:d0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.101.0.26' (RSA) to the list of known hosts.
root@10.101.0.26's password: #SENHA
Now try logging into the machine, with "ssh '10.101.0.26'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

Agora no Nodo2 vamos copiar as chaves para o Nodo1

ssh-copy-id 10.101.0.25
The authenticity of host '10.101.0.25 (10.101.0.25)' can't be established.
RSA key fingerprint is a0:73:55:67:86:11:8d:13:c6:45:cc:85:c6:d5:a9:a2.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.101.0.25' (RSA) to the list of known hosts.
root@10.101.0.25's password: #SENHA
Now try logging into the machine, with "ssh '10.101.0.25'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

Configuração do Corosync

Agora no Nodo1 vamos gerar a chave de autenticação para o Corosync

corosync-keygen 
Corosync Cluster Engine Authentication key generator.
Gathering 1024 bits for key from /dev/random.
Press keys on your keyboard to generate entropy.
Press keys on your keyboard to generate entropy (bits = 176).
Press keys on your keyboard to generate entropy (bits = 240).
Press keys on your keyboard to generate entropy (bits = 304).
Press keys on your keyboard to generate entropy (bits = 368).
Press keys on your keyboard to generate entropy (bits = 432).
Press keys on your keyboard to generate entropy (bits = 496).
Press keys on your keyboard to generate entropy (bits = 560).
Press keys on your keyboard to generate entropy (bits = 624).
Press keys on your keyboard to generate entropy (bits = 688).
Press keys on your keyboard to generate entropy (bits = 752).
Press keys on your keyboard to generate entropy (bits = 816).
Press keys on your keyboard to generate entropy (bits = 880).
Press keys on your keyboard to generate entropy (bits = 944).
Press keys on your keyboard to generate entropy (bits = 1008).
Writing corosync key to /etc/corosync/authkey.

Agora abra um novo terminal para o servidor 10.101.0.25 enquanto é gerada a chave para o corosync, vamos agilizar a geração dos dados aleatórios para a chave

Agora no novo terminal no Nodo1 execute o seguinte comando

find / -iname "*" -exec ls -l {} \;

Depois que terminar a geração da chave para o corosync podemos cancelar o comando do find com um crtl + c e podemos fechar o terminal adicional que abrimos no Nodo1

Agora no Nodo1 vamos copiar as chaves do corosync para o Nodo2

scp /etc/corosync/authkey 10.101.0.26:/etc/corosync/authkey

Agora vamos executar o comando abaixo nos dois Nodos para deixarmos o corosync ativado na inicialização

sed -i 's/START=no/START=yes/g' /etc/default/corosync

No Nodo1 vamos fazer um backup do arquivo de configuração do Corosync

cp -a /etc/corosync/corosync.conf{,.bkp}

Agora vamos a configuração do corosync

vim /etc/corosync/corosync.conf
# /etc/corosync/corosync.conf

#Opção do protocolo totem
totem {
  version: 2

  #Tempo para verificar perca de pacotes em (ms)
  token: 3000

  #Quantas verificações antes de gerar notificações
  token_retransmits_before_loss_const: 10

  #Quanto tempo esperar para agrupar as notificações em (ms)
  join: 60

  #Quanto tempo esperar para uma solução antes de começar uma nova verificação (ms)
  consensus: 3600

  #Filtro de sincronismo virtual desabilitado
  vsftype: none

  #Número de mensagens processadas na recepção de pacotes
  max_messages: 20

  #Limite de cluster assinados
  clear_node_high_bit: yes

  #Criptografia desabilitada
  secauth: off

  #Quantas threads usadas para criptografar/descriptografar
  threads: 0

  #Atribui ID em um cluster fixo (opcional)
  # nodeid: 1234

  #Especifica que em modo de redundancia, não pode havar nenhum cluster ativo ou passivo.
  rrp_mode: none

  interface {
    #Número de clusters (0 default)
    ringnumber: 0
                #Início de ips utilizados por cluster 10.101.0.0 é 10.101.0.0/24 aqui mude para 
                #O endereço da sua rede ex: 192.168.0.0 que seria 192.168.0.0/24
    bindnetaddr: 10.101.0.0
                #Fim de ips utilizados por cluster
    mcastaddr: 226.94.1.1
                #Porta utilizaad pelo corosync
    mcastport: 5405
  }
}

#Configuração de AIS Availability Management Framework
amf {
  mode: disabled
}

service {
  #Carregamento do serviço para gerenciamento
  ver:       0
  name:      pacemaker
}

#Temos que setar o usuário e grupo como root para o ais ser capaz de gerenciar os recursos do pacemaker
aisexec {
        user:   root
        group:  root
}


#Configuração de log
logging {
        fileline: off
        to_stderr: yes
        to_logfile: yes
        logfile: /var/log/corosync/corosync.log
        #Aqui estou desabilitando os logs para o syslog, pq senão zoa demais o arquivo
        to_syslog: no
  syslog_facility: daemon
        debug: off
        timestamp: on
        logger_subsys {
                subsys: AMF
                debug: off
                tags: enter|leave|trace1|trace2|trace3|trace4|trace6
        }
}

Agora vamos copiar o nosso arquivo para o Nodo2

scp /etc/corosync/corosync.conf 10.101.0.26:/etc/corosync/

Agora vamos reiniciar o corosync nos dois nodos

/etc/init.d/corosync restart

Agora vamos ver se o nosso cluster está funcionando no Nodo1 vamos consultar

crm_mon --one-shot -V
crm_mon[15140]: 2013/01/04_15:07:11 ERROR: unpack_resources: Resource start-up disabled since no STONITH resources have been defined
crm_mon[15140]: 2013/01/04_15:07:11 ERROR: unpack_resources: Either configure some or disable STONITH with the stonith-enabled option
crm_mon[15140]: 2013/01/04_15:07:11 ERROR: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrity
============
Last updated: Fri Jan  4 15:07:11 2013
Stack: openais
Current DC: debian25 - partition with quorum
Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
2 Nodes configured, 2 expected votes
0 Resources configured.
============

Online: [ debian25 debian26 ]

Caso não apareça a mensagem como acima os dois nodos online, reinicie o corosync novamente para ele recarregar os nodos

/etc/init.d/corosync restart

Agora vamos ver se o nosso cluster está funcionando no Nodo2 vamos consultar

crm_mon --one-shot -V
crm_mon[3319]: 2013/01/04_15:08:07 ERROR: unpack_resources: Resource start-up disabled since no STONITH resources have been defined
crm_mon[3319]: 2013/01/04_15:08:07 ERROR: unpack_resources: Either configure some or disable STONITH with the stonith-enabled option
crm_mon[3319]: 2013/01/04_15:08:07 ERROR: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrity
============
Last updated: Fri Jan  4 15:08:07 2013
Stack: openais
Current DC: debian25 - partition with quorum
Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
2 Nodes configured, 2 expected votes
0 Resources configured.
============

Online: [ debian25 debian26 ]

Agora no Nodo1 vamos desabilitar o stonith para que ele não fique gerando erros, caso o comando abaixo demore, cancele ele com ctrl + C e reinicie o corosync e depois rode ele novamente.

crm configure property stonith-enabled=false

Agora vamos consultar novamente no Nodo1 agora com outro comando

crm_mon -1
============
Last updated: Fri Jan  4 15:09:07 2013
Stack: openais
Current DC: debian25 - partition with quorum
Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
2 Nodes configured, 2 expected votes
0 Resources configured.
============

Online: [ debian25 debian26 ]

Agora podemos verificar senão temos nenhum problema com o nosso cluster da seguinte forma

crm_verify -L

Como não tivemos erros ele não retorna nada.

Vamos consultar a configuração do corosync no Nodo1

crm configure show
node debian25
node debian26
property $id="cib-bootstrap-options" \
  dc-version="1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b" \
  cluster-infrastructure="openais" \
  expected-quorum-votes="2" \
  stonith-enabled="false"

Agora vamos consultar a configuração do corosync no Nodo2

crm configure show
node debian25
node debian26
property $id="cib-bootstrap-options" \
  dc-version="1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b" \
  cluster-infrastructure="openais" \
  expected-quorum-votes="2" \
  stonith-enabled="false"

Pacemaker

Para o Pacemaker ser configurado ser utilizado o utilitário de linha de comando crm.

Através do crm é possível criar tipos básicos e avançados de cluster, regras, nodes de failback e failover, monitoramento, migração entre outros.

Vamos listar os recursos do tipo OCF

crm ra list ocf
AoEtarget           AudibleAlarm        CTDB                ClusterMon          Delay               Dummy               EvmsSCC             Evmsd
Filesystem          HealthCPU           HealthSMART         ICP                 IPaddr              IPaddr2             IPsrcaddr           IPv6addr
LVM                 LinuxSCSI           MailTo              ManageRAID          ManageVE            Pure-FTPd           Raid1               Route
SAPDatabase         SAPInstance         SendArp             ServeRAID           SphinxSearchDaemon  Squid               Stateful            SysInfo
SystemHealth        VIPArip             VirtualDomain       WAS                 WAS6                WinPopup            Xen                 Xinetd
anything            apache              controld            db2                 drbd                eDir88              iSCSILogicalUnit    iSCSITarget
ids                 iscsi               ldirectord          mysql               mysql-proxy         nfsserver           o2cb                oracle
oralsnr             pgsql               ping                pingd               portblock           postfix             proftpd             rsyncd
scsi2reservation    sfex                syslog-ng           tomcat              vmware              

Agora vamos listar os recursos do tipo lsb

crm ra list lsb
acpid                            atd                              atop                             bootlogd                         bootlogs
bootmisc.sh                      checkfs.sh                       checkroot.sh                     console-setup                    corosync
cron                             exim4                            fancontrol                       halt                             hdparm
hostname.sh                      hwclock.sh                       hwclockfirst.sh                  ifupdown                         ifupdown-clean
kbd                              keyboard-setup                   killprocs                        lm-sensors                       logd
module-init-tools                mountall-bootclean.sh            mountall.sh                      mountdevsubfs.sh                 mountkernfs.sh
mountnfs-bootclean.sh            mountnfs.sh                      mountoverflowtmp                 mtab.sh                          networking
openhpid                         portmap                          postfix                          procps                           rc
rc.local                         rcS                              reboot                           rmnologin                        rsync
rsyslog                          sendsigs                         single                           ssh                              stop-bootlogd
stop-bootlogd-single             sudo                             udev                             udev-mtab                        umountfs
umountnfs.sh                     umountroot                       urandom                          virtualbox-ose-guest-utils       x11-common

Agora vamos desabilitar o quorum para não recebermos erros durante a configuração dos recursos, podemos executar em algum dos dois nodos

crm configure property no-quorum-policy=ignore

Configuração de Recurso Endereço IP

Para poder prover a movimentação de serviços entre os nós do cluster sem a necessidade de alterarmos o endereço IP do serviço, o endereço IP associado ao serviço deverá ser configurado como um recurso para que ele possa ser movido livremente entre os nós do cluster junto com o serviço.

Agora vamos criar um recurso do tipo endereço IP 10.101.0.200 usando o RA IPaddr2.

crm configure primitive R_IP_Apache ocf:heartbeat:IPaddr2 params ip=10.101.0.200 cidr_netmask=255.255.255.0 nic=eth0 op monitor interval=10s

Agora vamos verificar o nosso recurso

crm_mon -1
============
Last updated: Fri Jan  4 15:26:23 2013
Stack: openais
Current DC: debian25 - partition with quorum
Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
2 Nodes configured, 2 expected votes
1 Resources configured.
============

Online: [ debian25 debian26 ]

 R_IP_Apache  (ocf::heartbeat:IPaddr2): Started debian25

Aqui nós não definimos em qual servidor o recurso deve ser alocado, com isso o Pacemaker já fez isso.

Agora vamos consultar o endereço ip configurado no servidor debian25 que é no Nodo1

ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:a2:83:04 brd ff:ff:ff:ff:ff:ff
    inet 10.101.0.25/24 brd 10.101.0.255 scope global eth0
    inet 10.101.0.200/24 brd 10.101.0.255 scope global secondary eth0
    inet6 fe80::a00:27ff:fea2:8304/64 scope link 
       valid_lft forever preferred_lft forever

Agora vamos testar, vamos desligar o servidor Nodo1 aonde esta o nosso recurso alocado.

shutdown -h now

Agora no Nodo2 vamos consultar os endereços ip

ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:8c:3b:93 brd ff:ff:ff:ff:ff:ff
    inet 10.101.0.26/24 brd 10.101.0.255 scope global eth0
    inet 10.101.0.200/24 brd 10.101.0.255 scope global secondary eth0
    inet6 fe80::a00:27ff:fe8c:3b93/64 scope link 
       valid_lft forever preferred_lft forever

Note que o nosso recurso agora está no servidor Nodo2, vamos consultar os nossos recursos

crm_mon -1
============
Last updated: Fri Jan  4 15:30:17 2013
Stack: openais
Current DC: debian26 - partition WITHOUT quorum
Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
2 Nodes configured, 2 expected votes
1 Resources configured.
============

Online: [ debian26 ]
OFFLINE: [ debian25 ]

 R_IP_Apache  (ocf::heartbeat:IPaddr2): Started debian26

Note que o pacemaker já notou que o debian25 está OFFLINE. Agora vamos ligar ele novamente

Agora vamos consultar os nossos recursos novamente

crm_mon -1
============
Last updated: Fri Jan  4 15:31:16 2013
Stack: openais
Current DC: debian26 - partition with quorum
Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
2 Nodes configured, 2 expected votes
1 Resources configured.
============

Online: [ debian25 debian26 ]

 R_IP_Apache  (ocf::heartbeat:IPaddr2): Started debian25

Note que agora o recurso voltou para o servidor debian25.

Configuração de recursos para monitoramento de serviços

Agora vamos instalar o apache nos dois nodos para utilizarmos o recurso para monitoramento de serviços

aptitude install apache2 -y

Agora no Nodo1 vamos deixar o index.html da seguinte forma

vim /var/www/index.html
<html><body><h1>Debian 25</h1>
</body></html>

Agora no Nodo2 vamos deixar o index.html da seguinte forma

vim /var/www/index.html
<html><body><h1>Debian 26</h1>
</body></html>

Agora vamos parar o apache nos dois nodos

/etc/init.d/apache2 stop

Agora vamos configurar um recurso para monitorar o apache2

crm configure primitive R_Apache lsb:apache2

Agora vamos consultar os recursos

crm_mon -1
============
Last updated: Fri Jan  4 15:36:16 2013
Stack: openais
Current DC: debian26 - partition with quorum
Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
2 Nodes configured, 2 expected votes
2 Resources configured.
============

Online: [ debian25 debian26 ]

 R_IP_Apache  (ocf::heartbeat:IPaddr2): Started debian25
 R_Apache (lsb:apache2):  Started debian26

Note que o recurso foi alocado no servidor debian26, vamos acessar então http://10.101.0.26 o acesso vai estar ok pois o Pacemaker vai subir o serviço do apache automaticamente.

Criação de Grupos de Recursos

Para facilitar a movimentação e o gerenciamento de recursos associados a um serviço, podemos agrupar todos esses recursos em um único grupo de recursos. Assim ao definirmos uma localização para o grupo, todos os recursos serão movidos para a localização desejada.

Vamos levar em consideração o nosso servidor apache que precisa de um endereço ip para ser acessado, e nos nossos recursos o ip está em um servidor e o serviço do apache está em outro servidor, para resolvermos isso vamos criar um grupo

crm configure group G_HTTP_Server R_Apache R_IP_Apache

Agora vamos consultar os nossos recursos novamente

crm_mon -1
============
Last updated: Fri Jan  4 15:41:56 2013
Stack: openais
Current DC: debian26 - partition with quorum
Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
2 Nodes configured, 2 expected votes
1 Resources configured.
============

Online: [ debian25 debian26 ]

 Resource Group: G_HTTP_Server
     R_Apache (lsb:apache2):  Started debian25
     R_IP_Apache  (ocf::heartbeat:IPaddr2): Started debian25

Note que agora tanto o ip quando o serviço do apache estão no servidor debian25, vamos acessar ele em http://10.101.0.200 e vamos ter o acesso corretamente.

Configuração das localizações de Recursos

Agora vamos ver como fazemos para definir o local padrão para o G_HTTP_Server sendo o servidor debian26

crm configure location L_HTTP_Server G_HTTP_Server 100: 10.101.0.26

Agora vamos consultar os nossos recursos

crm_mon -1
============
Last updated: Fri Jan  4 15:47:39 2013
Stack: openais
Current DC: debian26 - partition with quorum
Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
2 Nodes configured, 2 expected votes
1 Resources configured.
============

Online: [ debian25 debian26 ]

 Resource Group: G_HTTP_Server
     R_Apache (lsb:apache2):  Started debian25
     R_IP_Apache  (ocf::heartbeat:IPaddr2): Started debian25

Ele não migrou os recursos pois os recursos estão em funcionamento, agora vamos verificar a configuração do crm

crm configure show
node debian25
node debian26
primitive R_Apache lsb:apache2
primitive R_IP_Apache ocf:heartbeat:IPaddr2 \
  params ip="10.101.0.200" cidr_netmask="255.255.255.0" nic="eth0" \
  op monitor interval="10s"
group G_HTTP_Server R_Apache R_IP_Apache
location L_HTTP_Server G_HTTP_Server 100: 10.101.0.26
property $id="cib-bootstrap-options" \
  dc-version="1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b" \
  cluster-infrastructure="openais" \
  expected-quorum-votes="2" \
  stonith-enabled="false" \
  no-quorum-policy="ignore

Como ele não migrou vamos mandar migrar manualmente, aqui precisamos passar o nome do nodo ao invés do ip

crm resource migrate G_HTTP_Server debian26

Agora vamos consultar os nossos recursos

crm_mon -1
============
Last updated: Fri Jan  4 15:51:04 2013
Stack: openais
Current DC: debian26 - partition with quorum
Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
2 Nodes configured, 2 expected votes
1 Resources configured.
============

Online: [ debian25 debian26 ]

 Resource Group: G_HTTP_Server
     R_Apache (lsb:apache2):  Started debian26
     R_IP_Apache  (ocf::heartbeat:IPaddr2): Started debian26

Agora vamos acessar novamente http://10.101.0.200 e vamos notar que temos a identificação do debian26 :D

Manipulando Recursos

Para parar um recurso podemos fazer da seguinte forma

crm resource stop R_Apache

Aqui no exemplo acima mandamos parar o recurso do apache, vamos consultar os recursos

crm_mon -1
============
Last updated: Fri Jan  4 15:53:15 2013
Stack: openais
Current DC: debian26 - partition with quorum
Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
2 Nodes configured, 2 expected votes
1 Resources configured.
============

Online: [ debian25 debian26 ]

Note que não temos nada mais funcionando pois o R_Apache pertence ao G_HTTP que tem o recurso do apache e o recurso do ip, então temos que cuidar quando formos mandar baixar algum serviços.

Para iniciar um recurso podemos fazer da seguinte forma

crm resource start R_Apache

Agora vamos consultar os nossos recursos novamente

crm_mon -1
============
Last updated: Fri Jan  4 15:55:10 2013
Stack: openais
Current DC: debian26 - partition with quorum
Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
2 Nodes configured, 2 expected votes
1 Resources configured.
============

Online: [ debian25 debian26 ]

 Resource Group: G_HTTP_Server
     R_Apache (lsb:apache2):  Started debian26
     R_IP_Apache  (ocf::heartbeat:IPaddr2): Started debian26

Note que agora temos os nossos recursos funcionando novamente

Podemos mandar listar somente os recursos da seguinte forma

crm resource list
 Resource Group: G_HTTP_Server
     R_Apache (lsb:apache2) Started 
     R_IP_Apache  (ocf::heartbeat:IPaddr2) Started 

Para remover um recurso podemos fazer da seguinte forma

crm configure delete R_Apache

Podemos colocar um nodo em standby da seguinte forma

crm node standby debian26

Agora vamos consultar os nossos recursos

crm_mon -1
============
Last updated: Fri Jan  4 15:58:04 2013
Stack: openais
Current DC: debian26 - partition with quorum
Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
2 Nodes configured, 2 expected votes
1 Resources configured.
============

Node debian26: standby
Online: [ debian25 ]

 Resource Group: G_HTTP_Server
     R_Apache (lsb:apache2):  Started debian25
     R_IP_Apache  (ocf::heartbeat:IPaddr2): Started debian25

Note que os recursos foram migrados automaticamente para o nodo debian25.

Agora vamos deixar o nodo online novamente podemos fazer da seguinte forma

crm node online debian26

Agora vamos consultar os nossos recursos novamente

crm_mon -1
============
Last updated: Fri Jan  4 15:59:16 2013
Stack: openais
Current DC: debian26 - partition with quorum
Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
2 Nodes configured, 2 expected votes
1 Resources configured.
============

Online: [ debian25 debian26 ]

 Resource Group: G_HTTP_Server
     R_Apache (lsb:apache2):  Started debian26
     R_IP_Apache  (ocf::heartbeat:IPaddr2): Started debian26

Note que os recursos voltaram para o servidor padrão que é o debian26.

Podemos editar a configuração do crm da seguinte forma também, use estão opção somente em última alternativa.

crm configure edit
node debian25
node debian26 \
        attributes standby="off"
primitive R_Apache lsb:apache2 \
        meta target-role="Started"
primitive R_IP_Apache ocf:heartbeat:IPaddr2 \
        params ip="10.101.0.200" cidr_netmask="255.255.255.0" nic="eth0" \
        op monitor interval="10s"
group G_HTTP_Server R_Apache R_IP_Apache
location L_HTTP_Server G_HTTP_Server 100: 10.101.0.26
location cli-prefer-G_HTTP_Server G_HTTP_Server \
        rule $id="cli-prefer-rule-G_HTTP_Server" inf: #uname eq debian26
property $id="cib-bootstrap-options" \
        dc-version="1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b" \
        cluster-infrastructure="openais" \
        expected-quorum-votes="2" \
        stonith-enabled="false" \
        no-quorum-policy="ignore"

Monitoramento de Recursos

Agora vamos ver uma lista de comandos úteis para o monitoramento dos recursos criados

Monitorar os recursos do cluster com atualizações a cada 1 segundo

crm_mon --interval=1

O comando acima é similar ao seguinte

watch crm_mon -1

Monitorar os recursos do cluster e exibir a saída em um arquivo html

crm_mon --daemonize --as-html /var/www/cluster.html

Agora já podemos consultar o nosso relatório em http://ip_servidor/cluster.html

Podemos deixar este comando para ser carregado na inicialização do sistema da seguinte forma

echo "crm_mon --daemonize --as-html /var/www/cluster.html" >> /etc/rc.local

Instalando e configurando o Lcmc

Podemos utilizar um cliente qualquer agora para instalar o Lcmc eu vou abordar a instalação no CentOS e no Debian :D porém podemos obter o .exe dele em http://sourceforge.net/projects/lcmc/files/?source=directory

Como é uma ferramenta feita em java vamos mandar instalar os pacotes necessários.

No Debian precisamos instalar

aptitude install sun-java6-jdk -y

No CentOS precisamos instalar

yum install java-1.7.0-openjdk -y

Agora podemos obter o pacote para Debian

cd /usr/src
wget -c http://wiki.douglasqsantos.com.br/Downloads/misc/lcmc_1.4.5-1_all.deb

Agora vamos mandar instalar ele

dpkg -i lcmc_1.4.5-1_all.deb

Caso tenha alguma dependência não satisfeita podemos executar o comando abaixo para resolver.

apt-get -f install -y

Agora vamos obter o pacote para CentOS

cd /usr/src
wget -c http://wiki.douglasqsantos.com.br/Downloads/misc/lcmc-1.4.5-1.noarch.rpm

Agora vamos mandar instalar ele

yum install lcmc-1.4.5-1.noarch.rpm -y

Agora para mandar executar ele precisamos executar o seguinte comando tanto no Debian quanto no CentOS

lcmc &

Vamos ter algo como a imagem abaixo:

Aqui nesta tela precisamos selecionar Add Host / Wizard:

  1. Agora precisamos informar o endereço ip do Nodo1 ex: 10.101.0.25
  2. Agora se a porta de ssh não for a padrão precisamos informar a porta e selecionar Next
  3. Agora vamos selecionar Next novamente
  4. Agora informe a senha do root
  5. Talvez ele peça a senha 3 vezes
  6. Agora selecione Next
  7. Agora ele vai reconhecer qual o Distro que está sendo utilizada selecione Next
  8. Agora ele vai dar uma reclamada que não temos o drbd instalado como não vamos utilizar ele selecine Ski this dialog e selecione Next
  9. Agora selecione Add Another Host
  10. Agora precisamos informar o endereço ip do Nodo2 ex: 10.101.0.26
  11. Agora se a porta de ssh não for a padrão precisamos informar a porta e selecionar Next
  12. Agora vamos selecionar Next novamente
  13. Agora informe a senha do root Caso tenha configurado a troca de chaves não vamos precisar informar a senha do root
  14. Talvez ele peça a senha 3 vezes
  15. Agora selecione Next
  16. Agora ele vai reconhecer qual o Distro que está sendo utilizada selecione Next
  17. Agora ele vai dar uma reclamada que não temos o drbd instalado como não vamos utilizar ele selecine Ski this dialog e selecione Next
  18. Agora selecione Configure Cluster
  19. Agora precisamos informar um Nome para ele ex: Cluster_Matriz agora selecione Next
  20. Agora precisamos informar quais Nodos pertencem a este cluster vamos selecionar o debian25 e o debian26 e vamos selecionar Next
  21. Agora o sistema vai querer saber quem vamos utilizar o Heartbeat ou o Corosync/OpenAIS vamos selecionar o Corosync/OpenAIS e selecione Next
  22. Agora ele vai nos mostrar a configuração do corosync.conf vamos deixar ela como está e vamos selecionar Next/Keep Old Config
  23. Agora vamos ter um aviso que o DRBD e o Heartbeat não estão funcionando mais como não estamos utilizando eles selecione Skip this dialog e selecione Next
  24. Agora deixe selecionado Save e selecione Finish

Se tudo foi seguido como explicado vamos ter algo como a imagem abaixo:

Agora podemos fazer todas as configurações dos recursos pela interface gráfica :D

Uso Real

Situação:

Temos um servidor de FW de borda que vai fazer o balanceamento dos serviços para a DMZ, e só temos um endereço ip público para este servidor, com isso não temos como setar um endereço ip em cada servidor e depois mais um para balanceamento, com isso podemos criar dois recursos um para o endereço ip e outro para o router do provedor de serviços, com isso temos um cluster com somente um endereço ip compartilhado, ou múltiplos endereços compartilhados entre os dois servers e com o GW compartilhado também sem a necessidade de colocar ips sem uso nos servers.

Vamos levar em consideração o seguinte:

  • IP Nodo1: 10.101.0.25
  • IP Nodo2: 10.101.0.26
  • IP público: 200.200.200.1/24
  • GW Público: 200.200.200.254
  • Interface pública: eth1
  • Nome do recurso IP: ClusterIP
  • Nome do recuros GW: ClusterGW
  • Nome do grupo de recursos: G_LVS
  • Nome da localização: L_Cluster_LVS

Para utilizar o recurso de GW precisamos remover o route default da seguinte forma nos dois nodos

route del default

Efetue a configuração do Corosync e não adicione recursos e depois vamos a configuração do nosso ambiente

Vamos criar o recurso que vai conter o endereço ip compartilhado

crm configure primitive ClusterIP ocf:heartbeat:IPaddr2 params ip=200.200.200.1 cidr_netmask=24 nic=eth1 op monitor interval=30s

Agora vamos criar o recurso que vai conter o endereço ip do GW

crm configure primitive ClusterGW ocf:heartbeat:Route params destination="0.0.0.0/0" device=eth1 gateway=200.200.200.254 op monitor interval=30s

Agora vamos configurar um grupo de recursos para podermos agrupar o ip e o gw em um mesmo servidor, aqui leve em consideração a ordem dos recursos como é um ip e o gw então informa o recurso ip primeiro depois o gw pois se a interface não tiver um gw padrão, quando for inserir o gw e não tiver o ip da faixa vai ficar dando erro.

crm configure group G_LVS ClusterIP ClusterGW

Agora vamos criar a configuração de onde vamos deixar os nossos recursos, vou deixar no nodo1

crm configure location L_Cluster_LVS G_LVS 100: 10.101.0.25

Agora vamos criar a configuração de onde vamos deixar os nossos recursos caso o primeiro nodo caia

crm configure location L_Cluster_LVS2 G_LVS 50: 10.101.0.26

Agora vamos listar a nossa configuração

crm configure show
node debian25
node debian26
primitive ClusterGW ocf:heartbeat:Route \
  params destination="0.0.0.0/0" device="eth1" gateway="200.200.200.254" \
  op monitor interval="10" timeout="20"
primitive ClusterIP ocf:heartbeat:IPaddr2 \
  params ip="200.200.200.1" cidr_netmask="24" nic="eth1" \
  op monitor interval="30s"
group G_LVS ClusterIP ClusterGW
location L_Cluster_LVS G_LVS 100: 10.101.0.25
location L_Cluster_LVS2 G_LVS 50: 10.101.0.26
property $id="cib-bootstrap-options" \
  dc-version="1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b" \
  cluster-infrastructure="openais" \
  expected-quorum-votes="2" \
  stonith-enabled="false"

Agora vamos visualizar os nossos recursos

crm_mon -1
============
Last updated: Mon Jan 14 11:59:53 2013
Stack: openais
Current DC: debian25 - partition with quorum
Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
2 Nodes configured, 2 expected votes
1 Resources configured.
============

Online: [ debian25 debian26 ]

 Resource Group: G_LVS
     ClusterIP  (ocf::heartbeat:IPaddr2): Started debian25
     ClusterGW  (ocf::heartbeat:Route): Started debian25

Agora vamos listar as rotas

route -n
Tabela de Roteamento IP do Kernel
Destino         Roteador        MáscaraGen.    Opções Métrica Ref   Uso Iface
200.200.200.0   0.0.0.0         255.255.255.0   U     0      0        0 eth1
10.101.0.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         200.200.200.254 0.0.0.0         UG    0      0        0 eth1

OBS: Caso esteja utilizando em fw de borda com politica de fw drop precisamos ajustar algumas regras.

No nodo1 tem que ser utilizado o ip dele mesmo pois ele trabalha com um tunnel.

iptables -A INPUT -p udp -m state --state NEW -s 10.101.0.25 -m multiport --dports 5404,5405 -j ACCEPT
iptables -A OUTPUT -p udp -m state --state NEW -d 10.101.0.25 -m multiport --dports 5404,5405 -j ACCEPT
iptables -A INPUT -p udp -m state --state NEW -s 226.94.1.1 -m multiport --dports 5404,5405 -j ACCEP
iptables -A INPUT -p udp -m state --state NEW -d 226.94.1.1 -m multiport --dports 5404,5405 -j ACCEP

No nodo2 tem que ser utilizado o ip dele mesmo para liberar pois ele trabalha com um tunnel.

iptables -A INPUT -p udp -m state --state NEW -s 10.101.0.26 -m multiport --dports 5404,5405 -j ACCEPT
iptables -A OUTPUT -p udp -m state --state NEW -d 10.101.0.26 -m multiport --dports 5404,5405 -j ACCEPT
iptables -A INPUT -p udp -m state --state NEW -s 226.94.1.1 -m multiport --dports 5404,5405 -j ACCEP
iptables -A INPUT -p udp -m state --state NEW -d 226.94.1.1 -m multiport --dports 5404,5405 -j ACCEP

Referências