Instalaçao do RHEL 5.1 Cluster Suite

Este documento descreve como configurar um ambiente em cluster utilizando o RHEL Cluster suite.

O ambiente a ser configurado consiste em um cluster de dois nós, sendo um ativo e um em standby, onde o nó ativo assume um VIP (virtual IP), monta as partições que estão no storage e disponibiliza os serviços apache e o mysql.

As máquinas utilizadas na solução são dois HP DL380 g5, por isso o Gnome Desktop é instalado nos membros, para pode instalar o Support Pack da HP que contém os drivers apropriados para esta máquina para o sistema operacional RHEL 5.1, caso não queira instalar o gnome e fazer a instalação do Support Pack através da linha de comando, isso também é possível.

             VIP
              |
         -----------
        |           | 
     node1         node2


Definição das configurações do ambiente

As partições criadas nos membros são:

/dev/cciss/c0d0p1       /boot   100M
/dev/cciss/c0d0p2       SWAP    2G
/dev/cciss/c0d0p3       /       10G
/dev/cciss/c0d0p4       Extended
/dev/cciss/c0d0p5       /var    57G

O nome das máquinas devem ser definidos como

node1.local
node2.local

Configurações IP:

eth0 192.168.2.153/24
eth2 10.10.10.1/30
iLO IP 192.168.2.149/24
Default GW 192.168.2.1 (Default GW da rede)

eth0 192.168.2.154/24
eth2 10.10.10.2/30
iLO IP 192.168.2.150/24
Default GW 192.168.2.1 (Default GW da rede)

Onde a eth2 será utilizada para verificar a disponibilidade dos membros. O certo é criar uma Vlan no switch para isolar esta rede e manter a comunicação isolada. Após a instalação do Support Pack será feita a configuração de Bonding, onde temos a utilização de duas placas de rede em alta disponibilidade.

Os pacotes selecionados no momento da instalação são os seguintes:

Desktop Environment     --> Gnome Desktop
Applications --> Graphical Internet
Development --> Development Libraries
                                Development Tools
                                Legacy Software Development
Server -->      Legacy Network Server
                        Mysql Database
                        Printing Support
                        Web Server
                                Optional Packages
                                        + mod_auth_mysql
                                        + php-mysql
                                        + php-odbc
                                        + php-pear
                                        - squid
                                        - webalizer
Base System --> Administration Tools
                                Base
                                Java
                                Legacy Software Tools
                                System Tools
                                X Window System

Após a instalação concluída, alguns pacotes extras devem ser instalados, e estão localizados dentro do CD do RHEL. Ao montar o CD, pode-se ver uma pasta de nome Cluster onde estão os pacotes necessários para a instalação do Cluster, pode-se ver também a pasta Server que é a pasta onde estão os pacotes referentes ao RHEL em sí.

mount /dev/cdrom /mnt
cd /mnt
rpm -ivh Server/perl-Net-Telnet*
rpm -ivh Server/perl-Carp-Clan*
rpm -ivh Server/perl-Bit-Vector*
rpm -ivh Server/perl-Date-Calc*
rpm -ivh Server/perl-Crypt-SSLeay*
rpm -ivh Server/openais*
rpm -ivh Server/cman*
rpm -ivh Server/postfix*
rpm -ivh Cluster/rgmanager*

Na sequência vamos remover o sendmail, pois o pacote a ser utilizado será o postfix.

rpm -e sendmail

Devem ser habilitados os seguintes serviços abaixo, e também removido alguns serviços que não são necessários.

chkconfig cman on
chkconfig rgmanager on
chkconfig postfix on
chkconfig openais off
chkconfig iptables off
chkconfig ip6tables off
chkconfig bluetooth off
chkconfig avahi-daemon off
chkconfig portmap off
chkconfig acpid off


Instalação do Support Pack para o servidor HP DL380 G5

A versão utilizada foi a versão 7.92, e pode ser obtida neste Link

Baixe o pacote de 97 M. e copie o arquivo psp-7.92.rhel5.linux.en.tar.gz para os membros, e na sequência faça o seguinte:

tar xvzf psp-7.92.rhel5.linux.en.tar.gz 
cd compaq/csp/linux
./install792.sh -nui

Algumas perguntas serão feitas, e as que eu alterei foram as seguintes:

Por último, remover o pacote de inicialização hp-vt.

chkconfig hp-vt off

Antes de iniciar a configuração do cluster, é preciso definir o arquivo /etc/hosts, neste caso ficou como está abaixo e deve ser igual nos dois nós do cluster

# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1       localhost.localdomain   localhost
::1     localhost6.localdomain6 localhost6

