<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>systemadmin.es &#187; Clustering</title>
	<atom:link href="http://systemadmin.es/category/cluster/feed" rel="self" type="application/rss+xml" />
	<link>http://systemadmin.es</link>
	<description>Tu referencia para la administración de sistemas</description>
	<lastBuildDate>Thu, 24 May 2012 07:51:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>HAProxy en modo sticky o en modo roundrobin</title>
		<link>http://systemadmin.es/2011/08/haproxy-en-modo-sticky-o-en-modo-roundrobin</link>
		<comments>http://systemadmin.es/2011/08/haproxy-en-modo-sticky-o-en-modo-roundrobin#comments</comments>
		<pubDate>Wed, 31 Aug 2011 07:27:25 +0000</pubDate>
		<dc:creator>Jordi Prats</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[HAProxy]]></category>

		<guid isPermaLink="false">http://systemadmin.es/?p=3509</guid>
		<description><![CDATA[Anteriormente ya vimos como instalar HAProxy y una configuración básica con conexiones roundrobin. Vamos a ver como configurar el HAProxy en modo sticky. Existen varios algoritmos disponibles en HAProxy para repartir las conexiones entre los diferentes backends, dicho comportamiento se regula mediante balance. El modo más común es roundrobin mediante el cual se reparte, de [...]]]></description>
			<content:encoded><![CDATA[<p>Anteriormente ya vimos <a href="/2010/06/instalar-haproxy-balanceador-http-smtp-tcp">como instalar HAProxy</a> y una configuración básica con conexiones <strong>roundrobin</strong>. Vamos a ver como configurar el HAProxy en modo <strong>sticky</strong>.</p>
<p><!-- more --></p>
<p>Existen varios algoritmos disponibles en <strong>HAProxy</strong> para repartir las conexiones entre los diferentes backends, dicho comportamiento se regula mediante <strong>balance</strong>.</p>
<p>El modo más común es <strong>roundrobin</strong> mediante el cual se reparte, de acuerdo <a href="/2009/01/balanceador-de-carga-con-haproxy">con los pesos asignados</a> las conexiones según van entrando. Este modo tiene el inconveniente que los servidores deben ser <strong>sin estado</strong> (<strong>stateless</strong>) o bien disponer de un <strong>sistema para mantenerlo coherente entre los servidores backend</strong>.</p>
<pre>
listen smtpd 0.0.0.0:25
        mode tcp
        <strong>balance roundrobin</strong>
        server qmailfront1 127.0.0.1:2525 check weight 10
        server qmailback1 192.168.10.33:25 check weight 60
        server qmailback2 192.168.10.34:25 check weight 30
</pre>
<p>Por el contrario, en el modo conocido como <strong>sticky</strong>, el balanceador reparte las conexiones entre todos los backends, también de acuerdo con los pesos asignados, pero siempre asignando el mismo backend para un determinado cliente. De esta forma los backends pueden ser con estado (<strong>statefull</strong>) sin ningún sistema para mantener la coherencia. El gran inconveniente es que desaparece el <strong>failover automático</strong> ya que si un backend tiene un problema desparecen los datos de las sesiones con él. Para modificar el comportamiento del balanceador a este modo deberemos cambiar el algoritmo a &#8220;<strong>source</strong>&#8220;: Balancear según el origen.</p>
<pre>
listen smtpd 0.0.0.0:25
        mode tcp
        <strong>balance source</strong>
        server qmailfront1 127.0.0.1:2525 check weight 10
        server qmailback1 192.168.10.33:25 check weight 60
        server qmailback2 192.168.10.34:25 check weight 30
</pre>

	Tags: <a href="http://systemadmin.es/tag/haproxy" title="HAProxy" rel="tag">HAProxy</a><br />

	<h4 style="margin-top: 50px">Relacionados</h4>
	<ul class="st-related-posts">
	<li><a href="http://systemadmin.es/2010/06/instalar-haproxy-balanceador-http-smtp-tcp" onclick="pageTracker._trackEvent('relacionados','2675');" title="Instalar HAProxy (balanceador HTTP SMTP TCP) (25/June/2010)">Instalar HAProxy (balanceador HTTP SMTP TCP)</a></li>
	<li><a href="http://systemadmin.es/2011/11/estado-de-haproxy-desde-socket" onclick="pageTracker._trackEvent('relacionados','3671');" title="Estado de HAProxy desde socket (29/November/2011)">Estado de HAProxy desde socket</a></li>
	<li><a href="http://systemadmin.es/2009/01/balanceador-de-carga-con-haproxy" onclick="pageTracker._trackEvent('relacionados','1337');" title="Balanceador de carga con HAProxy (28/January/2009)">Balanceador de carga con HAProxy</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://systemadmin.es/2011/08/haproxy-en-modo-sticky-o-en-modo-roundrobin/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cluster con DRBD y heartbeat 2 / pacemaker</title>
		<link>http://systemadmin.es/2011/04/cluster-con-drbd-y-heartbeat-2-pacemaker</link>
		<comments>http://systemadmin.es/2011/04/cluster-con-drbd-y-heartbeat-2-pacemaker#comments</comments>
		<pubDate>Tue, 19 Apr 2011 06:30:39 +0000</pubDate>
		<dc:creator>Jordi Prats</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Alta disponibilidad]]></category>
		<category><![CDATA[DRBD]]></category>
		<category><![CDATA[heartbeat]]></category>
		<category><![CDATA[pacemaker]]></category>
		<category><![CDATA[Sphinx]]></category>

		<guid isPermaLink="false">http://systemadmin.es/?p=3291</guid>
		<description><![CDATA[Siguiendo con la instalación y configuración de heartbeat 2 vamos a ver como instalar un servicio con datos en disco con DRBD. Gracias a DRBD podemos simular un disco compartido entre dos equipos mediante un disco local en cada uno de ellos y DRBD sincronizando los datos por red. Vamos a ver un ejemplo de [...]]]></description>
			<content:encoded><![CDATA[<p>Siguiendo con la <a href="/2011/03/instalacion-y-configuracion-de-heartbeat-2">instalación y configuración de heartbeat 2</a> vamos a ver como instalar un servicio con datos en <strong>disco con DRBD</strong>.</p>
<p>Gracias a <strong>DRBD</strong> podemos <strong>simular un disco compartido</strong> entre dos equipos mediante <strong>un disco local en cada uno de ellos</strong> y <strong>DRBD sincronizando los datos por red</strong>. Vamos a ver un ejemplo de uso de <strong>DRBD</strong> con <strong>sphinx</strong> con alta disponibilidad con <strong>pacemaker/heartbeat2</strong>. </p>
<p><!-- more --></p>
<p>Suponiendo que ya tenemos <a href="/2011/03/instalacion-y-configuracion-de-heartbeat-2">instalado heartbeat</a> procedemos a <strong>instalar DRBD</strong> en todos los nodos:</p>
<pre>
yum install drbd83 kmod-drbd83 -y
modprobe drbd
</pre>
<p>Empezamos a partir de la configuración de ejemplo que viene con el <strong>paquete drbd83</strong>:</p>
<pre>
'cp' /usr/share/doc/drbd*/drbd.conf /etc/drbd.conf
sed 's/\(syncer.*$\)/\1\n\t\trate 40M;/g' -i /etc/drbd.d/global_common.conf
</pre>
<p>Y definimos nuestro primer <strong>recurso DRBD</strong>, por ejemplo un disco para el daemon <strong>sphinx</strong> (por ejemplo). En dicho fichero deberemos indicar los <strong>hosts que pertenecen al cluster</strong> y <strong>que disco local usar</strong> (que deberá ser del mismo tamaño). En dicho disco se van a almacenar los datos y se sincronizaran por red con el resto de discos que definamos. El fichero a generar debe estar entro de <strong>/etc/drbd.d/</strong> con la extensión <strong>.res</strong>, por ejemplo, <strong>/etc/drbd.d/shpinx.res</strong></p>
<pre>
resource sphinx
{
  device    /dev/drbd0;
  meta-disk internal;

  protocol  C;

  on host1
  {
    address   172.16.0.10:7789;
    disk      /dev/sdb;
  }
  on host2
  {
    address   172.16.0.11:7789;
    disk      /dev/sdb;
  }
}
</pre>
<p>Ahora en uno de los nodos inicializamos los metadatos del disco:</p>
<pre>
# drbdadm create-md sphinx

  --==  Thank you for participating in the global usage survey  ==--
The server's response is:

you are the 7979th user to install this version
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success
</pre>
<p>En el caso que ya tengamos datos en el disco nos avisará de ello y nos pedirá confirmación para modificar el sistema de ficheros:</p>
<pre>
# drbdadm create-md sphinx

  --==  Thank you for participating in the global usage survey  ==--
The server's response is:

you are the 8805th user to install this version
md_offset 32212250624
al_offset 32212217856
bm_offset 32211234816

Found ext3 filesystem
    10485760 kB data area apparently used
    31456284 kB left usable by current configuration

Even though it looks like this would place the new meta data into
unused space, you still need to confirm, as this is only a guess.

Do you want to proceed?
[need to type 'yes' to confirm] yes

Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success
</pre>
<p>Levantamos el <strong>recursos DRBD</strong>:</p>
<pre>
drbdadm up sphinx
</pre>
<p>A continuación en <strong>/proc/drbd</strong> podremos ver como se ha levantado el <strong>recurso DRBD</strong>:</p>
<pre>
[root@host1 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:16
 0: cs:WFConnection ro:Secondary/Unknown ds:Inconsistent/DUnknown C r----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:102360
</pre>
<p>Apreciamos como nos indica que esta en un <strong>estado inconsistente</strong>, ya que los discos aún no se han sincronizado. A continuación, si tenemos datos en uno de los discos, debemos ejecutar en el nodo que tenga los datos lo siguiente:</p>
<pre>
drbdadm -- --overwrite-data-of-peer primary sphinx
</pre>
<p>De esta forma se copiaran los bloques del disco del equipo dónde lo ejecutemos al disco del equipo secundario (más adelante se va a <strong>sobrescribir ese disco</strong>)</p>
<p>En el caso que en <strong>ninguno de los discos de los dos equipos tengamos datos</strong> podemos simplemente marcar los discos como iguales con:</p>
<pre>
drbdadm -- --clear-bitmap new-current-uuid r0
</pre>
<p>De esta forma nos ahorramos traspasar unos bloques que realmente no contienen nada y a medida que se modifiquen se irán sincronizando realmente.</p>
<p>En el <strong>/proc/drbd</strong> veremos como cambia de <strong>Inconsistent</strong> a <strong>UpToDate</strong>:</p>
<pre>
[root@host1 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:16
 0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:102360
</pre>
<p>Ahora en el nodo <strong>secundario</strong> procedemos a levantar también el <strong>recurso DRBD</strong>, procediendo a la sincronización de los datos con el nodo principal:</p>
<pre>
drbdadm create-md sphinx
drbdadm up sphinx
</pre>
<p>En el <strong>/proc/drbd</strong> veremos el progreso de sincronización:</p>
<pre>
[root@host2 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:09
 0: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r----
    ns:0 nr:3262752 dw:3262720 dr:0 al:0 bm:199 lo:2 pe:16674 ua:1 ap:0 ep:1 wo:b oos:28193564
	[=>..................] sync'ed: 10.4% (27532/30716)M queue_delay: 18.5 ms
	finish: 0:37:02 speed: 12,660 (5,456) want: 40,960 K/sec
</pre>
<p>Cuando acabe veremos como pasa de <strong>Inconsistent/UpToDate</strong> a <strong>UpToDate/UpToDate</strong>:</p>
<pre>
[root@host2 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:16
 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----
    ns:0 nr:102360 dw:102360 dr:0 al:0 bm:7 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
</pre>
<p>A continuación deberemos <strong>añdir el recurso DRBD al cluster</strong> mediante <strong>ocf:linbit:drbd</strong>:</p>
<pre>
# crm ra info ocf:linbit:drbd
This resource agent manages a DRBD resource
as a master/slave resource. DRBD is a shared-nothing replicated storage
device. (ocf:linbit:drbd)

Master/Slave OCF Resource Agent for DRBD

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

drbd_resource* (string): drbd resource name
    The name of the drbd resource from the drbd.conf file.

drbdconf (string, [/etc/drbd.conf]): Path to drbd.conf
    Full path to the drbd.conf file.

Operations' defaults (advisory minimum):

    start         timeout=240
    promote       timeout=90
    demote        timeout=90
    notify        timeout=90
    stop          timeout=100
    monitor_Slave_0 interval=20 timeout=20 start-delay=1m
    monitor_Master_0 interval=10 timeout=20 start-delay=1m
</pre>
<p>Para a versión <strong>1.0.10-da7075976b5ff0bee71074385f8fd02f296ec8a3</strong> dicho script (<strong>/usr/lib/ocf/resource.d/linbit/drbd</strong>) da muchos problemas, por lo que deberemos substituirlo por el disponible en el <strong>git</strong>. Debremos ejecutar lo siguiente en los dos nodos:</p>
<pre>
wget 'http://git.drbd.org/?p=drbd-8.3.git;a=blob_plain;f=scripts/drbd.ocf' -O /usr/lib/ocf/resource.d/linbit/drbd
</pre>
<p>A continuación añadimos el <strong>recurso DRBD</strong>:</p>
<pre>
crm configure primitive drbdsphinx ocf:linbit:drbd params drbd_resource="sphinx"
</pre>
<p>A continuación deberemos indicar las <strong>limitaciones de DRBD</strong>:</p>
<ul>
<li><strong>clone-max=&#8221;2&#8243;</strong>: Sólo puede estar en dos instancias</li>
<li><strong>clone-node-max=&#8221;1&#8243;</strong>: Una instancia por nodo</li>
<li><strong>master-max=&#8221;1&#8243;</strong>: Máximo 1 solo master</li>
<li><strong>master-node-max=&#8221;1&#8243;</strong>: Máximo 1 master por nodo</li>
<li><strong>notify=&#8221;true&#8221;</strong>: Se debe notificar al recurso que ocurre al peer</li>
</ul>
<p>Quedando el comando:</p>
<pre>
crm configure ms ms_drbdsphinx drbdsphinx \
    meta master-max="1" master-node-max="1" clone-max="2" \
    clone-node-max="1" notify="true"
</pre>
<p>A continuación <strong>limpiamos los mensajes de error</strong> que se hayan generado mientras el DRBD no pertenecía a un <strong>set master/slave</strong> con:</p>
<pre>
crm resource cleanup drbdsphinx
</pre>
<p>Podemos comprobar la <strong>alta disponibilidad del recurso DRBD</strong> con el <strong>/proc/drbd</strong>. Nos dirigimos al <strong>nodo actualmente secundario</strong> y hacemos un <strong>cat</strong>. Veremos lo siguiente:</p>
<pre>
[root@host2 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:16
 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
</pre>
<p>Si <strong>apagamos el heartbeat del nodo primario</strong> veremos como el secundario pasa a ser el <strong>master</strong>:</p>
<pre>
[root@host2 ~]# crm status
============
Last updated: Fri Mar 18 14:45:36 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
3 Resources configured.
============

Online: [ host2 ]
OFFLINE: [ host1 ]

 Master/Slave Set: ms_drbdsphinx
     Masters: [ host2 ]
     Stopped: [ drbdsphinx:1 ]
</pre>
<p>En el fichero <strong>/proc/drbd</strong> del secundario apreciamos como cambia de <strong>Secondary/Primary</strong> a <strong>Primary/Unknown</strong>:</p>
<pre>
[root@host2 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:16
 0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
</pre>
<p>Al volver a arrancar el <strong>heartbeat</strong> en el nodo primario vemos como <strong>se mantiene en el nodo secundario</strong>:</p>
<pre>
[root@host1 ~]# crm status
============
Last updated: Fri Mar 18 15:06:49 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
3 Resources configured.
============

Online: [ host1 host2 ]

 Master/Slave Set: ms_drbdsphinx
     Masters: [ host2 ]
     Slaves: [ host1 ]
</pre>
<p>A continuación, en el caso que el disco aún no contenga datos deberemos crear el sistema de ficheros desde el nodo que sea el master:</p>
<pre>
# mkfs.ext3 /dev/drbd/by-res/sphinx
</pre>
<p>En los dos nodos deberemos crear el punto de montaje:</p>
<pre>
mkdir -p /var/sphinx
</pre>
<p>A continuación deberemos indicar al cluster que debe gestionar el montaje y desmontaje del sistema de ficheros mediante <strong>heartbeat:Filesystem</strong>:</p>
<pre>
# crm ra info heartbeat:Filesystem
heartbeat:Filesystem

Filesystem

Operations' defaults (advisory minimum):

    start         timeout=15
    stop          timeout=15
    status        timeout=15
    monitor_0     interval=15 timeout=15 start-delay=15
</pre>
<p>Vemos que el <strong>crm ra info</strong> no aporta la información necesaria, por lo que, en algunos casos, buscando con <strong>grep</strong> en el script (<strong>/usr/lib/ocf/resource.d/heartbeat/Filesystem</strong>) comentarios que contengan <strong>OCF_RESKEY</strong> podemos obtener la información necesaria para usarlo:</p>
<pre>
# grep -e "#\s*OCF_RESKEY" /usr/lib/ocf/resource.d/heartbeat/Filesystem
#		OCF_RESKEY_device
#		OCF_RESKEY_directory
#		OCF_RESKEY_fstype
#		OCF_RESKEY_options
#		OCF_RESKEY_statusfile_prefix
#OCF_RESKEY_device    : name of block device for the filesystem. e.g. /dev/sda1, /dev/md0
#OCF_RESKEY_directory : the mount point for the filesystem
#OCF_RESKEY_fstype    : optional name of the filesystem type. e.g. ext2
#OCF_RESKEY_options   : options to be given to the mount command via -o
#OCF_RESKEY_statusfile_prefix : the prefix used for a status file for monitoring
</pre>
<p>Con estas opciones añadimos el <strong>recurso</strong> para que <strong>monte el sistema de ficheros</strong>:</p>
<pre>
crm configure primitive fssphinx ocf:heartbeat:Filesystem \
    params device="/dev/drbd/by-res/sphinx" directory="/var/sphinx/" \
    fstype="ext3"
</pre>
<p>Comprobamos que se ha añadido con <strong>crm status</strong>:</p>
<pre>
# crm status
============
Last updated: Fri Mar 18 15:35:31 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 ]

 Master/Slave Set: ms_drbdsphinx
     Masters: [ host2 ]
     Slaves: [ host1 ]
 fssphinx	(ocf::heartbeat:Filesystem):	Started host2
</pre>
<p>En este caso se ha levantado bien, pero podría haber generado algún error si se hubiera levantado en el otro nodo. Por lo tanto, debemos indicar explicitamente que siempre debe <strong>montar el sistema de ficheros después del master/slave set de DRBD</strong>:</p>
<pre>
crm configure order drbd-fs mandatory: ms_drbdsphinx:promote fssphinx:start
</pre>
<p>Además, siempre debe estar en el mismo nodo el <strong>montaje del sistema de ficheros</strong> y el <strong>master del recurso DRBD</strong>:</p>
<pre>
crm configure colocation fssphinx-drbdsphinx \
    INFINITY: fssphinx ms_drbdsphinx:Master
</pre>
<p>A continuación limpiamos los errores del recurso que monta el sistema de ficheros por si se ha producido algún error anteriormente:</p>
<pre>
crm resource cleanup fssphinx
</pre>
<p>A continuación podemos <a href="/2009/08/instalacion-de-un-servidor-lamp-iv-sphinx">instalar en todos los nodos el daemon que sea, en este caso, un sphinx</a> y proceder a añadirlo al cluster. Primero de todo deberemos <strong>añadir la IP</strong> que usaremos para el daemon mediante <strong>ocf:heartbeat:IPaddr2</strong>:</p>
<pre>
crm configure primitive sphinxip1 ocf:heartbeat:IPaddr2 \
    params ip=172.16.2.101 cidr_netmask=32 op monitor interval=30s
</pre>
<p>Deberemos añadir continuación las reglas para que esten la IP y el fs en el mismo nodo:</p>
<pre>
crm configure colocation sphinxip_fssphinx INFINITY: sphinxip1 fssphinx
</pre>
<p>Y de orden:</p>
<pre>
crm configure order ip-fs-sphinx mandatory: fssphinx sphinxip1
</pre>
<p>Para añadir el <strong>sphinx</strong> podemos usar <strong>ocf::heartbeat:SphinxSearchDaemon</strong>:</p>
<pre>
# crm ra info ocf:heartbeat:SphinxSearchDaemon
Manages the Sphinx search daemon. (ocf:heartbeat:SphinxSearchDaemon)

This is a searchd Resource Agent. It manages the Sphinx Search Daemon.

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

config (string, [/etc/sphinx/sphinx.conf]): Configuration file
    searchd configuration file

searchd (string, [/usr/local/bin/searchd]):
    searchd binary

search (string, [/usr/local/bin/search]): search binary
    Search binary for functional testing in the monitor action.

testQuery (string, [Heartbeat_Monitor_Query_Match_string]): test query
    Test query for functional testing in the monitor action.
    The query does not need to match any documents in the index.
    The purpose is merely to test whether the search daemon is
    is able to query its indices and respond properly.

Operations' defaults (advisory minimum):

    start         timeout=20s
    stop          timeout=20s
    monitor_0     interval=10 timeout=20
</pre>
<p>Con lo que suponiendo el <strong>sphinx</strong> instalado dentro de <strong>/usr/local/sphinx</strong> y con el fichero de configuración en <strong>/var/hasphinx/conf/sphinx.conf</strong> quedaría:</p>
<pre>
crm configure primitive sphinx ocf:heartbeat:SphinxSearchDaemon \
    params config="/var/hasphinx/conf/sphinx.conf" \
    searchd="/usr/local/sphinx/bin/searchd" \
    search="/usr/local/sphinx/bin/search" \
    op start timeout="30s" \
    op stop timeout="30s" \
    op monitor interval="20" timeout="30s"
</pre>
<p>Finalmente deberemos configurar también que <strong>IP y daemon estén en el mismo nodo</strong>:</p>
<pre>
crm configure colocation sphinxip-sphinx INFINITY: sphinxip1 sphinx
</pre>
<p>Y el <strong>orden</strong>:</p>
<pre>
crm configure order sphinxip1-sphinx mandatory: sphinxip1 sphinx
</pre>
<p>Mediante <strong>crm status</strong> podemos apreciar como ha quedado:</p>
<pre>
# crm status
============
Last updated: Mon Apr 18 15:33:23 2011
Stack: Heartbeat
Current DC: host2 (37ebb34b-8d67-4f2f-b971-5b572a90f916) - partition with quorum
Version: 1.0.10-da7075976b5ff0bee71074385f8fd02f296ec8a3
2 Nodes configured, 2 expected votes
4 Resources configured.
============

Online: [ host1 host2 ]

 Master/Slave Set: ms_drbdsphinx
     Masters: [ host2 ]
     Slaves: [ host1 ]
 fssphinx	(ocf::heartbeat:Filesystem):	Started host2
 sphinxip1	(ocf::heartbeat:IPaddr2):	Started host2
 sphinx	(ocf::heartbeat:SphinxSearchDaemon):	Started host2
</pre>

	Tags: <a href="http://systemadmin.es/tag/altadisponibilidad" title="Alta disponibilidad" rel="tag">Alta disponibilidad</a>, <a href="http://systemadmin.es/tag/drbd" title="DRBD" rel="tag">DRBD</a>, <a href="http://systemadmin.es/tag/heartbeat" title="heartbeat" rel="tag">heartbeat</a>, <a href="http://systemadmin.es/tag/pacemaker" title="pacemaker" rel="tag">pacemaker</a>, <a href="http://systemadmin.es/tag/sphinx" title="Sphinx" rel="tag">Sphinx</a><br />

	<h4 style="margin-top: 50px">Relacionados</h4>
	<ul class="st-related-posts">
	<li><a href="http://systemadmin.es/2009/12/warning-duplicate-document-ids-found-identificadores-de-32-o-64-bits-en-sphinx" onclick="pageTracker._trackEvent('relacionados','2132');" title="WARNING: duplicate document ids found &#8211; Identificadores de 32 o 64 bits en Sphinx (11/December/2009)">WARNING: duplicate document ids found &#8211; Identificadores de 32 o 64 bits en Sphinx</a></li>
	<li><a href="http://systemadmin.es/2010/02/statement-is-not-safe-to-log-in-statement-format" onclick="pageTracker._trackEvent('relacionados','2313');" title="Statement is not safe to log in statement format (25/February/2010)">Statement is not safe to log in statement format</a></li>
	<li><a href="http://systemadmin.es/2009/06/ssh-con-daemontools" onclick="pageTracker._trackEvent('relacionados','1758');" title="ssh con daemontools (15/June/2009)">ssh con daemontools</a></li>
	<li><a href="http://systemadmin.es/2010/05/replicacion-en-memcached" onclick="pageTracker._trackEvent('relacionados','2578');" title="Replicación en memcached (6/May/2010)">Replicación en memcached</a></li>
	<li><a href="http://systemadmin.es/2008/12/reinicio-automatico-de-memcached-en-la-version-de-facebook" onclick="pageTracker._trackEvent('relacionados','891');" title="Reinicio automático de memcached en la versión de Facebook (14/December/2008)">Reinicio automático de memcached en la versión de Facebook</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://systemadmin.es/2011/04/cluster-con-drbd-y-heartbeat-2-pacemaker/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Error: Missing Dependency: libesmtp is needed by package pacemaker</title>
		<link>http://systemadmin.es/2011/04/error-missing-dependency-libesmtp-is-needed-by-package-pacemaker</link>
		<comments>http://systemadmin.es/2011/04/error-missing-dependency-libesmtp-is-needed-by-package-pacemaker#comments</comments>
		<pubDate>Thu, 14 Apr 2011 06:01:58 +0000</pubDate>
		<dc:creator>Jordi Prats</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[heartbeat]]></category>
		<category><![CDATA[pacemaker]]></category>
		<category><![CDATA[RHEL]]></category>

		<guid isPermaLink="false">http://systemadmin.es/?p=3365</guid>
		<description><![CDATA[Al instalar un cluster con heartbeat 2 nos podemos encontrar con el siguiente error: Error: Missing Dependency: libesmtp is needed by package pacemaker Este error afecta al paquete pacemaker y no lo podremos instalar mediante yum: # yum install -y pacemaker Loaded plugins: fastestmirror, security Loading mirror speeds from cached hostfile * base: ftp.udl.es * [...]]]></description>
			<content:encoded><![CDATA[<p>Al <a href="/2011/03/instalacion-y-configuracion-de-heartbeat-2">instalar un cluster con heartbeat 2</a> nos podemos encontrar con el siguiente error:</p>
<pre>
Error: Missing Dependency: libesmtp is needed by package pacemaker
</pre>
<p><!-- more --></p>
<p>Este error afecta al paquete <strong>pacemaker</strong> y no lo podremos instalar mediante <strong>yum</strong>:</p>
<pre>
# yum install -y pacemaker
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
 * base: ftp.udl.es
 * extras: ftp.udl.es
 * updates: ftp.udl.es
Excluding Packages in global exclude list
Finished
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package pacemaker.x86_64 0:1.0.10-1.4.el5 set to be updated
--> Processing Dependency: pacemaker-libs = 1.0.10-1.4.el5 for package: pacemaker
--> Processing Dependency: libesmtp for package: pacemaker
--> Processing Dependency: libpe_status.so.2()(64bit) for package: pacemaker
--> Processing Dependency: libcib.so.1()(64bit) for package: pacemaker
--> Processing Dependency: libtransitioner.so.1()(64bit) for package: pacemaker
--> Processing Dependency: libpe_rules.so.2()(64bit) for package: pacemaker
--> Processing Dependency: libcrmcommon.so.2()(64bit) for package: pacemaker
--> Processing Dependency: libcrmcluster.so.1()(64bit) for package: pacemaker
--> Processing Dependency: libstonithd.so.0()(64bit) for package: pacemaker
--> Processing Dependency: libpengine.so.3()(64bit) for package: pacemaker
--> Processing Dependency: libesmtp.so.5()(64bit) for package: pacemaker
--> Running transaction check
---> Package pacemaker.x86_64 0:1.0.10-1.4.el5 set to be updated
--> Processing Dependency: libesmtp for package: pacemaker
--> Processing Dependency: libesmtp.so.5()(64bit) for package: pacemaker
---> Package pacemaker-libs.x86_64 0:1.0.10-1.4.el5 set to be updated
--> Finished Dependency Resolution
pacemaker-1.0.10-1.4.el5.x86_64 from clusterlabs has depsolving problems
  --> Missing Dependency: libesmtp is needed by package pacemaker-1.0.10-1.4.el5.x86_64 (clusterlabs)
pacemaker-1.0.10-1.4.el5.x86_64 from clusterlabs has depsolving problems
  --> Missing Dependency: libesmtp.so.5()(64bit) is needed by package pacemaker-1.0.10-1.4.el5.x86_64 (clusterlabs)
Error: Missing Dependency: libesmtp is needed by package pacemaker-1.0.10-1.4.el5.x86_64 (clusterlabs)
Error: Missing Dependency: libesmtp.so.5()(64bit) is needed by package pacemaker-1.0.10-1.4.el5.x86_64 (clusterlabs)
 You could try using --skip-broken to work around the problem
 You could try running: package-cleanup --problems
                        package-cleanup --dupes
                        rpm -Va --nofiles --nodigest
</pre>
<p>La explicación de este error es que el paquete libesmtp no se encuentra en el repositorio de <strong>CentOS</strong> o de <strong>RHEL</strong> sino que se encuentra en el <a href="/2009/02/el-repositorio-epel-extra-packages-for-enterprise-linux">EPEL</a>. Por lo tanto <strong>pacemaker depende de EPEL</strong> para poder ser instalado. Simplemente deberemos instalar <strong>EPEL</strong> en la versión que nos interese, por ejemplo para <strong>RHEL/CentOS 5</strong>:</p>
<pre>
# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
</pre>
<p>A continuación repitiendo el yum install veremos como se instala correctamente:</p>
<pre>
# yum install pacemaker -y
(...)
Installed:
  pacemaker.x86_64 0:1.0.10-1.4.el5                                                                                                                                                                           

Dependency Installed:
  libesmtp.x86_64 0:1.0.4-5.el5                                                                     pacemaker-libs.x86_64 0:1.0.10-1.4.el5                                                                    

Complete!
</pre>

	Tags: <a href="http://systemadmin.es/tag/centos" title="CentOS" rel="tag">CentOS</a>, <a href="http://systemadmin.es/tag/heartbeat" title="heartbeat" rel="tag">heartbeat</a>, <a href="http://systemadmin.es/tag/pacemaker" title="pacemaker" rel="tag">pacemaker</a>, <a href="http://systemadmin.es/tag/rhel" title="RHEL" rel="tag">RHEL</a><br />

	<h4 style="margin-top: 50px">Relacionados</h4>
	<ul class="st-related-posts">
	<li><a href="http://systemadmin.es/2010/04/ya-esta-disponible-rhel-6-beta-para-su-instalacion" onclick="pageTracker._trackEvent('relacionados','2504');" title="Ya esta disponible RHEL 6 beta para su instalación (23/April/2010)">Ya esta disponible RHEL 6 beta para su instalación</a></li>
	<li><a href="http://systemadmin.es/2008/12/runlevels-en-derivados-de-redhat-fedora-centos-rhel-y-suse" onclick="pageTracker._trackEvent('relacionados','899');" title="runlevels en derivados de RedHat (Fedora, CentOS, RHEL) y SuSE (20/December/2008)">runlevels en derivados de RedHat (Fedora, CentOS, RHEL) y SuSE</a></li>
	<li><a href="http://systemadmin.es/2009/11/rpm-file-homejordiejemplorpm-is-not-owned-by-any-package" onclick="pageTracker._trackEvent('relacionados','2028');" title="rpm: file /home/jordi/ejemplo.rpm is not owned by any package (9/November/2009)">rpm: file /home/jordi/ejemplo.rpm is not owned by any package</a></li>
	<li><a href="http://systemadmin.es/2011/03/resize2fs-inappropriate-ioctl-for-device-while-trying-to-add-group-8321" onclick="pageTracker._trackEvent('relacionados','3315');" title="resize2fs: Inappropriate ioctl for device While trying to add group #8321 (31/March/2011)">resize2fs: Inappropriate ioctl for device While trying to add group #8321</a></li>
	<li><a href="http://systemadmin.es/2010/09/resize2fs-filesystem-has-unsupported-features-while-trying-to-open-devlocalhome" onclick="pageTracker._trackEvent('relacionados','2876');" title="resize2fs: Filesystem has unsupported feature(s) while trying to open /dev/local/home (10/September/2010)">resize2fs: Filesystem has unsupported feature(s) while trying to open /dev/local/home</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://systemadmin.es/2011/04/error-missing-dependency-libesmtp-is-needed-by-package-pacemaker/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalación y configuración de un cluster con heartbeat 2 y pacemaker</title>
		<link>http://systemadmin.es/2011/03/instalacion-y-configuracion-de-heartbeat-2</link>
		<comments>http://systemadmin.es/2011/03/instalacion-y-configuracion-de-heartbeat-2#comments</comments>
		<pubDate>Mon, 21 Mar 2011 07:20:53 +0000</pubDate>
		<dc:creator>Jordi Prats</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Alta disponibilidad]]></category>
		<category><![CDATA[heartbeat]]></category>
		<category><![CDATA[pacemaker]]></category>

		<guid isPermaLink="false">http://systemadmin.es/?p=3289</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>La <strong>versión 2 de heartbeat</strong> ha cambiado bastante respecto la <strong>versión 1</strong>. Vamos a ver como <strong>instalar heartbeat</strong> y <strong>como configurar un servicio con pacemaker</strong> con una <strong>VIP asociada</strong>.</p>
<p><!-- more --></p>
<p>Para esta configuración vamos a suponer <strong>dos hosts</strong>:</p>
<ul>
<li>host1</li>
<li>host2</li>
</ul>
<p>Empezaremos instalando el <strong>repositorio de clusterlabs</strong> e instalando todos los paquetes necesarios en ambos nodos (<a href="/2011/04/error-missing-dependency-libesmtp-is-needed-by-package-pacemaker">deberemos tener instalado previamente el respositorio EPEL</a>):</p>
<pre>
wget -O /etc/yum.repos.d/pacemaker.repo http://clusterlabs.org/rpm/epel-5/clusterlabs.repo
yum install heartbeat cluster-glue resource-agents pacemaker -y
</pre>
<p>A continuación deberemos modificar el fichero <strong>/etc/hosts</strong>, añadiendo los dos nodos del cluster:</p>
<pre>
172.16.2.10	host1
172.16.2.11	host2
</pre>
<p>A continuación, en uno de los dos nodos generamos el fichero <strong>/etc/ha.d/ha.cf</strong> con lo siguiente:</p>
<pre>
autojoin none
bcast eth0

warntime 5
deadtime 15
initdead 60
keepalive 2

node host1
node host2

pacemaker respawn
</pre>
<p>Los parámetros son los siguientes:</p>
<ul>
<li><strong>autojoin</strong>: Indicamos que no queremos que haga <strong>autojoin</strong>, indicamos estáticamente los nodos del cluster en la configuración mediante <strong>node</strong></li>
<li><strong>bcast</strong>: Mediante <strong>bcast</strong> indicamos por que interfaz y mediante <strong>broadcast</strong> se pasaran mensajes entre los nodos del cluster. Podemos hacerlo también por <strong>multicast</strong> (<strong>mcast</strong>) pero si tenemos una VLAN para el cluster y no hay más de un cluster en la VLAN podemos dejarlo con <strong>broadcast</strong>.</li>
<li>Mediante <strong>warntime</strong>, <strong>deadtime</strong>, <strong>initdead</strong>, <strong>keepalive</strong> indicamos diferentes valores globales de timeouts.</li>
<li><strong>pacemaker respawn</strong>: En caso que el pacemaker se muera por algun motivo, se vuelve a iniciar.</li>
</ul>
<p>A continuación deberemos generar el <strong>fichero de autenticación mediante pwgen</strong>:</p>
<pre>
yum install pwgen -y
</pre>
<p>En uno de los nodos generamos el fichero con lo siguiente:</p>
<pre>
cat &lt;&lt;EOF &gt;/etc/ha.d//authkeys
auth 1
1 sha1 $(pwgen 30 | openssl sha1)
EOF
chmod 600 /etc/ha.d/authkeys
</pre>
<p>A continuación deberemos propagar los ficheros mediante <strong>ha_propagate</strong>:</p>
<pre>
# /usr/share/heartbeat/ha_propagate
</pre>
<p>A continuación levantaremos el daemon en todos los nodos:</p>
<pre>
/etc/init.d/heartbeat start
</pre>
<p>Podemos ver con ps que lo tenemos levantado:</p>
<pre>
# 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
</pre>
<p>Mediante <strong>crm status</strong> podemos ver el estado del cluster:</p>
<pre>
# 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 ]
</pre>
<p>A continuación verificamos la configuración:</p>
<pre>
# 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
</pre>
<p><strong>STONITH</strong> (<strong>cluster-glue</strong>) 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:</p>
<pre>
crm configure property stonith-enabled=false
</pre>
<p>También deberemos definir el número de votos con los que indicamos que el cluster tiene <strong>quorum</strong>:</p>
<pre>
2 Nodes configured, unknown expected votes
</pre>
<p>En el caso de dos nodos, tiene poco sentido, por lo que se lo dejaremos en <strong>2</strong>:</p>
<pre>
crm configure property expected-quorum-votes="2"
</pre>
<p>Indicaremos a continuación que siga funcionando el cluster en caso que <strong>no tenga quorum</strong> (uno de los dos nodos desaparezca). En caso que no lo hiciéramos, si uno de los nodos lo apagáramos, el otro <strong>apagaría todos los servicios al perder quorum</strong>:</p>
<pre>
crm configure property no-quorum-policy=ignore
</pre>
<p>Para evitar que los servicios hagan <strong>fail-back</strong> (vuelvan al otro nodo cuando se recupere de un fallo):</p>
<pre>
crm configure rsc_defaults resource-stickiness=100
</pre>
<p>A continuación añadiremos servicios, primero de todo tenemos que obtener el listado de clases que podemos añadir:</p>
<pre>
# crm ra classes
heartbeat
lsb
ocf / heartbeat pacemaker
stonith
</pre>
<p>Mediante <strong>crm ra list</strong> podemos listar los scripts de control de una de las clases:</p>
<pre>
# 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
</pre>
<p>A continuación mediante <strong>crm ra info</strong> podemos obtener los datos de funcionamiento de un script en concreto:</p>
<pre>
# 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
</pre>
<p>Añadiremos una <strong>IP de cluster</strong> (<strong>VIP</strong>) como servicio con <strong>crm configure primitive</strong>:</p>
<pre>
crm configure primitive haip1 ocf:heartbeat:IPaddr2 params ip=172.16.2.100 cidr_netmask=32 op monitor interval=30s
</pre>
<p>Mediante <strong>crm status</strong> podemos apreciar que se ha levantado y en que nodo:</p>
<pre>
# 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
</pre>
<p>En el nodo que se haya levantado podemos ver como esta presente mediante <strong>ip addr show</strong>:</p>
<pre>
# ip addr show
1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; 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: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; 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
</pre>
<p>A continuación mediante <strong>ocf:heartbeat:anything</strong> podemos añadir cualquier daemon al cluster. Primero obtenemos los detalles con <strong>crm ra info</strong>:</p>
<pre>
# 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
</pre>
<p>Por ejemplo, añadimos el daemon de <strong>memcached al cluster</strong> con el siguiente comando:</p>
<pre>
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"
</pre>
<p>Mediante <strong>crm status</strong> podemos apreciar como se ha añadido:</p>
<pre>
# 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
</pre>
<p>A continuación podemos indicar dos recursos con que puntuación deben mantenerse juntos:</p>
<pre>
# crm configure colocation
usage: colocation &lt;id&gt; &lt;score&gt;: <rsc>[:<role>] <rsc>[:<role>]
</pre>
<p>Mediante <strong>crm configure colocation</strong> indicamos que la <strong>VIP</strong> y el <strong>servicio de memcache</strong> estén en el mismo nodo:</p>
<pre>
crm configure colocation memcached-ip1 INFINITY: haip1 memcache
</pre>
<p>Revisamos con <strong>crm status</strong> como se han agrupado:</p>
<pre>
# 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
</pre>
<p>A continuación mediante <strong>order</strong> indicamos el orden en que se deben arrancar los servicios:</p>
<pre>
# crm configure order
usage: order &lt;id&gt; score-type: &lt;first-rsc&gt;[:&lt;action&gt;] &lt;then-rsc&gt;[:&lt;action&lt;]
        [symmetrical=&lt;bool&gt;]
</pre>
<p>Por lo tanto, indicamos que primero se levante la <strong>IP</strong> y a continuación el <strong>memcached</strong>:</p>
<pre>
crm configure order ip-memcache mandatory: haip1 memcache
</pre>

	Tags: <a href="http://systemadmin.es/tag/altadisponibilidad" title="Alta disponibilidad" rel="tag">Alta disponibilidad</a>, <a href="http://systemadmin.es/tag/heartbeat" title="heartbeat" rel="tag">heartbeat</a>, <a href="http://systemadmin.es/tag/pacemaker" title="pacemaker" rel="tag">pacemaker</a><br />

	<h4 style="margin-top: 50px">Relacionados</h4>
	<ul class="st-related-posts">
	<li><a href="http://systemadmin.es/2010/02/statement-is-not-safe-to-log-in-statement-format" onclick="pageTracker._trackEvent('relacionados','2313');" title="Statement is not safe to log in statement format (25/February/2010)">Statement is not safe to log in statement format</a></li>
	<li><a href="http://systemadmin.es/2009/06/ssh-con-daemontools" onclick="pageTracker._trackEvent('relacionados','1758');" title="ssh con daemontools (15/June/2009)">ssh con daemontools</a></li>
	<li><a href="http://systemadmin.es/2010/05/replicacion-en-memcached" onclick="pageTracker._trackEvent('relacionados','2578');" title="Replicación en memcached (6/May/2010)">Replicación en memcached</a></li>
	<li><a href="http://systemadmin.es/2008/12/reinicio-automatico-de-memcached-en-la-version-de-facebook" onclick="pageTracker._trackEvent('relacionados','891');" title="Reinicio automático de memcached en la versión de Facebook (14/December/2008)">Reinicio automático de memcached en la versión de Facebook</a></li>
	<li><a href="http://systemadmin.es/2009/11/posiciones-del-fichero-de-configuracion-de-mysql" onclick="pageTracker._trackEvent('relacionados','2067');" title="Posiciones del fichero de configuración de MySQL (20/November/2009)">Posiciones del fichero de configuración de MySQL</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://systemadmin.es/2011/03/instalacion-y-configuracion-de-heartbeat-2/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Instalar HAProxy (balanceador HTTP SMTP TCP)</title>
		<link>http://systemadmin.es/2010/06/instalar-haproxy-balanceador-http-smtp-tcp</link>
		<comments>http://systemadmin.es/2010/06/instalar-haproxy-balanceador-http-smtp-tcp#comments</comments>
		<pubDate>Fri, 25 Jun 2010 07:08:34 +0000</pubDate>
		<dc:creator>Jordi Prats</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[HAProxy]]></category>

		<guid isPermaLink="false">http://systemadmin.es/?p=2675</guid>
		<description><![CDATA[El HAProxy es un balanceador TCP que se suele usar para peticiones HTTP pero se puede usar para cualquier protocolo TCP. Vamos a ver como instalarlo y como configurarlo: Primero de todo lo descargamos y lo compilamos: cd /usr/local/src/ wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.8.tar.gz tar xzf haproxy-1.4.8.tar.gz cd haproxy-1.4.8 make TARGET=linux26 make install A continuación preparamos el entorno [...]]]></description>
			<content:encoded><![CDATA[<p>El <strong>HAProxy</strong> es un <strong>balanceador TCP</strong> que se suele usar para <strong>peticiones HTTP</strong> pero se puede usar para <strong>cualquier protocolo TCP</strong>. Vamos a ver como instalarlo y como configurarlo:</p>
<p><!-- more --></p>
<p>Primero de todo lo descargamos y lo compilamos:</p>
<pre>
cd /usr/local/src/
wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.8.tar.gz
tar xzf haproxy-1.4.8.tar.gz
cd haproxy-1.4.8
make TARGET=linux26
make install
</pre>
<p>A continuación preparamos el entorno para usarlo con <strong>chroot</strong> y <strong>daemontools</strong>:</p>
<pre>
mkdir /usr/local/supervise/haproxy -p
mkdir -p /usr/local/chroot/haproxy/
useradd haproxy
cat &lt;&lt;EOF > /usr/local/supervise/haproxy/run
#!/bin/bash
exec /usr/local/sbin/haproxy -f /usr/local/etc/haproxy.cfg
EOF
chmod +x /usr/local/supervise/haproxy/run
ln -s /usr/local/supervise/haproxy/ /service/
</pre>
<p>Para indicar a que <strong>id</strong> debe cambiar el proceso hacemos un <strong>id</strong> al <strong>usuario haproxy</strong> que acabamos de crear y nos quedamos con el valor numérico:</p>
<pre>
# id haproxy
uid=508(haproxy) gid=508(haproxy) groups=508(haproxy)
</pre>
<p>Vamos a ver a continuación como configurarlo (mediante el fichero <strong>/usr/local/etc/haproxy.cfg</strong>) para repartir conexiones entre tres servidores de correo con una distribución de: 40%, 25% y 35%:</p>
<pre>
global
	uid 		508
	gid 		508
	chroot 		/usr/local/chroot/haproxy
	log 		127.0.0.1	local0
	log 		127.0.0.1	local1 notice
	maxconn 	32000

defaults
	log		global
	mode		tcp
	option		dontlognull
	retries		3
	option		redispatch
	option		smtpchk
	maxconn		2000
	contimeout	5000
	clitimeout	50000
	srvtimeout	50000

listen push 0.0.0.0:25
	mode tcp
	balance roundrobin
	server spamer1 10.10.1.1:25 check weight 40
	server spamer2 10.10.1.2:25 check weight 25
	server spamer3 10.10.1.3:25 check weight 35
</pre>
<p>Las directivas siguientes son las mas relevantes:</p>
<ul>
<li><strong>chroot /usr/local/chroot/haproxy</strong>: Indica a HAProxy que haga un chroot en el path que se le indica</li>
<li><strong>option smtpchk</strong>: Realiza un inicio de sesión <strong>SMTP</strong> para comprobar el estado del servidor. También se pueden hacer una petición <strong>HTTP</strong> mediante <strong>httpchk</strong></li>
<li><strong>balance roundrobin</strong>: Define el modo en que reparte las peticiones, en este caso puramente roundrobin, pero también puede ser por el servidor con menos conexiones (<strong>leastconn</strong>) o incluso inspeccionando el <strong>protocolo HTTP</strong></li>
<li><strong>server spamer1 10.10.1.1:25 check weight 40</strong>: Define los backends a los que repartir las conexiones, en este caso indica que se le deben repartir un 40% de las peticiones</li>
</ul>
<p>En la <a href="http://haproxy.1wt.eu/download/1.4/doc/configuration.txt">documentación de HAProxy</a> se pueden encontrar todas las directivas detalladas.</p>

	Tags: <a href="http://systemadmin.es/tag/haproxy" title="HAProxy" rel="tag">HAProxy</a><br />

	<h4 style="margin-top: 50px">Relacionados</h4>
	<ul class="st-related-posts">
	<li><a href="http://systemadmin.es/2011/08/haproxy-en-modo-sticky-o-en-modo-roundrobin" onclick="pageTracker._trackEvent('relacionados','3509');" title="HAProxy en modo sticky o en modo roundrobin (31/August/2011)">HAProxy en modo sticky o en modo roundrobin</a></li>
	<li><a href="http://systemadmin.es/2011/11/estado-de-haproxy-desde-socket" onclick="pageTracker._trackEvent('relacionados','3671');" title="Estado de HAProxy desde socket (29/November/2011)">Estado de HAProxy desde socket</a></li>
	<li><a href="http://systemadmin.es/2009/01/balanceador-de-carga-con-haproxy" onclick="pageTracker._trackEvent('relacionados','1337');" title="Balanceador de carga con HAProxy (28/January/2009)">Balanceador de carga con HAProxy</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://systemadmin.es/2010/06/instalar-haproxy-balanceador-http-smtp-tcp/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Alta disponibilidad: cluster Activo-Activo y Activo-Pasivo</title>
		<link>http://systemadmin.es/2010/05/alta-disponibilidad-cluster-activo-activo-y-activo-pasivo</link>
		<comments>http://systemadmin.es/2010/05/alta-disponibilidad-cluster-activo-activo-y-activo-pasivo#comments</comments>
		<pubDate>Fri, 28 May 2010 07:22:05 +0000</pubDate>
		<dc:creator>Jordi Prats</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Alta disponibilidad]]></category>

		<guid isPermaLink="false">http://systemadmin.es/?p=2368</guid>
		<description><![CDATA[En encuentros con comerciales estoy harto de escuchar los mismos &#8220;errores&#8221; sobre el tipo de alta disponibilidad de los equipos referente a si son activo-activo o activo-pasivo. Podemos hablar de varias configuraciones de cluster, pero en general nos podemos quedar con dos de básicas: Activo-Activo: Todos los nodos dels cluster reciben una parte de la [...]]]></description>
			<content:encoded><![CDATA[<p>En encuentros con comerciales estoy harto de escuchar los mismos &#8220;errores&#8221; sobre el tipo de alta disponibilidad de los equipos referente a si son <strong>activo-activo</strong> o <strong>activo-pasivo</strong>.</p>
<p><!-- more --></p>
<p>Podemos hablar de varias configuraciones de cluster, pero en general nos podemos quedar con dos de básicas:</p>
<ul>
<li><strong>Activo-Activo</strong>: Todos los nodos dels cluster reciben una parte de la misma carga.</li>
<li><strong>Activo-Pasivo</strong>: La carga la asume uno de los nodos y en caso de caída se traspasa a otro nodo</li>
</ul>
<p>Muchas veces se abusa de estas definiciones quizá demasiado amplias para vender la moto. Suponemos un cluster así:</p>
<div id="attachment_2615" class="wp-caption aligncenter" style="width: 310px"><a href="http://systemadmin.es/wp-content/uploads/2010/05/cluster-mysql-postgresql.png"><img src="http://systemadmin.es/wp-content/uploads/2010/05/cluster-mysql-postgresql-300x124.png" alt="Cluster MySQL PostgreSQL" title="Cluster MySQL PostgreSQL" width="300" height="124" class="size-medium wp-image-2615" /></a><p class="wp-caption-text">Cluster MySQL PostgreSQL</p></div>
<p>Este cluster evidentemente están los dos haciendo cosas, por lo que en cualquier presentación hecha por un comercial tendría muchos números de escuchar que es un &#8220;<strong>activo-activo</strong>&#8220;.</p>
<p>Entiendo que quieran decir que no hay un nodo desaprovechado, pero desde el punto de vista más estricto el servicio esta activo siempre en solo uno de los dos, por lo que el servicio es <strong>activo-pasivo</strong>.</p>
<p>Para hablar de uno <strong>activo-activo</strong> deberíamos hablar de <strong>al menos dos equipos con el mismo servicio</strong> que los clientes puedan conectar a ellos indistintamente. Un ejemplo muy claro sería un conjunto de frontales que sirven el mismo contenido indistintamente:</p>
<div id="attachment_2616" class="wp-caption aligncenter" style="width: 310px"><a href="http://systemadmin.es/wp-content/uploads/2010/05/cluster-apache.png"><img src="http://systemadmin.es/wp-content/uploads/2010/05/cluster-apache-300x111.png" alt="Cluster de Apaches activo-activo" title="Cluster de Apaches activo-activo" width="300" height="111" class="size-medium wp-image-2616" /></a><p class="wp-caption-text">Cluster de Apaches activo-activo</p></div>

	Tags: <a href="http://systemadmin.es/tag/altadisponibilidad" title="Alta disponibilidad" rel="tag">Alta disponibilidad</a><br />

	<h4 style="margin-top: 50px">Relacionados</h4>
	<ul class="st-related-posts">
	<li><a href="http://systemadmin.es/2010/02/statement-is-not-safe-to-log-in-statement-format" onclick="pageTracker._trackEvent('relacionados','2313');" title="Statement is not safe to log in statement format (25/February/2010)">Statement is not safe to log in statement format</a></li>
	<li><a href="http://systemadmin.es/2009/06/ssh-con-daemontools" onclick="pageTracker._trackEvent('relacionados','1758');" title="ssh con daemontools (15/June/2009)">ssh con daemontools</a></li>
	<li><a href="http://systemadmin.es/2010/05/replicacion-en-memcached" onclick="pageTracker._trackEvent('relacionados','2578');" title="Replicación en memcached (6/May/2010)">Replicación en memcached</a></li>
	<li><a href="http://systemadmin.es/2008/12/reinicio-automatico-de-memcached-en-la-version-de-facebook" onclick="pageTracker._trackEvent('relacionados','891');" title="Reinicio automático de memcached en la versión de Facebook (14/December/2008)">Reinicio automático de memcached en la versión de Facebook</a></li>
	<li><a href="http://systemadmin.es/2009/11/posiciones-del-fichero-de-configuracion-de-mysql" onclick="pageTracker._trackEvent('relacionados','2067');" title="Posiciones del fichero de configuración de MySQL (20/November/2009)">Posiciones del fichero de configuración de MySQL</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://systemadmin.es/2010/05/alta-disponibilidad-cluster-activo-activo-y-activo-pasivo/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Los modos de bonding</title>
		<link>http://systemadmin.es/2009/04/los-modos-de-bonding</link>
		<comments>http://systemadmin.es/2009/04/los-modos-de-bonding#comments</comments>
		<pubDate>Thu, 02 Apr 2009 07:46:15 +0000</pubDate>
		<dc:creator>Jordi Prats</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Redes]]></category>
		<category><![CDATA[Alta disponibilidad]]></category>
		<category><![CDATA[Rendimiento]]></category>

		<guid isPermaLink="false">http://systemadmin.es/?p=1602</guid>
		<description><![CDATA[Al configurar un bonding debemos decidir cual de los modos vamos a usar. Vamos a ver cuales son los que tenemos disponibles: mode=1 (activo-pasivo) Con este modo solo tenemos activo un slave en concreto. En el caso que este falle se pasa a usar el otro. El modo de funcionamiento nos ofrece solo tolerancia a [...]]]></description>
			<content:encoded><![CDATA[<p>Al configurar un <strong>bonding</strong> debemos decidir cual de los modos vamos a usar. Vamos a ver cuales son los que tenemos disponibles:</p>
<p><!-- more --></p>
<ul>
<li>mode=1 (<strong>activo-pasivo</strong>)
<p>Con este modo solo tenemos activo un <strong>slave</strong> en concreto. En el caso que este falle se pasa a usar el otro. El modo de funcionamiento nos ofrece solo <strong>tolerancia a fallos</strong>.</p>
</li>
<li>mode=2 (<strong>balance-xor</strong>)
<p>Para transmitir una trama lo hace basado en el siguiente calculo: <strong>(MAC de origen XOR MAC destino)%numero de interfaces slaves</strong>. De esta manera para cada <strong>MAC</strong> de destino se selecciona una interfaz en concreto. Este modo nos ofrece balanceo de carga y tolerancia a fallos. En el caso que tengamos un <strong>bonding</strong> en este modo que principalmente hable con otras maquinas de otras <strong>VLANs</strong> tenemos que tener en cuenta que solo usaremos una interfaz, ya que todas las conexiones a otras VLAN deben pasar por el <strong>gateway</strong> el cual se trata de otra <strong>MAC</strong> más.
</li>
<li>mode=3 (<strong>broadcast</strong>)
<p>Transmite todas las tramas por todas las <strong>interfaces slave</strong>. Este modo nos ofrece <strong>tolerancia a fallos</strong>.</p>
</li>
<li>mode=4 (<strong>802.3ad</strong>)
<p>Se trata del estandard <strong>IEEE 802.3ad</strong> (Dynamic link aggregation) también llamado &#8220;<strong>port trunking</strong>&#8220;. Permite la definición de agregados ofreciendo alta disponibilidad y un aumento de la velocidad. Para poder configurar este modo necesitamos:</p>
<p><Ul></p>
<li>Soporte de <strong>ethtool</strong> para obtener la velocidad y el modo del interfaz.</li>
<li>El switch debe soportar el modo. Por ejemplo los <a href="http://www.cisco.com/en/US/products/ps9967/products_qanda_item09186a0080a363f8.shtml">CISCO lo soportan con el nombre port trunking</a>.</li>
</ul>
</li>
<li>mode=5 (<strong>balance-tlb</strong>)
<p>Este modo transmite balanceando la carga entre los <strong>slave</strong> en función de la carga de cada <strong>slave</strong>. En el caso que uno falle la <strong>MAC</strong> salta a otro <strong>slave</strong>. Para calcular la carga de cada interfaz es necesario disponer de <strong>ethtool</strong>.</p>
<p>A diferencia de <strong>802.3ad</strong> no se necesario soporte del switch para esta configuración.</p>
<p>Tenemos que tener en cuenta que puede producirse que los paquetes lleguen desordenados, por lo que puede ser peor el remedio que la enfermedad, especialmente en entornos de red complejos.
</li>
<li>mode=6 (<strong>balance-alb</strong>)
<p>Balanceo de carga tanto en el envío como en la recepción. Para el balanceo de carga en la recepción lo que se hace es manipulando los replies ARP para indicar una MAC en concreto de una de las interfaces slave.</p>
<p>Deberemos tener en cuenta que cualquier sistema de seguridad basado en las tablas <strong>ARP</strong> puede quejarse o simplemente tirar el puerto de la interfaz dejando el servidor sin conectividad.
</li>
</ul>
<p>Para configurar estos modos lo debemos hacer en el fichero <strong>/etc/modprobe.conf</strong>. Por ejemplo para configurar un <strong>bonding</strong> en modo activo-pasivo usaremos la siguiente configuración:</p>
<pre>
alias bond0 bonding
options bond0 miimon=100 mode=1
</pre>
<p>A continuación en las interfaces físicas (<strong>/etc/sysconfig/network-scripts/ifcfg-eth0</strong>) debemos definirlas como slaves. Por ejemplo, para la <strong>eth0</strong> la definimos como <strong>slave</strong> de <strong>bond0</strong> :</p>
<pre>
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
USERCTL=no
MASTER=bond0
SLAVE=yes
ETHTOOL_OPTS="autoneg off speed 100 duplex full"
</pre>
<p>Y a continuación deberemos definir el bonding en el fichero <strong>/etc/sysconfig/network-scripts/ifcfg-bond0</strong>:</p>
<pre>
DEVICE=bond0
ONBOOT=yes
BOOTPROTO=none
IPADDR=10.1.1.8
NETMASK=255.255.255.0
GATEWAY=10.1.1.254
</pre>

	Tags: <a href="http://systemadmin.es/tag/altadisponibilidad" title="Alta disponibilidad" rel="tag">Alta disponibilidad</a>, <a href="http://systemadmin.es/tag/rendimiento" title="Rendimiento" rel="tag">Rendimiento</a><br />

	<h4 style="margin-top: 50px">Relacionados</h4>
	<ul class="st-related-posts">
	<li><a href="http://systemadmin.es/2010/02/statement-is-not-safe-to-log-in-statement-format" onclick="pageTracker._trackEvent('relacionados','2313');" title="Statement is not safe to log in statement format (25/February/2010)">Statement is not safe to log in statement format</a></li>
	<li><a href="http://systemadmin.es/2009/06/ssh-con-daemontools" onclick="pageTracker._trackEvent('relacionados','1758');" title="ssh con daemontools (15/June/2009)">ssh con daemontools</a></li>
	<li><a href="http://systemadmin.es/2010/05/replicacion-en-memcached" onclick="pageTracker._trackEvent('relacionados','2578');" title="Replicación en memcached (6/May/2010)">Replicación en memcached</a></li>
	<li><a href="http://systemadmin.es/2008/11/rendimiento-ext3-creacion-del-journal-en-otro-dispositivo" onclick="pageTracker._trackEvent('relacionados','592');" title="Rendimiento ext3: Creación del journal en otro dispositivo (26/November/2008)">Rendimiento ext3: Creación del journal en otro dispositivo</a></li>
	<li><a href="http://systemadmin.es/2008/12/reinicio-automatico-de-memcached-en-la-version-de-facebook" onclick="pageTracker._trackEvent('relacionados','891');" title="Reinicio automático de memcached en la versión de Facebook (14/December/2008)">Reinicio automático de memcached en la versión de Facebook</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://systemadmin.es/2009/04/los-modos-de-bonding/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Balanceador de carga con HAProxy</title>
		<link>http://systemadmin.es/2009/01/balanceador-de-carga-con-haproxy</link>
		<comments>http://systemadmin.es/2009/01/balanceador-de-carga-con-haproxy#comments</comments>
		<pubDate>Wed, 28 Jan 2009 15:05:58 +0000</pubDate>
		<dc:creator>Jordi Prats</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Alta disponibilidad]]></category>
		<category><![CDATA[HAProxy]]></category>

		<guid isPermaLink="false">http://systemadmin.es/?p=1337</guid>
		<description><![CDATA[HAProxy es un balanceador de carga multiprotocolo muy sencillo de instalar. Revisando configuraciones de HAProxy me he encontrado cosas tan absurdas como las siguientes. listen smtpd 0.0.0.0:25 mode tcp balance roundrobin server qmailfront1 127.0.0.1:2525 check server qmailback1 192.168.10.33:25 check server qmailback1 192.168.10.33:25 check server qmailback1 192.168.10.33:25 check server qmailback1 192.168.10.33:25 check server qmailback1 192.168.10.33:25 check [...]]]></description>
			<content:encoded><![CDATA[<p><strong>HAProxy</strong> es un <a href="/2010/06/instalar-haproxy-balanceador-http-smtp-tcp">balanceador de carga multiprotocolo muy sencillo de instalar</a>. Revisando configuraciones de <strong>HAProxy</strong> me he encontrado cosas tan absurdas como las siguientes.</p>
<p><!-- more --></p>
<pre>
listen smtpd 0.0.0.0:25
        mode tcp
        balance roundrobin
        server qmailfront1 127.0.0.1:2525 check
        server qmailback1 192.168.10.33:25 check
        server qmailback1 192.168.10.33:25 check
        server qmailback1 192.168.10.33:25 check
        server qmailback1 192.168.10.33:25 check
        server qmailback1 192.168.10.33:25 check
        server qmailback1 192.168.10.33:25 check
        server qmailback2 192.168.10.34:25 check
        server qmailback2 192.168.10.34:25 check
        server qmailback2 192.168.10.34:25 check
</pre>
<p>El operador que configuró este servidor intentaba definir un 10% de las peticiones que llegasen las quedara el mismo, repartiendo en dos servidores internos un 30% el uno y un 60% el otro.</p>
<p>Funciona correctamente, pero en caso de mas servidores con números menos redondos sería muy complicado de definir.</p>
<p>En realidad usando pesos (<strong>weight</strong>) para cada servidor podemos hacer lo mismo mucho mas sencillo:</p>
<pre>
listen smtpd 0.0.0.0:25
        mode tcp
        balance roundrobin
        server qmailfront1 127.0.0.1:2525 check weight 10
        server qmailback1 192.168.10.33:25 check weight 60
        server qmailback2 192.168.10.34:25 check weight 30
</pre>
<p>Podemos consultar la <a href="http://haproxy.1wt.eu/download/1.3/doc/configuration.txt">documentación de HAProxy</a> para muchas otras opciones.</p>

	Tags: <a href="http://systemadmin.es/tag/altadisponibilidad" title="Alta disponibilidad" rel="tag">Alta disponibilidad</a>, <a href="http://systemadmin.es/tag/haproxy" title="HAProxy" rel="tag">HAProxy</a><br />

	<h4 style="margin-top: 50px">Relacionados</h4>
	<ul class="st-related-posts">
	<li><a href="http://systemadmin.es/2010/02/statement-is-not-safe-to-log-in-statement-format" onclick="pageTracker._trackEvent('relacionados','2313');" title="Statement is not safe to log in statement format (25/February/2010)">Statement is not safe to log in statement format</a></li>
	<li><a href="http://systemadmin.es/2009/06/ssh-con-daemontools" onclick="pageTracker._trackEvent('relacionados','1758');" title="ssh con daemontools (15/June/2009)">ssh con daemontools</a></li>
	<li><a href="http://systemadmin.es/2010/05/replicacion-en-memcached" onclick="pageTracker._trackEvent('relacionados','2578');" title="Replicación en memcached (6/May/2010)">Replicación en memcached</a></li>
	<li><a href="http://systemadmin.es/2008/12/reinicio-automatico-de-memcached-en-la-version-de-facebook" onclick="pageTracker._trackEvent('relacionados','891');" title="Reinicio automático de memcached en la versión de Facebook (14/December/2008)">Reinicio automático de memcached en la versión de Facebook</a></li>
	<li><a href="http://systemadmin.es/2009/11/posiciones-del-fichero-de-configuracion-de-mysql" onclick="pageTracker._trackEvent('relacionados','2067');" title="Posiciones del fichero de configuración de MySQL (20/November/2009)">Posiciones del fichero de configuración de MySQL</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://systemadmin.es/2009/01/balanceador-de-carga-con-haproxy/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Como corregir los errores: Stale NFS file handle</title>
		<link>http://systemadmin.es/2008/11/como-corregir-los-errores-stale-nfs-file-handle</link>
		<comments>http://systemadmin.es/2008/11/como-corregir-los-errores-stale-nfs-file-handle#comments</comments>
		<pubDate>Fri, 28 Nov 2008 15:23:07 +0000</pubDate>
		<dc:creator>Jordi Prats</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Alta disponibilidad]]></category>
		<category><![CDATA[NFS]]></category>

		<guid isPermaLink="false">http://systemadmin.es/?p=665</guid>
		<description><![CDATA[Un error típico de los clusters es encontrar los clientes con el error &#8220;Stale NFS file handle&#8221; Este error ocurre porque el identificador que usa NFS (file handle) es la combinación de: Major del dispositivo que contiene el sistema de ficheros Minor del dispositivo que contiene el sistema de ficheros inode del sistema de ficheros [...]]]></description>
			<content:encoded><![CDATA[<p>Un error típico de los <strong>clusters</strong> es encontrar los clientes con el error &#8220;<strong>Stale NFS file handle</strong>&#8221;</p>
<p><!-- more --></p>
<p>Este error ocurre porque el identificador que usa <strong>NFS</strong> (<strong>file handle</strong>) es la combinación de:</p>
<ul>
<li><strong>Major</strong> del dispositivo que contiene el sistema de ficheros</li>
<li><strong>Minor</strong> del dispositivo que contiene el sistema de ficheros</li>
<li><strong>inode</strong> del sistema de ficheros</li>
</ul>
<p>El problema ocurre cuando el <strong>major</strong>, el <strong>minor</strong> o los dos són diferentes en los nodos del <strong>clúster</strong>: Esto provoca el <strong>stale</strong>.</p>
<p>Para evitar esto se debe usar el <strong>fsid</strong>, el cual se usa en lugar del <strong>major</strong> y el <strong>minor</strong> del dispositivo:</p>
<pre>
/usr/local     *(async,rw,fsid=3)
</pre>

	Tags: <a href="http://systemadmin.es/tag/altadisponibilidad" title="Alta disponibilidad" rel="tag">Alta disponibilidad</a>, <a href="http://systemadmin.es/tag/nfs" title="NFS" rel="tag">NFS</a><br />

	<h4 style="margin-top: 50px">Relacionados</h4>
	<ul class="st-related-posts">
	<li><a href="http://systemadmin.es/2012/04/usuarios-en-export-nfs-aparecen-como-nobody-en-centos-6" onclick="pageTracker._trackEvent('relacionados','3859');" title="Usuarios en export NFS aparecen como nobody en CentOS 6 (25/April/2012)">Usuarios en export NFS aparecen como nobody en CentOS 6</a></li>
	<li><a href="http://systemadmin.es/2009/02/uso-de-los-threads-de-nfs" onclick="pageTracker._trackEvent('relacionados','1527');" title="Uso de los threads de NFS (13/February/2009)">Uso de los threads de NFS</a></li>
	<li><a href="http://systemadmin.es/2010/02/statement-is-not-safe-to-log-in-statement-format" onclick="pageTracker._trackEvent('relacionados','2313');" title="Statement is not safe to log in statement format (25/February/2010)">Statement is not safe to log in statement format</a></li>
	<li><a href="http://systemadmin.es/2009/06/ssh-con-daemontools" onclick="pageTracker._trackEvent('relacionados','1758');" title="ssh con daemontools (15/June/2009)">ssh con daemontools</a></li>
	<li><a href="http://systemadmin.es/2010/05/replicacion-en-memcached" onclick="pageTracker._trackEvent('relacionados','2578');" title="Replicación en memcached (6/May/2010)">Replicación en memcached</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://systemadmin.es/2008/11/como-corregir-los-errores-stale-nfs-file-handle/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gestión LVM en cluster</title>
		<link>http://systemadmin.es/2008/11/gestion-lvm-en-cluster</link>
		<comments>http://systemadmin.es/2008/11/gestion-lvm-en-cluster#comments</comments>
		<pubDate>Tue, 04 Nov 2008 10:43:58 +0000</pubDate>
		<dc:creator>Jordi Prats</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Alta disponibilidad]]></category>
		<category><![CDATA[LVM]]></category>

		<guid isPermaLink="false">http://systemadmin.es/?p=302</guid>
		<description><![CDATA[Resulta común el uso de LVM en clusters por su gran flexibilidad. Aún así, se ve mas comunmente de lo que parece com es usado como si LVM fuera consciente que algun otro proceso puede acceder sin avisar al disco. Idealmente se usaría cLVM, que es la versión para clusters de LVM, pero en versiones [...]]]></description>
			<content:encoded><![CDATA[<p>Resulta común el uso de <strong>LVM </strong>en clusters por su gran flexibilidad. Aún así, se ve mas comunmente de lo que parece com es usado como si <strong>LVM </strong>fuera consciente que algun otro proceso puede acceder sin avisar al disco.<br />
<!-- more --><br />
<div id="attachment_312" class="wp-caption aligncenter" style="width: 239px"><a href="http://systemadmin.es/wp-content/uploads/2008/11/esquema_cluster_lvm.png"><img src="http://systemadmin.es/wp-content/uploads/2008/11/esquema_cluster_lvm-229x300.png" alt="Ejemplo de cluster usando LVM" title="Esquema de cluster usando LVM mediante dos discos fisicos repartidos en tres volumenes logicos" width="229" height="300" class="size-medium wp-image-312" /></a><p class="wp-caption-text">Ejemplo de cluster usando LVM</p></div><br />
Idealmente se usaría <a href="http://sources.redhat.com/cluster/clvm/">cLVM</a>, que es la versión para clusters de <strong>LVM</strong>, pero en versiones anteriores a <strong>RedHat Enterprise Linux 4</strong> éste no esta disponible. Así es común encontrar clusters montados con <strong>LVM</strong> compartido entre los diversos nodos del cluster.<br />
Para evitar problemas, al realizar cualquier operación, se deberia hacer con un solo nodo, por lo que los servicios que usen los volumenes <strong>LVM</strong> deben pasar a un solo nodo, dehabilitando <strong>LVM</strong> en el resto de nodos. Para ello se deben usar los siguientes comandos:</p>
<ul>
<li>Quitamos los procesos del nodo</li>
<li>Deshabilitamos los volumenes logicos mediante <strong>lvchange</strong>:
<pre># lvchange -an /dev/group/volume</pre>
<p>Estos comandos realmente no son necesarios si no se usan los volumenes logicos, pero en el caso que no sea así nos indicará cual de ellos esta usandose y por lo tanto bloqueando el grupo entero</li>
<li>Deshabilitamos el grupo mediante <strong>vgchange</strong>:
<pre># vgchange -an group</pre>
</li>
</ul>
<p>Una vez realizados los cambios (añadir un disco, extender un volumen&#8230;) se pueden rehabilitar cambiando la opción <strong>-an</strong> (avaliable: no) por <strong>-ay</strong> (avaliable: yes)</p>

	Tags: <a href="http://systemadmin.es/tag/altadisponibilidad" title="Alta disponibilidad" rel="tag">Alta disponibilidad</a>, <a href="http://systemadmin.es/tag/cluster" title="Clustering" rel="tag">Clustering</a>, <a href="http://systemadmin.es/tag/lvm" title="LVM" rel="tag">LVM</a><br />

	<h4 style="margin-top: 50px">Relacionados</h4>
	<ul class="st-related-posts">
	<li><a href="http://systemadmin.es/2010/02/statement-is-not-safe-to-log-in-statement-format" onclick="pageTracker._trackEvent('relacionados','2313');" title="Statement is not safe to log in statement format (25/February/2010)">Statement is not safe to log in statement format</a></li>
	<li><a href="http://systemadmin.es/2009/06/ssh-con-daemontools" onclick="pageTracker._trackEvent('relacionados','1758');" title="ssh con daemontools (15/June/2009)">ssh con daemontools</a></li>
	<li><a href="http://systemadmin.es/2010/05/replicacion-en-memcached" onclick="pageTracker._trackEvent('relacionados','2578');" title="Replicación en memcached (6/May/2010)">Replicación en memcached</a></li>
	<li><a href="http://systemadmin.es/2008/12/reinicio-automatico-de-memcached-en-la-version-de-facebook" onclick="pageTracker._trackEvent('relacionados','891');" title="Reinicio automático de memcached en la versión de Facebook (14/December/2008)">Reinicio automático de memcached en la versión de Facebook</a></li>
	<li><a href="http://systemadmin.es/2008/12/recuperacion-parcial-de-una-base-de-datos-innodb-desde-snapshot" onclick="pageTracker._trackEvent('relacionados','995');" title="Recuperación parcial de una base de datos InnoDB desde snapshot (24/December/2008)">Recuperación parcial de una base de datos InnoDB desde snapshot</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://systemadmin.es/2008/11/gestion-lvm-en-cluster/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

