Contents
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:
- Máquina: node1.local
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)
- Máquina: node2.local
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 SystemApó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:
The hpsmh-2.1.10-186.linux.x86_64.rpm component requires input: TrustByAll
- Do you want to activate the iLO driver at startup? [YES]: NO
- Please enter the SNMP localhost read/write community string []: private
- Please enter the SNMP localhost Read-Only community string []: public
- Enter the SNMP Read/Write Authorized Mgmt Station community string []: private
- Enter the SNMP Read-Only Authorized Mgmt Station community string []: public
- Enter the Default SNMP trap community string []: public
- Do you wish to reconfigure the HP Version Control Agent? [Y/N] N
- with 'root only' access! [Y/N]: Y
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.
Arquivo: /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 BOOTPROTO=none ONBOOT=yes MASTER=bond0 SLAVE=yes USERCTL=no ETHTOOL_OPTS="autoneg off speed 100 duplex full"
Arquivo: /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1 BOOTPROTO=none ONBOOT=yes MASTER=bond0 SLAVE=yes USERCTL=no ETHTOOL_OPTS="autoneg off speed 100 duplex full"
Arquivo: /etc/sysconfig/network-scripts/ifcfg-eth2
DEVICE=eth2 BOOTPROTO=none ONBOOT=yes MASTER=bond1 SLAVE=yes USERCTL=no ETHTOOL_OPTS="autoneg off speed 100 duplex full"
Arquivo: /etc/sysconfig/network-scripts/ifcfg-eth3
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
Arquivo: /etc/sysconfig/network-scripts/ifcfg-bond0
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
Arquivo: /etc/sysconfig/network-scripts/ifcfg-bond1
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
Arquivo: /etc/sysconfig/network-scripts/ifcfg-bond0
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
Arquivo: /etc/sysconfig/network-scripts/ifcfg-bond1
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
Obs.: Se tiver algum problema com a ordem que as placas sobem após o boot, é preciso definir o parametro HWADDR com os respectivos endereços MAC de cada placa nos seus arquivos de configuração.
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.
- Ex.: Se o node1 estiver ativo, e não conseguir mais se comunicar via eth2 com o node2, o node1 envia um comando para a iLO do node2 (via eth0) para que o node2 seja reiniciado, pois pode ter tido algum problema de rede ou congelamento do sistema operacional.
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
Verificando o status do cluster com o comando clustat , com este comando é possível ver também se os membros estão Online ou Offline
[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
- Verificando os membros ativos
[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.
Ex.: os serviços estão rodando no node1.local, e é preciso passar os serviços para o node2.local, deve-se então rodar o comando clusvcadm -r cluster-services
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
Obs.: Existe um bug referente ao comando fence_node quando se utiliza o plugin da iLO, está relatado aqui.
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
Obs.: Este problema é um bug já relatado neste link pelo Lon Hohberger
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 .