10.10.10.1      node1.local     node1
10.10.10.2      node2.local     node2
192.168.2.149   ilo-node1.local ilo-node1
192.168.2.150   ilo-node2.local ilo-node2

Pode-se ver que existe a configuração referente a iLO das máquinas, onde foram configuradas com os respectivos endereços IP's.


Configuração de bounding das interfaces de rede

Como este servidor tem 4 placas de rede, vamos utilizar a eth0 e eth1 para responder para a rede interna e a eth2 e eth3 para a comunicação dos cluster. Para isso, deve-se seguir os seguintes passos.

Abra o arquivo /etc/modprobe.conf e adicione as seguintes linhas ao final do arquivo.

alias bond0 bonding
alias bond1 bonding
options bonding mode=0 miimon=100

Em seguida deve ser feita a configuração dos scripts de inicialização das interfaces de rede no diretório /etc/sysconfig/network-scripts/ .

Os seguintes arquivos são iguais em ambas as máquinas, e logo abaixo tem as configurações das interfaces bond0 e bond1 para cada uma das máquinas.

DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no
ETHTOOL_OPTS="autoneg off speed 100 duplex full"

DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no
ETHTOOL_OPTS="autoneg off speed 100 duplex full"

DEVICE=eth2
BOOTPROTO=none
ONBOOT=yes
MASTER=bond1
SLAVE=yes
USERCTL=no
ETHTOOL_OPTS="autoneg off speed 100 duplex full"

DEVICE=eth3
BOOTPROTO=none
ONBOOT=yes
MASTER=bond1
SLAVE=yes
USERCTL=no
ETHTOOL_OPTS="autoneg off speed 100 duplex full"

Configuração do node1.local

DEVICE=bond0
USERCTL=no
ONBOOT=yes
IPADDR=192.168.2.153
NETMASK=255.255.255.0
BROADCAST=192.168.2.255
NETWORK=192.168.2.0
GATEWAY=192.168.2.1

DEVICE=bond1
USERCTL=no
ONBOOT=yes
IPADDR=10.10.10.1
NETMASK=255.255.255.252
BROADCAST=10.10.10.3
NETWORK=10.10.10.0

Configuração do node2.local

DEVICE=bond0
USERCTL=no
ONBOOT=yes
IPADDR=192.168.2.154
NETMASK=255.255.255.0
BROADCAST=192.168.2.255
NETWORK=192.168.2.0
GATEWAY=192.168.2.1

DEVICE=bond1
USERCTL=no
ONBOOT=yes
IPADDR=10.10.10.2
NETMASK=255.255.255.252
BROADCAST=10.10.10.3
NETWORK=10.10.10.0

Reinicie a máquina para que tudo suba de acordo. reboot

Após o boot, faça o teste de ping entre as máquinas, e o default gateway da rede. No membro node1.local

ping 192.168.2.1
ping 192.168.2.149
ping 192.168.2.150
ping 10.10.10.2
ping node2
ping ilo-node1
ping ilo-node2

No membro node1.local

ping 192.168.2.1
ping 192.168.2.149
ping 192.168.2.150
ping 10.10.10.1
ping node1
ping ilo-node1
ping ilo-node2


Configuração do Multipath

Para que o linux possa ter acesso aos dados do storage, é preciso configurar o multipath. O pacote responsável pela comunicação do linux com o storage é o device-mapper-multipath.

Após apresentar os discos do storage para o linux (Não abordado aqui como se faz isso), devemos verificar se o linux está visualizando os disco do storage.

Edite o arquivo /etc/multipath.conf e comente o bloco abaixo para que os devices não sejam bloqueados, deixe como abaixo, e também verifique se a opção user_friendly_names está setada para yes, caso não esteja, faça isso.

#blacklist {
#        devnode "*"
#}

Após isso, certifique-se que o módulo dm_multipath está carregado

[root@node1 /]# lsmod | grep dm_multipath
dm_multipath           52433  2 dm_round_robin
dm_mod                 96017  7 dm_mirror,dm_multipath

Inicialize o serviço multipathd

service multipathd start

Veja se os discos estão presentes, o resultado do comando está abaixo, bem como o status dos paths.

[root@node1 /]# multipath -l
mpath0 (3600508b40010870a0001e000000d0000) dm-0 HP,HSV200
[size=10G][features=1 queue_if_no_path][hwhandler=0]
\_ round-robin 0 [prio=0][active]
 \_ 0:0:1:1 sdb 8:16  [active][undef]
 \_ 1:0:0:1 sdc 8:32  [active][undef]
