<?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>nordri&#039;s Blog &#187; cluster</title>
	<atom:link href="http://www.muspells.net/blog/tag/cluster/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.muspells.net/blog</link>
	<description>Estamos trabajando en ello...</description>
	<lastBuildDate>Wed, 04 Jan 2012 16:01:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Cluster de Almacenamiento con GlusterFS 3 y CentOS 5.6</title>
		<link>http://www.muspells.net/blog/2011/05/cluster-de-almacenamiento-con-glusterfs-3-y-centos-5-6/</link>
		<comments>http://www.muspells.net/blog/2011/05/cluster-de-almacenamiento-con-glusterfs-3-y-centos-5-6/#comments</comments>
		<pubDate>Sat, 14 May 2011 18:26:26 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[glusterfs]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=962</guid>
		<description><![CDATA[En el artículo de hoy vamos a montar un cluster de almacenamiento con dos servidores CentOS. Para la implementación del cluster vamos a usar GlusterFS, que es un sistema de ficheros en espacio de usuarios (FUSE). Sigue la arquitectura clásica de cliente-servidor y puede escalar hasta varios PetaBytes. Introducción. Para este tutorial vamos a utilizar [...]]]></description>
			<content:encoded><![CDATA[<p>En el artículo de hoy vamos a montar un cluster de almacenamiento con dos servidores <a href="http://centos.org/">CentOS</a>. Para la implementación del cluster vamos a usar <a href="http://www.gluster.org/">GlusterFS</a>, que es un sistema de ficheros en espacio de usuarios (<a href="http://es.wikipedia.org/wiki/FUSE_(Linux)">FUSE</a>). Sigue la arquitectura clásica de cliente-servidor y puede escalar hasta varios <a href="http://es.wikipedia.org/wiki/Petabyte">PetaBytes</a>.</p>
<h4>Introducción.</h4>
<p>Para este tutorial vamos a utilizar dos servidores:</p>
<ul>
<li>server1 192.168.2.100</li>
<li>server2 192.168.2.101</li>
</ul>
<p>Y un cliente:</p>
<ul>
<li>client1 192.168.2.102</li>
</ul>
<p>Todos los componentes deben poder resolver los nombres de los demás, si no se puede por DNS debes editar el fichero <em>/etc/hosts</em>:</p>
<pre>
# /etc/hosts
192.168.2.100   server1
192.168.2.101   server2
192.168.2.102   client1
</pre>
<h4>Configuración de los servidores.</h4>
<p>Antes de empezar con GlusterFS, vamos a preparar el sistema añadiendo las herramientas de desarrollo y librerías. En cada uno de los servidores ejecutamos:</p>
<pre>
# yum groupinstall 'Development Tools'
# yum groupinstall 'Development Libraries'
# yum install libibverbs-devel fuse-devel
</pre>
<p>Descargamos el software y lo compilamos:</p>
<pre>
# mkdir sandbox
# cd sandbox
# wget http://download.gluster.com/pub/gluster/glusterfs/3.0/LATEST/glusterfs-3.0.8.tar.gz
# tar zxvf glusterfs-3.0.8.tar.gz
# cd glusterfs-3.0.8
# ./configure
</pre>
<p>Al finalizar deberemos ver esto:</p>
<pre>
GlusterFS configure summary
===========================
FUSE client        : yes
Infiniband verbs   : yes
epoll IO multiplex : yes
libglusterfsclient : yes
argp-standalone    : no
fusermount         : no
</pre>
<p>Entonces compilamos e instalamos.</p>
<pre># make &#038;&#038; make install</pre>
<p>Enlazamos con las librerías dinámicas.</p>
<pre># ldconfig</pre>
<p>Podemos ahora comprobar que se ha instalado correctamente.</p>
<pre># glusterfs --version

glusterfs 3.0.8 built on May 13 2011 20:20:55
Repository revision: v3.0.8
Copyright (c) 2006-2009 Gluster Inc. <http://www.gluster.com>
GlusterFS comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GlusterFS under the terms of the GNU General Public License.
</pre>
<p>Vamos ahora a crear una estructura de directorio desde el que exportar el volumen. En este tutorial queremos compartir <em>/home</em> por lo que vamos a montar una porción de disco sobre el directorio que exportamos con Gluster para más adelante montar en el cliente en <em>/home</em>.</p>
<p>Creamos los siguientes directorios.</p>
<pre># mkdir -p /data/{exports,export-ns} /etc/glusterfs</pre>
<p>En <em>/etc/glusterfs/glusterfsd.vol</em> añadimos el fichero de configuración para nuestro volumen.</p>
<pre>
volume posix
  type storage/posix
  option directory /data/exports
end-volume

volume locks
  type features/locks
  subvolumes posix
end-volume

volume brick
  type performance/io-threads
  option thread-count 8
  subvolumes locks
end-volume

volume server
  type protocol/server
  option transport-type tcp/server
  option auth.addr.brick.allow 192.168.2.*
  subvolumes brick
end-volume
</pre>
<p>Para aumentar la seguridad, sólo se permiten las direcciones listadas en la línea <em>option auth.addr.brick.allow</em>, admite comodines y varias direcciones separadas por comas. En este ejemplo hemos dado acceso a todo el rango 192.168.2.0/24.</p>
<p>Como hemos compilado sin pasar ninguna opción previa al configure, vamos a crear un enlace simbólico para que el sistema encuentre el binario.</p>
<pre># ln -s /usr/local/sbin/glusterfsd /sbin/glusterfsd</pre>
<p>Ya podemos arrancar el demonio y configurar su nivel de arranque.</p>
<pre>
# chkconfig --levels 35 glusterfsd on
# /etc/init.d/glusterfsd start
Starting glusterfsd:                           [  OK  ]
</pre>
<p>Ahora vamos a añadir una partición en <em>/etc/fstab</em> la cual montaremos en <em>/data/exports</em></p>
<pre># vim /etc/fstab</pre>
<pre>
/dev/sda3     /data/exports     ext3     defaults     0 0
</pre>
<p>En cada servidor se hace esto, es lo que ofreceremos a los clientes a través de Gluster.</p>
<h4>Configuración de los clientes.</h4>
<p>Pasamos ahora a la configuración de los clientes, empezamos instalando las dependencias de compilación y librerías para acabar montando el volumen Gluster en <em>/home</em>. Estos pasos hay que hacerlos en cada cliente.</p>
<pre>
# yum groupinstall 'Development Tools'
# yum groupinstall 'Development Libraries'
# yum install libibverbs-devel fuse-devel
</pre>
<p>Ahora cargamos el módulo <em>fuse</em> que se encargará de hacer de interface con el Kernel.</p>
<pre># modprobe fuse</pre>
<p>Configuramos el sistema para que cargue el módulo con cada arranque.</p>
<pre>
# echo "modprobe fuse" >> /etc/rc.modules
# chmod +x /etc/rc.modules
</pre>
<p>En cada cliente descargamos e instalamos el software. Tal y como hemos hecho antes.</p>
<pre>
# mkdir sandbox
# cd sandbox
# wget http://download.gluster.com/pub/gluster/glusterfs/3.0/LATEST/glusterfs-3.0.8.tar.gz
# tar zxvf glusterfs-3.0.8.tar.gz
# cd glusterfs-3.0.8
# ./configure
</pre>
<p>Al finalizar deberemos ver esto:</p>
<pre>
GlusterFS configure summary
===========================
FUSE client        : yes
Infiniband verbs   : yes
epoll IO multiplex : yes
libglusterfsclient : yes
argp-standalone    : no
fusermount         : no
</pre>
<p>Entonces compilamos e instalamos.</p>
<pre># make &#038;&#038; make install</pre>
<p>Enlazamos con las librerías dinámicas.</p>
<pre># ldconfig</pre>
<p>Podemos ahora comprobar que se ha instalado correctamente.</p>
<pre># glusterfs --version

glusterfs 3.0.8 built on May 13 2011 20:20:55
Repository revision: v3.0.8
Copyright (c) 2006-2009 Gluster Inc. <http://www.gluster.com>
GlusterFS comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GlusterFS under the terms of the GNU General Public License.
</pre>
<p>Creamos el directorio de configuración de GlusterFS.</p>
<pre># mkdir /etc/glusterfs</pre>
<p>Añadimos lo siguiente al fichero <em>glusterfs.vol</em></p>
<pre>vim /etc/glusterfs/glusterfs.vol</pre>
<pre>

volume remote1
  type protocol/client
  option transport-type tcp/client
  option remote-host server1
  option remote-subvolume brick
end-volume

volume remote2
  type protocol/client
  option transport-type tcp/client
  option remote-host server2
  option remote-subvolume brick
end-volume

volume stripe
  type cluster/stripe
  option block-size 1MB
  subvolumes remote1 remote2
end-volume

volume writebehind
  type performance/write-behind
  option window-size 1MB
  subvolumes stripe
end-volume

volume cache
  type performance/io-cache
  option cache-size 512MB
  subvolumes writebehind
end-volume
</pre>
<p>Y ya podemos montar el volumen en <em>/home</em>:</p>
<pre> # glusterfs -f /etc/glusterfs/glusterfs.vol /home</pre>
<p>Podemos consultar que está montado ejecutando <em>mount</em>:</p>
<pre>
# mount

glusterfs#/etc/glusterfs/glusterfs.vol on /home type fuse (rw,allow_other,default_permissions,max_read=131072)
</pre>
<p>También ver el espacio disponible con <em>df</em>:</p>
<pre>
# df -hT

S.ficheros    Tipo  Tamaño Usado  Disp Uso% Montado en
/dev/sda1     ext3    2,9G  1,7G  1,1G  63% /
tmpfs        tmpfs    125M     0  125M   0% /dev/shm
glusterfs#/etc/glusterfs/glusterfs.vol
              fuse    6,5G  143M  6,1G   3% /home
</pre>
<p>Para hacer el montaje permanente, añadimos la siguiente línea a <em>/etc/fstab</em></p>
<pre>/etc/glusterfs/glusterfs.vol  /home             glusterfs          defaults,_netdev  0  0</pre>
<h4>Fallos.</h4>
<p>Si has llegado hasta aquí significa que todo ha ido bien, si has encontrado algún problema los ficheros de <em>logs</em> de Gluster se encuentra en:</p>
<pre>/usr/local/var/log/glusterfs/</pre>
<p>Revisa que todas las máquinas resuelven los nombres, que la línea <em>auth.addr.brick.allow</em> está bien configurada y que has escrito correctamente los nombres de los directorios. Estos son problemas comunes.</p>
<p>Por ejemplo, si algún cliente no está autorizado a montar el volumen, pasará esto:</p>
<pre># glusterfs -f /etc/glusterfs/glusterfs.vol /home
# mount 

/dev/sda1 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
glusterfs#/etc/glusterfs/glusterfs.vol on /home type fuse (rw,allow_other,default_permissions,max_read=131072)

# df -hT

S.ficheros    Tipo  Tamaño Usado  Disp Uso% Montado en
/dev/sda1     ext3    2,9G  1,7G  1,1G  63% /
tmpfs        tmpfs    125M     0  125M   0% /dev/shm
/dev/sda3     ext3    6,5G  143M  6,1G   3% /data/exports
df: «/home»: Argumento inválido
</pre>
<p>Vemos que se ha producido un error que no es muy descriptivo del problema real que está ocurriendo ya que sí ha montado el volumen.</p>
<h4>Conclusión.</h4>
<p>Este sistema proporciona escalabilidad y tolerancia. El echo de exportar un directorio nos permite montar en ese directorio el disco físico un volumen LVM, un RAID, combinaciones de ambos, sistemas NAS o DAS y así montar nuestro propio DropBox! <img src='http://www.muspells.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.muspells.net%2Fblog%2F2011%2F05%2Fcluster-de-almacenamiento-con-glusterfs-3-y-centos-5-6%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Cluster de Almacenamiento con GlusterFS 3 y CentOS 5.6. via @nordri" data-url="http://www.muspells.net/blog/2011/05/cluster-de-almacenamiento-con-glusterfs-3-y-centos-5-6/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2011/05/cluster-de-almacenamiento-con-glusterfs-3-y-centos-5-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Alta Disponibilidad con Apache2 y Heartbeat en Debian Squeeze</title>
		<link>http://www.muspells.net/blog/2011/04/alta-disponibilidad-con-apache2-y-heartbeat-en-debian-squeeze/</link>
		<comments>http://www.muspells.net/blog/2011/04/alta-disponibilidad-con-apache2-y-heartbeat-en-debian-squeeze/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 19:44:19 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[alta disponibilidad]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[debian squeeze]]></category>
		<category><![CDATA[heartbeat]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=920</guid>
		<description><![CDATA[A raíz de las últimas entradas en rm-rf.es y systemadmin.es quería probar el demonio de alta disponibilidad (heartbeat) sobre Debian, la entrada sobre Apache que publicó el primero me inspiró a hacer lo que contaba sobre la &#8220;distro&#8221; de la espiral. Partimos de la misma configuración, tenemos dos servidores, cluster01 y cluster02 con las IPs [...]]]></description>
			<content:encoded><![CDATA[<p>A raíz de las últimas entradas en <a href="http://rm-rf.es">rm-rf.es</a> y <a href="http://systemadmin.es">systemadmin.es</a> quería probar el demonio de alta disponibilidad (heartbeat) sobre Debian, la entrada sobre Apache que publicó el primero me inspiró a hacer lo que contaba sobre la &#8220;distro&#8221; de la espiral.</p>
<p>Partimos de la misma configuración, tenemos dos servidores, <strong>cluster01</strong> y <strong>cluster02</strong> con las IPs 192.168.2.98 y 192.168.2.99 y una IP flotante 192.168.2.100</p>
<p>Configuradas ambas máquinas, instalamos los paquetes necesarios:</p>
<pre># apt-get install apache2</pre>
<p>En nuestro caso, para la configuración de Apache editamos <em>/etc/apache2/ports.conf</em> y añadimos la IP flotante a la línea de </strong>NameVirtualHost</strong> así:</p>
<pre>NameVirtualHost 192.168.2.100:80</pre>
<p>Para que Apache no se levante al inicio ya que queremos que el que se encargue de esto es Heartbeat escribimos:</p>
<pre># update-rc.d apache2 remove</pre>
<p>Y detenemos el servicio:</p>
<pre># /etc/init.d/apache2 stop</pre>
<p>A continuación instalamos Heartbeat.</p>
<pre># apt-get install heartbeat</pre>
<p>Y configuramos, estos ficheros de configuración se encuentran todos en <em>/etc/ha.d/</em> y disponemos de plantillas para configurarlos en <em>/usr/share/doc/heartbeat/</em>. Podemos tomar ejemplo para configuraciones más específica.</p>
<p>Para el archivo <strong>ha.cf</strong> usamos la misma:</p>
<pre>logfile /var/log/cluster.log
logfacility local0
warntime 5
deadtime 30
initdead 120
keepalive 2
bcast eth0
udpport 694
auto_failback on
node cluster01
node cluster02
</pre>
<p>La explicación</p>
<ul>
<li><strong>logfile</strong> y <strong>logfacility</strong>: Fichero de log y nivel.</li>
<li><strong>warntime</strong>: Heartbeat avisará cuando un nodo falle tras 5 segundos.</li>
<li><strong>deadtime</strong>: Hearbeat confirmará que un nodo ha caído, 30 segundos.</li>
<li><strong>initdead</strong>: Tiempo máximo que Heartbeat esperará a que un nodo arranque, 60 segundos.</li>
<li><strong>keepalive</strong>: Especifica cada cuanto tiempo Heartbeat enviará paquetes para comprobar la disponibilidad de los nodos, 2 segundos.</li>
<li>Las dos últimas líneas son las listas de nodos que conforman el cluster.</li>
</ul>
<p>Para el fichero <strong>authkeys</strong> que es donde configuramos la comunicación entre los nodos del clúster, también para Debian podemos usar la original:</p>
<pre>
auth 2
2 sha1 clu$ter-4uth
</pre>
<p>Le asignamos los permisos para que sólo root tenga acceso.</p>
<pre># chmod 600 /etc/ha.d/authkeys</pre>
<p>El último fichero cambia en Debian y es el <strong>haresources</strong> que queda con este aspecto:</p>
<pre>cluster01 IPaddr2::192.168.2.100/24/eth0 apache2</pre>
<p>Cambia la forma de escribir la IP flotante que está de una forma más completa y el script de inicio de Apache que en Debian es apache2.</p>
<p>Seguimos la entrada y la propagación se hace ejecutando el siguiente comando:</p>
<pre># /usr/share/heartbeat/ha_propagate</pre>
<p>Levantamos el servicio.</p>
<pre>/etc/init.d/heartbeat start</pre>
<p>Ya está todo configurado, podemos probar a desactivar la interface de cluster01 y ver como al poco tiempo (el que hemos configurado) se levanta cluster02 para seguir sirviendo páginas.</p>
<p>La configuración entre CentOS y Debian es prácticamente la misma, pero tiene los suficientes detalles como para que los escriba aquí para no olvidar como se hace.</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.muspells.net%2Fblog%2F2011%2F04%2Falta-disponibilidad-con-apache2-y-heartbeat-en-debian-squeeze%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Alta Disponibilidad con Apache2 y Heartbeat en Debian Squeeze. via @nordri" data-url="http://www.muspells.net/blog/2011/04/alta-disponibilidad-con-apache2-y-heartbeat-en-debian-squeeze/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2011/04/alta-disponibilidad-con-apache2-y-heartbeat-en-debian-squeeze/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Algunas Fotos en el Despacho</title>
		<link>http://www.muspells.net/blog/2010/07/algunas-fotos-en-el-despacho/</link>
		<comments>http://www.muspells.net/blog/2010/07/algunas-fotos-en-el-despacho/#comments</comments>
		<pubDate>Mon, 12 Jul 2010 17:05:37 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[Es personal]]></category>
		<category><![CDATA[HPC]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[offtopic]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[desktop]]></category>
		<category><![CDATA[fotos]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[sysadmin]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=505</guid>
		<description><![CDATA[Mi buen amigo @gonzaloMMD, se fue de viaje a Paris y ha preparado una entrada con unas fotos chulísimas de la capital alemana francesa (&#8220;acias&#8221; wikipedia!) xDDD. Yo más humilde, posteo unas pocas &#8220;fotillos&#8221; del despacho. Estas dos corresponden a la migración que hicimos del cluster de OpenSUSE a CentOS. Se ven los 6 nodos [...]]]></description>
			<content:encoded><![CDATA[<p>Mi buen amigo <a href="http://twitter.com/gonzaloMMD">@gonzaloMMD</a>, se fue de <a href="http://gons.wordpress.com/">viaje a Paris</a> y ha preparado una entrada con unas fotos chulísimas de la capital <del datetime="2010-07-12T16:21:43+00:00">alemana</del> francesa (&#8220;acias&#8221; wikipedia!) xDDD. Yo más humilde, posteo unas pocas &#8220;fotillos&#8221; del despacho.</p>
<p>Estas dos corresponden a la migración que hicimos del cluster de OpenSUSE a CentOS. Se ven los 6 nodos esclavos, aunque la estructura está cambiando, y tendré que actualizar esta entrada.</p>
<p><div id="attachment_518" class="wp-caption aligncenter" style="width: 138px"><a href="http://www.muspells.net/blog/wp-content/uploads/2010/07/NodosCluster-Front.jpg"><img src="http://www.muspells.net/blog/wp-content/uploads/2010/07/NodosCluster-Front_th.jpg" alt="Nodos Cluster Front" title="Nodos Cluster Front" width="128" height="96" class="size-full wp-image-518" /></a><p class="wp-caption-text">Nodos Cluster Front</p></div><br />
<div id="attachment_517" class="wp-caption aligncenter" style="width: 138px"><a href="http://www.muspells.net/blog/wp-content/uploads/2010/07/NodosCluster-Back.jpg"><img src="http://www.muspells.net/blog/wp-content/uploads/2010/07/NodosCluster-Back_th.jpg" alt="Nodos Cluster Back" title="Nodos Cluster Back" width="128" height="96" class="size-full wp-image-517" /></a><p class="wp-caption-text">Nodos Cluster Back</p></div></p>
<p>Este será el nuevo master del cluster, el i7 con 16GB de RAM, con sus 5 discos duros.</p>
<p><div id="attachment_515" class="wp-caption aligncenter" style="width: 138px"><a href="http://www.muspells.net/blog/wp-content/uploads/2010/07/MasterCluster.jpg"><img src="http://www.muspells.net/blog/wp-content/uploads/2010/07/MasterCluster_th.jpg" alt="Master Cluster" title="Master Cluster" width="128" height="96" class="size-full wp-image-515" /></a><p class="wp-caption-text">Master Cluster</p></div><br />
<div id="attachment_514" class="wp-caption aligncenter" style="width: 138px"><a href="http://www.muspells.net/blog/wp-content/uploads/2010/07/DiscosMasterCluster.jpg"><img src="http://www.muspells.net/blog/wp-content/uploads/2010/07/DiscosMasterCluster_th.jpg" alt="Discos Master Cluster" title="Discos Master Cluster" width="128" height="96" class="size-full wp-image-514" /></a><p class="wp-caption-text">Discos Master Cluster</p></div></p>
<p>Y esta es mi mesa, como siempre, llena de papeles y chismes.</p>
<div id="attachment_516" class="wp-caption aligncenter" style="width: 138px"><a href="http://www.muspells.net/blog/wp-content/uploads/2010/07/MiMesa-2010-07-12.jpg"><img src="http://www.muspells.net/blog/wp-content/uploads/2010/07/MiMesa-2010-07-12_th.jpg" alt="Mi Mesa" title="Mi Mesa" width="128" height="96" class="size-full wp-image-516" /></a><p class="wp-caption-text">Autentica mesa sysadmin</p></div>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.muspells.net%2Fblog%2F2010%2F07%2Falgunas-fotos-en-el-despacho%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Algunas Fotos en el Despacho. via @nordri" data-url="http://www.muspells.net/blog/2010/07/algunas-fotos-en-el-despacho/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2010/07/algunas-fotos-en-el-despacho/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Compilación Paralela</title>
		<link>http://www.muspells.net/blog/2010/03/compilacion-paralela/</link>
		<comments>http://www.muspells.net/blog/2010/03/compilacion-paralela/#comments</comments>
		<pubDate>Tue, 23 Mar 2010 20:25:15 +0000</pubDate>
		<dc:creator>Fede Diaz</dc:creator>
				<category><![CDATA[HPC]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[compilacion]]></category>
		<category><![CDATA[mpi]]></category>
		<category><![CDATA[openmpi]]></category>

		<guid isPermaLink="false">http://www.muspells.net/blog/?p=435</guid>
		<description><![CDATA[He empezado a aprender como hacer compilación paralela para obtener más rendimiento en el clúster. Para ello me he metido con OpenMPI que es un proyecto abierto derivado de la estructura LAM/MPI mantenido por la comunidad. El primer paso es obtener el software de esta dirección y compilarlo: $ tar jxvf openmpi-1.4.1.tar.bz2 $ ./configure --prefix=/usr/local/openmpi [...]]]></description>
			<content:encoded><![CDATA[<p>He empezado a aprender como hacer compilación paralela para obtener más rendimiento en el clúster. Para ello me he metido con <a href="http://www.open-mpi.org">OpenMPI</a> que es un proyecto abierto derivado de la estructura <a href="http://www.lam-mpi.org/">LAM/MPI</a> mantenido por la comunidad.</p>
<p>El primer paso es obtener el software de esta <a href="http://www.open-mpi.org/software/ompi/v1.4/downloads/openmpi-1.4.1.tar.bz2">dirección</a> y compilarlo:</p>
<pre>$ tar jxvf openmpi-1.4.1.tar.bz2
$ ./configure --prefix=/usr/local/openmpi
# make all install</pre>
<p>Una vez compilado, debemos actualizar el enlazador dinámico para que nuestro software enlace correctamente con las librerías dinámicas de OpenMPI</p>
<pre># ldconfig /usr/local/openmpi/lib</pre>
<p>Con esto, le decimos al programa <em>ld</em> que busque en<em> /usr/local/openmpi/lib</em> las librerias que haces falta en tiempo de ejecución de nuestro programa.</p>
<p>A continuación, es obligatorio que todos los nodos del clúster tengan acceso a los ejecutables tanto de nuestro programa como de OpenMPI, por lo que vamos ha crear un par de comparticiones por NFS.</p>
<pre>/usr/local/openmpi   192.168.0.0/24(ro,root_squash)
/home/openmpi   192.168.0.0/24(rw,root_squash)</pre>
<p>Donde <em>/home/openmpi</em> es nuestro usuario de cluster, en su directorio <em>$HOME</em> estará el programa a ejecutar. Y la otra compartición contiene los ejecutables del compilador.</p>
<p>Vamos a lanzar el programa clásico <strong>HelloWorld</strong> en paralelo, para ello utilizamos el siguiente código.</p>
<pre>/* helloworld.c */
/* http://www.semicomplete.com/presentations/mpi/#slide_2 */
#include &lt;stdio.h&gt;
/* Esto es para añadir las funciones de OpenMPI */
#include "mpi.h"

int main(int argc, char **argv) {
int rank;
char host[150];
int namelen;

/* Inicializar MPI. Maneja la línea de comando especifica de mpich */
MPI_Init(&amp;argc, &amp;argv);

/* Devuelve el rango. Mi número de rango (de la instancia del programa) queda almacenado en la variable rank */
MPI_Comm_rank(MPI_COMM_WORLD, &amp;rank);

/* Vemos en qué maquina me ejecutando y lo guardamos en host */
MPI_Get_processor_name(host,&amp;namelen);

printf("Hello world (Rank: %d / Host: %s)\n", rank, host);
fflush(stdout);

/* Fin: Cerramos las conexiones con los demás nodos y liberamos la memora que el programa ha reservado,... */
MPI_Finalize();
return 0;</pre>
<p>Lo compilamos</p>
<pre>$ PATH=$PATH:/usr/local/openmpi/bin
$ mpicc helloworld.c -o helloworld</pre>
<p>El <em>PATH</em> podemos añadirlo a nuestro <em>~/.bashrc</em> para que esté siempre disponible. Ejecutamos.</p>
<pre>$ mpirun -np 5 --hostfile=hosts helloworld</pre>
<p>Donde</p>
<ol>
<li><strong>-np</strong> Es el número de procesos que vamos a lanzar.</li>
<li><strong>&#8211;hostfile</strong> Es el fichero que almacena los nombres de los hosts, cada nodo del cluster.</li>
</ol>
<p>La salida debe ser algo como esto</p>
<pre>Hello world (Rank: 0 / Host: master)
Hello world (Rank: 2 / Host: master)
Hello world (Rank: 4 / Host: master)
Hello world (Rank: 1 / Host: cluster01)
Hello world (Rank: 3 / Host: cluster01)</pre>
<p>Vemos que ha lanzado tres procesos en master y dos en cluster01.</p>
<p>De momento esto es lo poco que sé, pero sigo avanzando, el asunto de tener que resolver matrices de gran tamaño voy a necesitar escribir código para lanzar paralelizado.</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.muspells.net%2Fblog%2F2010%2F03%2Fcompilacion-paralela%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Compilación Paralela. via @nordri" data-url="http://www.muspells.net/blog/2010/03/compilacion-paralela/" 
						data-via=""  ></a> 
				</div></div>
		<div style="clear:both;"></div>]]></content:encoded>
			<wfw:commentRss>http://www.muspells.net/blog/2010/03/compilacion-paralela/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

