systemadmin.es > Clustering > Instalación y configuración de un cluster con heartbeat 2 y pacemaker

Instalación y configuración de un cluster con heartbeat 2 y pacemaker

La versión 2 de heartbeat ha cambiado bastante respecto la versión 1. Vamos a ver como instalar heartbeat y como configurar un servicio con pacemaker con una VIP asociada.

Para esta configuración vamos a suponer dos hosts:

  • host1
  • host2

Empezaremos instalando el repositorio de clusterlabs e instalando todos los paquetes necesarios en ambos nodos (deberemos tener instalado previamente el respositorio EPEL):

wget http://clusterlabs.org/rpm/epel-5/clusterlabs.repo -O /etc/yum.repos.d/pacemaker.repo
yum install heartbeat cluster-glue resource-agents pacemaker -y

A continuación deberemos modificar el fichero /etc/hosts, añadiendo los dos nodos del cluster:

172.16.2.10	host1
172.16.2.11	host2

A continuación, en uno de los dos nodos generamos el fichero /etc/ha.d/ha.cf con lo siguiente:

autojoin none
bcast eth0

warntime 5
deadtime 15
initdead 60
keepalive 2

node host1
node host2

pacemaker respawn

Los parámetros son los siguientes:

  • autojoin: Indicamos que no queremos que haga autojoin, indicamos estáticamente los nodos del cluster en la configuración mediante node
  • bcast: Mediante bcast indicamos por que interfaz y mediante broadcast se pasaran mensajes entre los nodos del cluster. Podemos hacerlo también por multicast (mcast) pero si tenemos una VLAN para el cluster y no hay más de un cluster en la VLAN podemos dejarlo con broadcast.
  • Mediante warntime, deadtime, initdead, keepalive indicamos diferentes valores globales de timeouts.
  • pacemaker respawn: En caso que el pacemaker se muera por algun motivo, se vuelve a iniciar.

A continuación deberemos generar el fichero de autenticación mediante pwgen:

yum install pwgen -y

En uno de los nodos generamos el fichero con lo siguiente:

cat <<EOF >/etc/ha.d//authkeys
auth 1 
1 sha1 $(pwgen 30 | openssl sha1)
EOF
chmod 600 /etc/ha.d/authkeys

A continuación deberemos propagar los ficheros mediante ha_propagate:

# /usr/share/heartbeat/ha_propagate

A continuación levantaremos el daemon en todos los nodos:

/etc/init.d/heartbeat start

Podemos ver con ps que lo tenemos levantado:

# ps auxf | grep [h]eart
root      2220  0.0  1.0   5572  5572 ?        SLs  13:08   0:00 heartbeat: master control process
root      2223  0.0  1.0   5544  5544 ?        SL   13:08   0:00  \_ heartbeat: FIFO reader      
root      2224  0.0  1.0   5540  5540 ?        SL   13:08   0:00  \_ heartbeat: write: bcast eth0
root      2225  0.0  1.0   5540  5540 ?        SL   13:08   0:00  \_ heartbeat: read: bcast eth0 
102       2228  0.0  0.3   4960  1884 ?        S    13:08   0:00  \_ /usr/lib/heartbeat/ccm
102       2229  0.1  0.6   8312  3384 ?        S    13:08   0:00  \_ /usr/lib/heartbeat/cib
root      2230  0.0  0.3   5080  1644 ?        S    13:08   0:00  \_ /usr/lib/heartbeat/lrmd -r
root      2231  0.0  1.2   6260  6260 ?        SL   13:08   0:00  \_ /usr/lib/heartbeat/stonithd
102       2232  0.0  0.4   7828  2368 ?        S    13:08   0:00  \_ /usr/lib/heartbeat/attrd
102       2233  0.0  0.5   7908  2708 ?        S    13:08   0:00  \_ /usr/lib/heartbeat/crmd

Mediante crm status podemos ver el estado del cluster:

# crm status
============
Last updated: Thu Mar 17 13:12:23 2011
Stack: Heartbeat
Current DC: host2 (a49ba348-6ace-4bb3-a51f-831a72b7cdf3) - partition with quorum
Version: 1.0.10-da7075976b5ff0bee71074385f8fd02f296ec8a3
2 Nodes configured, unknown expected votes
0 Resources configured.
============

Online: [ host1 host2 ]

A continuación verificamos la configuración:

# crm_verify -L
crm_verify[2340]: 2011/03/17_13:34:14 ERROR: unpack_resources: Resource start-up disabled since no STONITH resources have been defined
crm_verify[2340]: 2011/03/17_13:34:14 ERROR: unpack_resources: Either configure some or disable STONITH with the stonith-enabled option
crm_verify[2340]: 2011/03/17_13:34:14 ERROR: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrity
Errors found during check: config not valid
  -V may provide more details