\_ round-robin 0 [prio=0][enabled]
 \_ 0:0:0:1 sda 8:0   [active][undef]
 \_ 1:0:1:1 sdd 8:48  [active][undef]

Pode-se ver também no diretório /dev/mpath/ algo como abaixo

lrwxrwxrwx  1 root root    7 Mar  7 09:49 3600508b40010870a0001e000000d0000 -> ../dm-0

E como deixamos a opção user_friendly_names setada para yes, podemos usar um nome amigável pra localizar o device criado, isso pode ser visto em /dev/mapper/

[root@node1 ~]# ls -la /dev/mapper/
total 0
drwxr-xr-x  2 root root     100 Mar  7 09:49 .
drwxr-xr-x 14 root root    4280 Mar  7 09:49 ..
crw-------  1 root root  10, 63 Mar  7 09:49 control
brw-rw----  1 root disk 253,  0 Mar  7 09:49 mpath0

Tudo certo até agora, o que precisa ser feito é criar uma partição neste disco mpath0 e criar o sistema de arquivos para ela.

Crie a partição com o comando fdisk /dev/mapper/mpath0 .

Em seguida

[root@node1 ~]# partprobe

E então, crie o sistema de arquivos na partição criada.

[root@node1 ~]# mkfs.ext3 /dev/mapper/mpath0p1

Ok, podemos testar a partição montando em algum lugar.

[root@node1 ~]# mount /dev/mapper/mpath0p1 /mnt

E pode-se ver o disco montado

[root@node1 ~]# df -h | grep mpath0p1
/dev/mapper/mpath0p1  9.9G  999M  8.4G  11% /mnt

O arquivo /var/lib/multipath/bindings é criado automaticamente a partir do daemon multipathd, e possui o nome amigável para o multipath, um exemplo de seu conteúdo está abaixo.

mpath0 3600508b40010870a0001e000000d0000

obs.: É muito importante que este arquivo seja igual nos dois nós, porque senão teremos problemas com a montagem da partição. Caso isso ocorra, verifique a documentação e veja como criar alias para o wwid, pode ser a solução.


Openais

É preciso verificar e alterar o arquivo /etc/ais/openais.conf para que ele utilize a rede 10.10.10.0 e não a rede 192.168.2.0, isso deve ser feito nas duas máquinas.

Altere a linha

bindnetaddr: 192.168.2.0

Para

bindnetaddr: 10.10.10.0


Configuração do Cluster

A configuração do cluster é feita a partir do arquivo /etc/cluster/cluster.conf e a configuração deste ambiente está definida abaixo.

<?xml version="1.0"?>
<cluster config_version="1" name="teste">
<cman two_node="1" expected_votes="1">
</cman>
<clusternodes>
        <clusternode name="node1.local" nodeid="1" votes="1">
                <fence>
                                        <method name="1">
                                                <device name="ilo-node1"/>
                                        </method>
                                        <method name="2">
                                                <device name="manual" nodename="node1.local"/>
                                        </method>
                </fence>
        </clusternode>
        <clusternode name="node2.local" nodeid="2" votes="1">
                <fence>
                                        <method name="1">
                                                <device name="ilo-node2"/>
                                        </method>
                                        <method name="2">
                                                <device name="manual" nodename="node2.local"/>
                                        </method>
                </fence>
        </clusternode>
</clusternodes>
<fencedevices>
        <fencedevice agent="fence_ilo" hostname="ilo-node1.local" login="Administrator" name="ilo-node1" passwd="12345"/>
        <fencedevice agent="fence_ilo" hostname="ilo-node2.local" login="Administrator" name="ilo-node2" passwd="12345"/>
        <fencedevice agent="fence_manual" name="manual" />
</fencedevices>

<rm>
<failoverdomains/>
       <service name="cluster-services" autostart="1">
                <fs name="dados" device="/dev/mapper/mpath0p1" fstype="ext3" mountpoint="/dados" force_unmount="1"/>
                <ip address="192.168.2.23"/>
                <script name="apache" file="/etc/init.d/httpd"/>
                <script name="mysql" file="/etc/init.d/mysqld"/>
       </service>
</rm>
</cluster>

Maiores informações sobre os parametros podem ser encontradas neste link

O parametro fencedevice, é utilizado para reiniciar os nós quando algum problema acontecer.

Caso o node2 esteja sem cabo de energia, teremos problema, pois o node1 não conseguirá enviar o reset para a iLO do node2, o cluster ficará instável e algumas medidas manuais terão que ser tomadas, e serão vistas mais a frente nesta documentação.

