Todo lo que se necesita saber para usar Pacemaker como solución de alta disponibilidad en bases de datos.
Presentación dada en la conferencia MySQL NoSQL & Cloud Latin America en Buenos Aires el 15/10/2013.
1. Alta disponibilidad con Pacemaker
Ing. Nelson Calero, OCP
nelson.calero@awen.com.uy
@ncalerouy
MySQL / NoSQL / Cloud Latin America Conference
Martes 15 de Octubre 2013 - Buenos Aires, Argentina
2. Nelson Calero
• http://www.linkedin.com/in/ncalero
• Ingeniero en Computación. OCP DBA 10g. Especializado en
performance y HA (MySQL / Cluster / Oracle / RAC)
• Trabajando con herramientas Oracle y entorno linux desde 1996
• DBA Oracle (desde 2001) & MySQL (desde 2005)
• Instructor de Oracle University desde 2011
• Co-fundador y Presidente del Grupo de Usuarios
Oracle de Uruguay (UYOUG) desde 2009
• Orador frecuente en eventos como Oracle OpenWorld
Latinoamérica, Collaborate, OTN Tour Uruguay/Argentina, JIAP,
MySQL Argentina
• Co-fundador y director de Awen Consulting
Octubre 2013
2/45
4. HA en BD
Distintos sabores nativos en cada motor
• Mysql – Cluster shared nothing, replicación
• Postgres – Replicación, standby
• Oracle – Cluster shared storage, replicación, standby
Soluciones de terceros
• Replicación – Continuent, GoldenGate (ex, ahora Oracle)
• HA – Heartbeat, Pacemaker
• Específicas:
– Galera – replicación sincrónica MySQL
– DBVisit – standby sobre Oracle Standard Edition
– ...
Octubre 2013
4/45
5. ¿Pacemaker?
Cluster resource manager - http://www.clusterlabs.org/
• Detecta y recupera fallas de nodo y recursos.
• Solución de HA gpl (v2), no hay versión enterprise.
– Apoyado por RedHat, Novell y LinBit.
• Componentes: mensajería + agentes + recursos
• Soporta varios stacks de mensajería: Heartbeat, Corosync
(fork de OpenAIS) y CMAN (redhat)
• Maneja cualquier recurso que se pueda gestionar con
scripts.
• Robusto: 9 años en el mercado.
– Usado por control de tráfico aéreo de Alemania
Octubre 2013
5/45
9. Pacemaker...
• Funcionalidad incluida en Heartbeat hasta versión 2.1.3.
– Ahora heartbeat es solo mensajería y membresía
("cluster stack" o "cluster infrastructure").
• Instalación por defecto usa Corosync como cluster stack.
– fork de OpenAIS que implementa solo lo necesario
– protocolo Totem, UDP (puerto 5405), multicast
• Configuración almacenada en archivo XML
– CIB (cluster information base).
• Implementa STONITH como mecanismo de fencing.
• No requiere storage compartido.
Octubre 2013
9/45
11. Pacemaker con BD
• Hay agentes para bases de datos MySQL, Postgres, Oracle,
SAP y DB2: http://www.linux-ha.org/wiki/Resource_Agents
• Opción oficial de HA en MySQL:
Chapter 15 High Availability and Scalability
15.2 Overview of MySQL with DRBD/Pacemaker/Corosync/Oracle Linux
http://dev.mysql.com/doc/refman/5.6/en/ha-drbd.html
• Gran comunidad de usuarios
• percona-prm: Mysql Replication Manager
– Versión Alpha en 2011, parte del paquete resource-agents
desde la versión 3.9.3 (OpenSUSE tiene cambios)
https://github.com/percona/percona-pacemaker-agents
Octubre 2013
11/45
12. MySQL con pacemaker
• Evaluar uso de
– innodb_support_xa=1
– sync_binlog=1
• Si hay réplicas
– No usar log-slave-updates
– Configurar read-only?
• Al ejecutar failover, que ocurre con:
– Init-connect
– event scheduler
Octubre 2013
12/45
13. ¿Uso simple?
• Versión depende el SO a usar
• Configurar cluster-stack (Heartbeat, Corosync o CMAN)
• Configurar recursos en pacemaker
– afinar parámetros
– quitar inicio automático en SO
• Configurar stonith para producción
• Probar escenarios de fallas
– Bajar recurso en SO
– Bajar recurso en SO y evitar que levante
– Poner nodo en standby (crm node standby/online)
• Implementar monitoreo
Octubre 2013
13/45
14. Instalación
• OpenSUSE 12.3
nodo1:~ # zypper in pacemaker
...
The following NEW packages are going to be installed:
OpenIPMI cluster-glue corosync crmsh libcorosync4 libdlm libdlm3
libglue2 libnet1 libopenais3 libpacemaker3 openais openhpi pacemaker
perl-TimeDate pssh python-curses python-dateutil python-pssh python-six
python-tk resource-agents tk
The following recommended packages were automatically selected:
crmsh libdlm resource-agents
• Tools son paquetes separados sin dependencia
pacemaker-mgmt-client pacemaker-mgmt hawk
Octubre 2013
14/45
15. Configuración cluster-stack
Define servidores que participan, interfaz a usar, timeouts.
• Heartbeat
– /etc/ha.d/ha.cf - http://linux-ha.org/wiki/Ha.cf
• Corosync
– /etc/corosync/corosync.conf
bindnetaddr: 10.10.1.0
← cambiar
– Versiones 1.x (plugin) y 2.x. OpenSUSE usa corosync 1.4
https://en.opensuse.org/openSUSE:High_Availability
– Manual: http://clusterlabs.org/doc/en-US/Pacemaker/1.1plugin/html/Clusters_from_Scratch/s-configure-corosync.html
Octubre 2013
15/45
16. Configuración Pacemaker
•
Ayuda incluida en los comandos de configuración:
crm ra classes
crm ra list ocf heartbeat
crm ra info ocf:heartbeat:IPaddr2
•
Muy buena documentación:
http://www.clusterlabs.org/wiki/Documentation
Secciones a configurar:
• Opciones globales (cluster options)
• Nodos
• Recursos
• Constraints: relaciones entre recursos
– Orden de inicio (order)
Octubre 2013
– Lugar de ejecución (location)
– Dependencias (colocation)
16/45
17. Configuración Pacemaker
No se necesita editar el archivo XML directamente
Utilitarios:
• CLI: crm_attribute, crm_resource, cibadmin
• Shell: crm
– configure edit: modificar la configuración en consola
• crm_gui: paquetes pacemaker-mgmt y pacemaker-mgmt-gui
• pcs: Pacemaker Configuration System
• hawk (web): https://github.com/ClusterLabs/hawk
– Pacemaker >= 1.1.8 --> Hawk 0.6.x
< 1.1.8 --> Hawk 0.5.x
Octubre 2013
17/45
18. Configuración Pacemaker
Algunas cluster options y valores por defecto
– Stonith-enabled
# true
– Stonith-action
# reboot
– no-quorum-policy
# stop
• Cambios en configuración se hacen en un sólo nodo,
internamente sincroniza con el resto.
• Nodo Designated Controller (DC): Elegido al inicio del
cluster. Toma las decisiones. Genera más log.
Octubre 2013
18/45
19. Pacemaker: recursos
Definidos por los atributos:
• clase: ocf / lsb / heartbeat / stonith
LSB: script de inicio cumpliendo Linux Standard Base
OCF: Open Cluster Framework, extensión de LSB
– Instalados en /usr/lib/ocf/resource.d/
• parámetros
• operaciones de monitoreo
• scores: usado en toma de decisiones
- = no usar
+ = usar
INFINITY = constante
• stickiness: cuanto prefiere el recurso quedarse en el nodo, o el
costo de mover el recurso
Octubre 2013
19/45
20. Pacemaker: agente
• Ejecutable que maneja un recurso del cluster.
• Implementado en cualquier lenguaje de programación.
• Debe soportar las siguientes acciones:
start — levanta el recurso
stop — baja el recurso
monitor — consulta el estado del recurso
meta-data — muestra metadatos del recurso en el agente
• Opcionales:
promote, demote,
migrate_to, migrate_from,
validate-all, usage/help, status
Octubre 2013
20/45
21. Pacemaker: agente
• Manual para desarrollar agentes OCF:
– http://www.linux-ha.org/doc/dev-guides/ra-dev-guide.html
• Agente para MySQL: ocf:heartbeat:mysql
– http://www.linux-ha.org/wiki/MySQL_(resource_agent)
– Percona PRM: https://raw.github.com/percona/percona-pacemakeragents/master/agents/mysql_prm
• Más tipos de recursos
– clones
– grupos
– multi-estados
Octubre 2013
21/45
22. Pacemaker: recursos
Ejemplo de configuración para IP Virtual:
$> crm configure primitive vip1 ocf:heartbeat:IPaddr2 params ip=10.10.1.5
cidr_netmask=32 op monitor interval=30s
Octubre 2013
22/45
23. Pacemaker: recursos
Parámetros en configuración Multi-state (master/slave, prim/sec)
clone-max="2"
# Sólo puede estar en dos instancias
clone-node-max="1" # Una instancia por nodo
master-max="1"
# Sólo puede haber un master
master-node-max="1" # Un master por nodo
notify="true"
# notificar start/stop de copias al resto de las copias
Detalles en “Configuration explained: An A-Z guide to
Pacemaker's Configuration Options”
Octubre 2013
23/45
24. Pacemaker: recursos
Ejemplo de configuración para IP Virtual:
$> crm configure primitive vip1 ocf:heartbeat:IPaddr2 params ip=10.10.1.5
cidr_netmask=32 op monitor interval=30s
Configuración para DRBD:
$> crm configure
primitive drbd_disk ocf:linbit:drbd params drbd_resource="disco"
op monitor interval="29s" role="Master"
op monitor interval="31s" role="Slave"
primitive fs_drbd ocf:heartbeat:Filesystem
params device="/dev/drbd0" directory="/varios/01" fstype="ext3"
ms ms_drbd drbd_disk
meta master-max="1" master-node-max="1" clone-max="2"
clone-node-max="1" notify="true"
colocation mnt_on_master inf: fs_drbd ms_drbd:Master
order mount_after_drbd inf: ms_drbd:promote fs_drbd:start
Octubre 2013
24/45
25. Pacemaker: recursos
Ejemplo de configuración MySQL activo/pasivo con DRBD
Se agrega a lo anterior:
$> crm configure
primitive ip_mysql ocf:heartbeat:IPaddr2
params ip="10.10.1.10" nic="eth0"
primitive mysqld lsb:mysqld
group mysql fs_drbd ip_mysql mysqld
colocation mysql_on_drbd inf: mysql ms_drbd:Master
order mysql_after_drbd inf: ms_drbd:promote mysql:start
Octubre 2013
25/45
26. Pacemaker: recursos
Ejemplo de configuración Postgres 9.1 activo/pasivo (1/4)
$> crm configure
property no-quorum-policy="ignore" stonith-enabled="false"
crmd-transition-delay="0s"
rsc_defaults resource-stickiness="INFINITY" migration-threshold="1"
primitive pgsql ocf:heartbeat:pgsql params
pgctl="/usr/pgsql-9.1/bin/pg_ctl" psql="/usr/bin/psql"
pgdata="/data/pg" rep_mode="sync" node_list="db01 db02"
restore_command="cp /data/pg/archive/%f %p"
primary_conninfo_opt="keepalives_idle=60 keepalives_interval=5
keepalives_count=5" master_ip="192.168.2.51" stop_escalate="0"
op start timeout="30s" interval="0s" on-fail="restart"
op stop timeout="30s" interval="0s" on-fail="block"
op monitor timeout="30s" interval="11s" on-fail="restart"
op monitor timeout="30s" interval="10s" on-fail="restart" role="Master"
op promote timeout="30s" interval="0s" on-fail="restart"
op demote timeout="30s" interval="0s" on-fail="block"
op notify timeout="60s" interval="0s"
Octubre 2013
26/45
27. Pacemaker: recursos
Ejemplo de configuración Postgres 9.1 activo/pasivo (2/4)
...
ms msPostgresql pgsql meta master-max="1" master-node-max="1"
clone-max="2" clone-node-max="1" notify="true"
primitive vip-master ocf:heartbeat:IPaddr2
params ip="192.168.2.100" nic="eth0" cidr_netmask="24"
op start
interval="0s" timeout="60s" on-fail="restart"
op monitor interval="10s" timeout="60s" on-fail="restart"
op stop
interval="0s" timeout="60s" on-fail="block"
primitive vip-rep ocf:heartbeat:IPaddr2
params ip="192.168.2.110" nic="eth0" cidr_netmask="24"
meta migration-threshold="0"
op start
interval="0s" timeout="60s" on-fail="stop"
op monitor interval="10s" timeout="60s" on-fail="restart"
op stop
interval="0s" timeout="60s" on-fail="block"
Octubre 2013
27/45
28. Pacemaker: recursos
Ejemplo de configuración Postgres 9.1 activo/pasivo (3/4)
...
primitive vip-slave ocf:heartbeat:IPaddr2 params ip="192.168.2.120"
nic="eth0" cidr_netmask="24" meta resource-stickiness="1"
op start timeout="60s" interval="0s" on-fail="restart"
op monitor timeout="60s" interval="10s" on-fail="restart"
op stop timeout="60s" interval="0s" on-fail="block"
primitive pingCheck ocf:pacemaker:ping
params name="default_ping_set" host_list="192.168.2.100" multiplier="100"
op start interval="0s" timeout="60s" on-fail="restart"
op monitor interval="5s" timeout="60s" on-fail="restart"
op stop interval="0s" timeout="60s" on-fail="ignore"
clone clnPingd pingCheck
group master-group vip-master vip-rep meta ordered="false"
Octubre 2013
28/45
29. Pacemaker: recursos
Ejemplo de configuración Postgres 9.1 activo/pasivo (4/4)
...
location rsc_location-1 msPostgresql
rule -inf: not_defined default_ping_set or default_ping_set lt 100
location rsc_location-2 vip-slave
rule 200: pgsql-status eq "HS:sync"
rule 100: pgsql-status eq "PRI"
rule -inf: not_defined pgsql-status
rule -inf: pgsql-status ne "HS:sync" and pgsql-status ne "PRI"
colocation rsc_colocation-1 inf: msPostgresql
colocation rsc_colocation-2 inf: master-group
clnPingd
msPostgresql:Master
order rsc_order-1 0: clnPingd
msPostgresql
symmetrical=false
order rsc_order-2 inf: msPostgresql:promote master-group:start symmetrical=false
order rsc_order-3 0: msPostgresql:demote master-group:stop symmetrical=false
Octubre 2013
29/45
30. Pacemaker: debug
• Se habilita debug creando el archivo de log:
mkdir -p /tmp/mysql.ocf.ra.debug
touch /tmp/mysql.ocf.ra.debug/log
• Testear los scripts OCF configurando las variables esperadas:
export OCF_ROOT=/usr/lib/ocf
export OCF_RESKEY_binary=/usr/sbin/mysqld
export OCF_RESKEY_config=/etc/my.cnf
export OCF_RESKEY_datadir=/var/lib/mysql
export OCF_RESKEY_log=/var/lib/mysql/nodo1.err
export OCF_RESKEY_pid=/var/lib/mysql/mysql.pid
export OCF_RESKEY_socket=/var/lib/mysq/mysql.sock
export OCF_RESKEY_user=root
/usr/lib/ocf/resource.d/heartbeat/mysql start
Octubre 2013
30/45
31. Pacemaker: fencing
• Dos tipos de Fencing: por recurso o por nodo
• Implementado con:
– un proceso (stonithd)
– plugins para cada dispositivo soportado
• Categorías de dispositivos usados para Stonith:
– UPS (Uninterruptible Power Supply)
– PDU (Power Distribution Unit)
– Blade power control devices
– Lights-out devices: IBM RSA, HP iLO, Dell DRAC
– Testing devices
• Documentación: http://www.clusterlabs.org/doc/crm_fencing.html
Octubre 2013
31/45
33. Pacemaker: fencing
¿Qué parámetros hay que configurar de un dispositivo de Stonith dado?
stonith -t external/xen0 -h
STONITH Device: external/xen0 - ssh-based Linux host reset for Xen DomU trough Dom0
Fine for testing, but not really suitable for production!
For more information see http://openssh.org http://www.xensource.com/ http://linuxha.org/wiki
List of valid parameter names for external/xen0 STONITH device:
hostlist
dom0
For Config info [-p] syntax, give each of the above parameters in order as
the -p value.
Arguments are separated by white space.
Config file [-F] syntax is the same as -p, except # at the start of a line
denotes a comment
Octubre 2013
33/45
35. Pacemaker: monitoreo
• crm status / crm_mon -Arf
-A, --show-node-attributes
-r, --inactive
muestra recursos inactivos
-f, --failcounts
cantidad de fallas de recursos
• OCF ClusterMon notifica cambios de estado
– Snmp / script
– https://github.com/ClusterLabs/pacemaker/blob/master/extra/pcmk_snmp_helper.sh
crm configure primitive monitor ocf:pacemaker:ClusterMon
params user="root" update="30"
extra_options="-E /home/scripts/pcmk_notify.sh
op monitor on-fail="restart" interval="10"
Octubre 2013
35/45
36. Pacemaker: operación
Tareas de mantenimiento
• respaldar configuración de CIB
cibadmin --query > cib-bkp.xml
• restaurar
cibadmin --replace --xml-file < cib-bkp.xml
• agregar nodo al cluster
– instalar pacemaker y corosync
– copiar corosync.conf (cambiar ip local) y authkey
– Levantar corosync, luego pacemaker
– Aumentar parámetro “clone-max” de recursos
Octubre 2013
36/45
37. Pacemaker: operación
Actualizar versión de Pacemaker no siempre es una operación
sin baja total del cluster (rolling), obliga a actualizar todos los
nodos al mismo tiempo. Ej: corosync 0.x a 1.x, 1.x a 2.0
http://clusterlabs.org/doc/en-US/Pacemaker/1.1crmsh/html/Clusters_from_Scratch/_configuring_corosync.html
Pasos para upgrade:
1) validar cambios en la configuración en la nueva versión (CIB)
2) detener monitoreo de recursos (mantenance-mode=true)
3) bajar procesos del cluster (pacemaker + corosync)
4) actualizar software y CIB
5) levantar cluster
6) habilitar/configurar monitoreo de recursos
Octubre 2013
37/45
38. Ejemplos
apache usando dos nodos con DRBD, activo/pasivo y
activo/activo usando GFS2 (en fedora): "clusters from scratch"
Demos:
1) configuración cluster
2) probar failover de VIP
3) Usar HA de MySQL con 2 nodos (DRDB)
En ppt:
4) replicación MySQL
Octubre 2013
38/45
39. Configuración usada
2 VM 1Gb Ram – 20Gb HD
OpenSUSE 12.3 x64
Eth0 – 10.10.1.x - internal network en Vbox
Eth1 – Bridged en Vbox
Host – Mismo SO, VirtualBox 4.2.18-92.1
OpenSUSE incluye en los repositorios factory:
Pacemaker 1.1.7-3
Corosync 1.4.3-4.1.1
Crmsh 1.2.4-3.1.1
Drbd 8.3.11-5.1.1
Dependencias para instalar todo con pacemaker
– Quedan fuera utilitarios (hawk y crm_gui)
39/45
40. 1) configuración cluster
a) configurar visibildad de nodos (/etc/hosts – ssh keys)
b) instalar corosync y pacemaker en dos nodos
c) configurar corosync (/etc/corosync/corosync.conf)
d) configurar parametros globales pacemaker
e) ver agentes disponibles y sus parámetros
Octubre 2013
40/45
41. 2) probar failover de VIP
f) configurar IP virtual
g) probar fallas
Moviendo recursos a mano
Generando fallas en el SO
h) agregar notificación de transiciones y repetir fallas
Octubre 2013
41/45
42. 3) Usar HA de MySQL con 2 nodos (DRDB)
a) instalar DRBD en ambos nodos
b) agregar un disco nuevo (/dev/sdb)
c) configurar drdb (archivo /etc/drbd.conf)
d) crear disco lógico DRBD en los dos nodos (drbdadm)
e) sincronizar nodo2
f) crear filesystem en nodo1 y montarlo en disco DRBD
g) ver los datos en el nodo2
h) configurar HA para DRBD
i) probar HA de DRBD
j) configurar MySQL usando FS en DRBD
j) probar HA de MySQL
Octubre 2013
42/45
43. Réplicas MySQL con PRM
percona-prm:
https://github.com/percona/percona-pacemaker-agents/blob/master/doc/PRM-setupguide.rst
• CIB:
– log file y posición del master
– segundos de atraso de slaves
• Promoción: detener resto de slaves
• Caída del master:
– slaves hacen fencing del master si es necesario
– detienen sus réplicas
– eligen el más actualizado para promover en master
– nodo elegido actualiza CIB con esta info
Octubre – el resto apunta a éste tomando datos actualizados del CIB
2013
43/45