STONITH (cluster-glue) se encarga de reiniciar los nodos en caso que se encuentren en un estado indeterminado para permitir levantar sus servicios en otro nodo. De momento lo podemos dejar deshabilitado:

crm configure property stonith-enabled=false

También deberemos definir el número de votos con los que indicamos que el cluster tiene quorum:

2 Nodes configured, unknown expected votes

En el caso de dos nodos, tiene poco sentido, por lo que se lo dejaremos en 2:

crm configure property expected-quorum-votes="2"

Indicaremos a continuación que siga funcionando el cluster en caso que no tenga quorum (uno de los dos nodos desaparezca). En caso que no lo hiciéramos, si uno de los nodos lo apagáramos, el otro apagaría todos los servicios al perder quorum:

crm configure property no-quorum-policy=ignore

Para evitar que los servicios hagan fail-back (vuelvan al otro nodo cuando se recupere de un fallo):

crm configure rsc_defaults resource-stickiness=100

A continuación añadiremos servicios, primero de todo tenemos que obtener el listado de clases que podemos añadir:

# crm ra classes
heartbeat
lsb
ocf / heartbeat pacemaker
stonith

Mediante crm ra list podemos listar los scripts de control de una de las clases:

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

A continuación mediante crm ra info podemos obtener los datos de funcionamiento de un script en concreto:

# crm ra info ocf:heartbeat:IPaddr2
Manages virtual IPv4 addresses (Linux specific version) (ocf:heartbeat:IPaddr2)

This Linux-specific resource manages IP alias IP addresses.
It can add an IP alias, or remove one.
In addition, it can implement Cluster Alias IP functionality
if invoked as a clone resource.

Parameters (* denotes required, [] the default):

ip* (string): IPv4 address
    The IPv4 address to be configured in dotted quad notation, for example
    "192.168.1.1".

nic (string, [eth0]): Network interface
    The base network interface on which the IP address will be brought
    online. 
    
    If left empty, the script will try and determine this from the
    routing table.
    
    Do NOT specify an alias interface in the form eth0:1 or anything here;
    rather, specify the base interface only.

cidr_netmask (string): CIDR netmask
    The netmask for the interface in CIDR format
    (e.g., 24 and not 255.255.255.0)
    
    If unspecified, the script will also try to determine this from the
    routing table.

broadcast (string): Broadcast address
    Broadcast address associated with the IP. If left empty, the script will
    determine this from the netmask.

iflabel (string): Interface label
    You can specify an additional label for your IP address here.
    This label is appended to your interface name.
    If a label is specified in nic name, this parameter has no effect.

lvs_support (boolean, [false]): Enable support for LVS DR
    Enable support for LVS Direct Routing configurations. In case a IP
    address is stopped, only move it to the loopback device to allow the
    local node to continue to service requests, but no longer advertise it
    on the network.

mac (string): Cluster IP MAC address
    Set the interface MAC address explicitly. Currently only used in case of
    the Cluster IP Alias. Leave empty to chose automatically.

clusterip_hash (string, [sourceip-sourceport]): Cluster IP hashing function
    Specify the hashing algorithm used for the Cluster IP functionality.

unique_clone_address (boolean, [false]): Create a unique address for cloned instances
    If true, add the clone ID to the supplied value of ip to create
    a unique address to manage

arp_interval (integer, [200]): ARP packet interval in ms
    Specify the interval between unsolicited ARP packets in milliseconds.

arp_count (integer, [5]): ARP packet count
    Number of unsolicited ARP packets to send.

arp_bg (string, [yes]): ARP from background
    Whether or not to send the arp packets in the background.

arp_mac (string, [ffffffffffff]): ARP MAC
    MAC address to send the ARP packets too.
    
    You really shouldn't be touching this.

Operations' defaults (advisory minimum):

    start         timeout=20s
    stop          timeout=20s
    status        interval=10s timeout=20s
    monitor_0     interval=10s timeout=20s

Añadiremos una IP de cluster (VIP) como servicio con crm configure primitive:

crm configure primitive haip1 ocf:heartbeat:IPaddr2 params ip=172.16.2.100 cidr_netmask=32 op monitor interval=30s

Mediante crm status podemos apreciar que se ha levantado y en que nodo:

# crm status
============
Last updated: Thu Mar 17 13:36:33 2011
Stack: Heartbeat
Current DC: host2 (a49ba348-6ace-4bb3-a51f-831a72b7cdf3) - partition with quorum
Version: 1.0.10-da7075976b5ff0bee71074385f8fd02f296ec8a3
2 Nodes configured, unknown expected votes
1 Resources configured.
============

Online: [ host1 host2 ]

 haip1	(ocf::heartbeat:IPaddr2):	Started host1