Este parametro fencedevice é muito importante para garantir a integridade dos dados, principalmente se os nós estiverem acessando um storage para a leitura e gravação dos dados. Imagine se, o node1 não consegue mandar o reset para o node2 (que está com os serviços ativos) e resolve montar as partições do storage e iniciar os serviços? Isso irá corromper o file system, porque ambos os nós vão montar a partição do storage. Por isso em algumas situações é preciso interagir com alguns comandos manuais a fim de não corromper os dados.

Inicialize os serviços rgmanager e cman nos dois nós.

service rgmanager start
service cman start


Administração do Cluster

Quem "cuida" dos serviços que o cluster roda é o serviço rgmanager

[root@node1 ~]# clustat
Member Status: Quorate

  Member Name                        ID   Status
  ------ ----                        ---- ------
  node1.local                           1 Online, Local, rgmanager
  node2.local                           2 Online, rgmanager

  Service Name         Owner (Last)                   State
  ------- ----         ----- ------                   -----
  service:cluster-serv node1.local                    started

[root@node1 ~]# cman_tool nodes
Node  Sts   Inc   Joined               Name
   1   M     36   2008-02-29 13:07:42  node1.local
   2   M     40   2008-02-29 13:07:42  node2.local

Outro comando interessante é o clusvcadm, com este comando você pode parar os serviços do cluster, ou até mesmo realocar o serviço de um membro para o outro.

Alguns outros parametros interessantes são:

clusvcadm -e [service]  <-- enable (start)
clusvcadm -d [service]  <-- disable (stop)
clusvcadm -r [service]  <-- relocate (move to another machine)

Caso seja preciso reiniciar um dos nós, é possível fazer isso através dos comandos abaixo, isso irá disparar o agente da iLO e reiniciará a máquina solicitada

[root@node1 /]# fence_node node2.local    <-- node2.local should reboot
[root@node2 /]# fence_node node1.local    <-- node1.local should reboot


Ações manuais para reiniciar os serviços

Caso o node2 caia, e os serviços não subam no node1 é preciso subir os serviços manualmente e ter CERTEZA de que o node2 não está com os serviços ativos e/ou as partições do storage montadas, a fim de manter a integridade dos dados e não corromper os mesmo.

Primeiramente verificar com o comando clustat o estado dos membros

[root@node1 ~]# clustat
Member Status: Quorate

  Member Name                        ID   Status
  ------ ----                        ---- ------
  node1.local                           1 Online, Local, rgmanager
  node2.local                           2 Offline

  Service Name         Owner (Last)                   State
  ------- ----         ----- ------                   -----
  service:cluster-serv node2.local                    started
[root@node1 ~]#

Pode-se ver que o node2 está Offline, e para o node1 os serviços ainda estão ativos no node2. Isso acontece pois o node1 não consegue verificar se o node2 teve um problema de rede ou se a máquina teve algum crash e ainda pode estar com as partições do storage montadas, e caso o node1 inicie os serviços, os dados poderão serão corrompidos.

Como o node1 não consegue obter as informações do node2, é preciso verificar os logs para ver se o processo está travado.

tail -f /var/log/messages
Feb 29 15:24:45 node1 fenced[14370]: fencing node "node2.local"
Feb 29 15:24:45 node1 ccsd[14348]: process_get: Invalid connection descriptor received.
Feb 29 15:24:45 node1 ccsd[14348]: Error while processing get: Invalid request descriptor
Feb 29 15:24:45 node1 fenced[14370]: fence "node2.local" failed

Para solucionar isso é preciso rodar o comando abaixo

echo node2.local > /var/run/cluster/fenced_override

E pode-se ver nos logs o resultado do comando

tail -f /var/log/messages
Feb 29 15:29:27 node1 fenced[14370]: fence "node2.local" overridden by administrator intervention

E na sequência, deve-se parar os serviços e iniciar os mesmos novamente no node1.

clusvcadm -d cluster-services
clusvcadm -e cluster-services

Após isso, com o comando clustat pode-se ver os serviços rodando no node1

[root@node1 ~]# clustat
Member Status: Quorate

  Member Name                        ID   Status
  ------ ----                        ---- ------
  node1.local                           1 Online, Local, rgmanager
  node2.local                           2 Offline

  Service Name         Owner (Last)                   State
  ------- ----         ----- ------                   -----
  service:cluster-serv node1.local                    started
[root@node1 ~]#


Agradecimentos

Agradeço ao Lon Hohberger que me auxiliou na configuração do ambiente.

E ao pessoal do canal #linux-cluster no servidor irc.freenode.net

Meu nome é Fabio Silva , fssilva@gmail.com - http://www.fabiosilva.eti.br .

None: QuickStart-Portuguese (last edited 2008-04-17 19:26:24 by fabiosilva)