En el nodo que se haya levantado podemos ver como esta presente mediante ip addr show:

# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:40:db:82 brd ff:ff:ff:ff:ff:ff
    inet 172.16.2.10/16 brd 172.16.255.255 scope global eth0
    inet 172.16.2.100/32 brd 172.16.6.100 scope global eth0

A continuación mediante ocf:heartbeat:anything podemos añadir cualquier daemon al cluster. Primero obtenemos los detalles con crm ra info:

# crm ra info ocf:heartbeat:anything
Manages an arbitrary service (ocf:heartbeat:anything)

This is a generic OCF RA to manage almost anything.

Parameters (* denotes required, [] the default):

binfile* (string): Full path name of the binary to be executed
    The full name of the binary to be executed. This is expected to keep running with the same pid and not just do something and exit.

cmdline_options (string): Command line options
    Command line options to pass to the binary

pidfile (string, [/var/run//anything_undef.pid]): File to write STDOUT to
    File to read/write the PID from/to.

logfile (string): 
    File to write STDOUT to

errlogfile (string): 
    File to write STDERR to

user (string, [root]): 
    User to run the command as

monitor_hook (string): 
    Command to run in monitor operation

stop_timeout (string): Seconds to wait after having sent SIGTERM before sending SIGKILL in stop operation
    In the stop operation: Seconds to wait for kill -TERM to succeed
    before sending kill -SIGKILL. Defaults to 2/3 of the stop operation timeout.

Operations' defaults (advisory minimum):

    start         timeout=20s
    stop          timeout=20s
    monitor_0     interval=10 timeout=20s

Por ejemplo, añadimos el daemon de memcached al cluster con el siguiente comando:

crm configure primitive memcache ocf:heartbeat:anything params binfile="/usr/bin/memcached" cmdline_options="-u\ memcached\ -p\ 11311\ -c\ 1024\ -m\ 32" monitor_hook="/usr/bin/nc\ -z\ localhost\ 11311" op monitor interval="10" timeout="20s" depth="0"

Mediante crm status podemos apreciar como se ha añadido:

# crm status
============
Last updated: Thu Mar 17 15:19:51 2011
Stack: Heartbeat
Current DC: host2 (a49ba348-6ace-4bb3-a51f-831a72b7cdf3) - partition with quorum
Version: 1.0.10-da7075976b5ff0bee71074385f8fd02f296ec8a3
2 Nodes configured, 2 expected votes
2 Resources configured.
============

Online: [ host1 host2 ]

 haip1	(ocf::heartbeat:IPaddr2):	Started host1
 memcache	(ocf::heartbeat:anything):	Started host2

A continuación podemos indicar dos recursos con que puntuación deben mantenerse juntos:

# crm configure colocation 
usage: colocation <id> <score>: [:] [:]

Mediante crm configure colocation indicamos que la VIP y el servicio de memcache estén en el mismo nodo:

crm configure colocation memcached-ip1 INFINITY: haip1 memcache

Revisamos con crm status como se han agrupado:

# crm status
============
Last updated: Thu Mar 17 15:25:09 2011
Stack: Heartbeat
Current DC: host2 (a49ba348-6ace-4bb3-a51f-831a72b7cdf3) - partition with quorum
Version: 1.0.10-da7075976b5ff0bee71074385f8fd02f296ec8a3
2 Nodes configured, 2 expected votes
2 Resources configured.
============

Online: [ host1 host2 ]

 haip1	(ocf::heartbeat:IPaddr2):	Started host1
 memcache	(ocf::heartbeat:anything):	Started host1

A continuación mediante order indicamos el orden en que se deben arrancar los servicios:

# crm configure order
usage: order <id> score-type: <first-rsc>[:<action>] <then-rsc>[:<action<]
        [symmetrical=<bool>]

Por lo tanto, indicamos que primero se levante la IP y a continuación el memcached:

crm configure order ip-memcache mandatory: haip1 memcache

6 comments to “Instalación y configuración de un cluster con heartbeat 2 y pacemaker”

  1. gracias amigos lo voy a practicar y les aviso que tal me va,no saben lo útil que me es esto.

  2. Debes empezar a usar Corosync 🙂

  3. tengo problemas configurando el pacemaker y no hay muchas instrucciones aqui… podras darme una mano con eso!?

  4. Alguien ha probado esta configuración con asterisk?

  5. Hola muy buen tutorial entre este y otros tutoriales he conseguido hasta el momento Crear mi pequeño Cluster con 2 Nodos y una IP virtual. Ahora voy a intentar poner mysql en Alta Disponibilidad.

    Gracias

  6. Podria alguien ayudarme diciendome como agregaria el servicio de proxy http (squid) y dansguardian que es lo que tengo montado para agregarlo al cluster?
    Gracias desde ya!

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>