<?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>Mi espacio &#187; Escalabilidad y rendimiento</title>
	<atom:link href="http://www.manuelrecena.com/blog/archives/category/escalabilidad-rendimiento/feed" rel="self" type="application/rss+xml" />
	<link>http://www.manuelrecena.com/blog</link>
	<description>Donde escribo sobre cosas que forman parte de mi vida profesional</description>
	<lastBuildDate>Sun, 05 Feb 2012 21:20:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Apache Tomcat para entornos de producción (I)</title>
		<link>http://www.manuelrecena.com/blog/archives/1033</link>
		<comments>http://www.manuelrecena.com/blog/archives/1033#comments</comments>
		<pubDate>Tue, 19 Apr 2011 12:31:36 +0000</pubDate>
		<dc:creator>Manuel Jesús Recena Soto</dc:creator>
				<category><![CDATA[Escalabilidad y rendimiento]]></category>
		<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://www.manuelrecena.com/blog/?p=1033</guid>
		<description><![CDATA[Desde hace ya muchos años, Apache Tomcat forma parte de mi caja de herramientas. Supongo esto también le sucederá a otros muchos profesionales. Bien es cierto, que cada vez más comparte espacio con soluciones como Jetty o Glassfish, sin embargo, yo le tengo un respeto prácticamente infinito. Son muchos los entornos de producción a los [...]]]></description>
			<content:encoded><![CDATA[<p>Desde hace ya muchos años, Apache Tomcat forma parte de mi caja de herramientas. Supongo esto también le sucederá a otros muchos profesionales. Bien es cierto, que cada vez más comparte espacio con soluciones como Jetty o Glassfish, sin embargo, yo le tengo un respeto prácticamente infinito. Son muchos los entornos de producción a los que he tenido acceso y en los que Apache Tomcat era la opción para actuar como contenedor JSP/Servlet. Que no os extrañe si os digo que en la mayoría la instalación consistía en:</p>
<ol>
<li>Descargar el tar.gz</li>
<li>Descomprimirlo</li>
<li>Y lanzar $TOMCAT_HOME/bin/startup.sh</li>
</ol>
<p>Me gustaría compartir con vosotros cómo configuramos nosotros (<a title="Cuenta de klicap en twitter" href="http://twitter.com/klicap" target="_blank">@klicap</a>) Apache Tomcat con el objetivo de conocer vuestras impresiones y dejar unas notas para que no se olviden. Esta es la configuración que estamos usando en <a title="Información sobre Clinker" href="http://blog.klicap.es/archives/837" target="_blank">Clinker Virtual Appliance</a>. En las siguientes instrucciones se presupone que estamos usando un S.O. Linux y que la JVM está correctamente configurada.</p>
<ol>
<li>Descargar los <a title="Sitio web oficial para descargar Apache Tomcat" href="http://tomcat.apache.org/download-60.cgi" target="_blank">binarios</a> del sitio web oficial.</li>
<li>Descomprimir el tar.gz en /opt</li>
<li>Crear un enlace simbólico /opt/tomcat &gt; /opt/apache-tomcat-6.0.32</li>
<li>En $TOMCAT_HOME/bin encontraremos tomcat-native.tar.gz que corresponde con Apache Tomcat Native, una librería que mejora el rendimiento porque delega en <a title="Información sobre APR" href="http://tomcat.apache.org/tomcat-6.0-doc/apr.html" target="_blank">APR</a> ciertas funcionalidades que están implementadas de forma nativa.</li>
<li>Descomprimimos tomcat-native.tar.gz</li>
<li>Configuramos el proyecto y compilamos:
<pre>./configure \
--libdir=/usr/local/lib/tomcat-native-1.1.20 \
--with-java-home=/usr/local/java \
--with-apr=/usr/bin/apr-1-config</pre>
<pre>make &#038;&#038; make install</pre>
</li>
<li>Creamos un enlace simbólico /usr/local/lib/tomcat-native &gt; /usr/local/lib/tomcat-native-1.1.20</li>
<li>Configuramos la variable de entorno (p.e. en /etc/profile):
<pre>export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/tomcat-native</pre>
</li>
</ol>
<p>Cuando lancemos Apache Tomcat encontraremos en los logs el siguiente mensaje:</p>
<blockquote><p>19-abr-2011 13:09:45 org.apache.catalina.core.AprLifecycleListener init<br />
INFO: Cargada la biblioteca nativa APR de Apache Tomcat 1.1.20<br />
19-abr-2011 13:09:45 org.apache.catalina.core.AprLifecycleListener init<br />
INFO: Capacidades APR: IPv6 [true], enviar fichero [true], aceptar filtros [false], aleatorio [true].</p></blockquote>
<p>En una instalación por defecto hubiéramos encontrado un mensaje similar a este:</p>
<blockquote><p>org.apache.catalina.core.AprLifecycleListener init<br />
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path</p></blockquote>
<p>En la siguiente entrada veremos cómo configurar commons-daemon con Apache Tomcat.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.manuelrecena.com/blog/archives/1033/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mejorando la disponibilidad de nuestros entornos Java</title>
		<link>http://www.manuelrecena.com/blog/archives/129</link>
		<comments>http://www.manuelrecena.com/blog/archives/129#comments</comments>
		<pubDate>Tue, 22 Apr 2008 11:22:00 +0000</pubDate>
		<dc:creator>Manuel Jesús Recena Soto</dc:creator>
				<category><![CDATA[Escalabilidad y rendimiento]]></category>

		<guid isPermaLink="false">http://www.manuelrecena.com/wordpress/archives/129</guid>
		<description><![CDATA[Son muchos los entornos Java que están configurados con Apache web server actuando como front-end y Apache Tomcat como contenedor JSP/Servlet. Es lógico pensar que en estos entornos se van a encontrar desplegadas varias aplicaciones y por desgracia, no todas funcionan de igual forma en cuanto a estabilidad y robustez se refiere. En varias ocasiones [...]]]></description>
			<content:encoded><![CDATA[<p>Son muchos los entornos Java que están configurados con Apache web server actuando como front-end y Apache Tomcat como contenedor JSP/Servlet. Es lógico pensar que en estos entornos se van a encontrar desplegadas varias aplicaciones y por desgracia, no todas funcionan de igual forma en cuanto a estabilidad y robustez se refiere.  En varias ocasiones me he encontrado con administradores de sistemas que optan por programar tareas para reiniciar los servicios con cierta periodicidad y otros que optan por aislar las aplicaciones &#8220;problemáticas&#8221; en contenedores específicos. Así por lo menos evitan que las aplicaciones que funcionan correctamente no se vean perjudicadas por el resto.  Es evidente que siendo este el escenario la disponibilidad de nuestros servicios corre un grave peligro. En muy pocas ocaciones me he encontrado con que el servidor web o la base de datos hayan sido el origen del problema.</p>
<p>Teniendo en cuenta este escenario, creo que existen soluciones muy fáciles de implementar y con resultados muy óptimos. A continuación una ilustración para explicar la solución propuesta:</p>
<p><img src="http://www.manuelrecena.com/blog/uploads/images/high_avaibility_jee.png" border="0" alt="Ilustración sobre la solución propuesta" width="500" height="342" /></p>
<p>De la ilustración se deduce que la solución se centra en la disponibilidad del contenedor y/o servidor de aplicaciones JEE. De las tres capas, -creo- que es la que más problemas de disponibilidad presenta. Más adelante nos centraremos en el resto de capas. La idea básica de esta solución consiste en tener una instancia de nuestro contenedor y/o servidor de aplicaciones (y aplicaciones) replicado para respaldar al que está funcionando. Nuestro Apache webserver atenderá las peticiones y en función de la petición, estas se reenviarán a <strong>SERVER 2</strong>. Si por cualquier motivo, el <strong>SERVER 2</strong> dejase de funcionar, Apache webserver sabría que tiene que enviar esas mismas peticiones a <strong>SERVER 1</strong>.</p>
<p>¿Qué conseguimos con esta solución?</p>
<ol>
<li>Evitar prácticas que aislen las aplicaciones problemáticas.</li>
<li>Una solución no intrusiva porque no hemos tenido que tocar nada en nuestras aplicaciones, es decir, es una solución válida incluso para aplicaciones antiguas.</li>
<li>En entornos virtualizados resulta muy cómodo y fácil de mantener.</li>
<li>Si <strong>SERVER 1</strong> y <strong>SERVER 2</strong> comparten un sistema de ficheros, un más fácil.</li>
<li>Evitar prácticas que consistan en reiniciar los sistemas antes de que estos degraden completamente.</li>
<li>Si a esta solución le añadimos software como NAGIOS, los administradores de sistemas estarán informados de las caídas y podrán actuar en consecuencia.</li>
<li>Aumentar la disponibilidad de nuestro entorno.</li>
</ol>
<p>¿Qué no conseguimos con esta solución?</p>
<ol>
<li>Compartir las sesiones entre los servidores.</li>
<li>Compartir las conexiones de acceso a datos.</li>
<li>Alta disponibilidad del entorno completo.</li>
</ol>
<p>Para conseguir esto necesitamos el conector mod_jk desarrollado dentro del proyecto Apache Tomcat. Suponiendo que ya tenemos nuestro Apache webserver instalado y configurado, veamos qué tenemos que hacer para compilar mod_jk:</p>
<ol>
<li><span style="font-family: courier new,courier;"> wget <a title="Referencia a Apache Tomcat" href="# http://www.apache.org/dist/tomcat/tomcat-connectors/jk/source/jk-1.2.26/tomcat-connectors-1.2.26-src.tar.gz" target="_blank">http://www.apache.org/dist/tomcat&#8230;</a></span></li>
<li><span style="font-family: courier new,courier;">cd tomcat-connectors-1.2.26-src/native</span></li>
<li><span style="font-family: courier new,courier;">./configure &#8211;with-apxs=/opt/httpd-2.2.8/bin/apxs (directorio de ejemplo)</span></li>
<li><span style="font-family: courier new,courier;">make</span></li>
<li><span style="font-family: courier new,courier;">cp apache-2.0/.libs/mod_jk.so /opt/httpd-2.2.8/modules</span></li>
</ol>
<p>Ahora habilitamos el módulo en Apache webserver:</p>
<ol>
<li>Editamos el archivo: <span style="font-family: courier new,courier;">/opt/httpd-2.2.8/conf/httpd.conf</span></li>
<li>Añadimos las líneas:
<ol>
<li><span style="font-family: courier new,courier;">LoadModule jk_module modules/mod_jk.so</span></li>
<li><span style="font-family: courier new,courier;">Include conf/extra/mod_jk.conf<br />
</span></li>
</ol>
</li>
</ol>
<p>A continuación creamos los archivos de configuración para el conector:</p>
<ol>
<li>Creamos el archivo <span style="font-family: courier new,courier;">mod_jk.conf</span> en <span style="font-family: courier new,courier;">/opt/httpd-2.2.8/conf/extra</span></li>
<li>Creamos el archivo <span style="font-family: courier new,courier;">workers.properties</span> en <span style="font-family: courier new,courier;">/opt/httpd-2.2.8/conf/extra</span></li>
</ol>
<p>En el archivo <span style="font-family: courier new,courier;">mod_jk.conf</span> configuraremos esas reglas correspondientes a las peticiones que atenderá Apache webserver y las cuales definirán a nuestras aplicaciones desplegadas en Apache Tomcat. Un ejemplo de este archivo sería:</p>
<blockquote><p><span style="font-family: courier new,courier;">JkLogFile logs/mod_jk.log<br />
JkShmFile logs/mod_jk.shm<br />
JkLogLevel info<br />
JkWorkersFile conf/extra/workers.properties</span></p>
<p><span style="font-family: courier new,courier;"># Add the jkstatus mount point<br />
JkMount /jkmanager/* jkstatus</span></p>
<p><span style="font-family: courier new,courier;">JkMount /opina/* router</span></p></blockquote>
<p>Básicamente en este archivo se configura el archivo de log, el archivo para compartir información entre los conectores y las aplicaciones que queremos &#8220;conectar&#8221;. Concretamente <span style="font-family: courier new,courier;">jkmanager</span> nos permitirá monitorizar cómo funcionan los conectores.</p>
<p>Y la configuración para los conectores:</p>
<blockquote><p><span style="font-family: courier new,courier;"># The advanced router LB worker<br />
worker.list=router,jkstatus</span></p>
<p><span style="font-family: courier new,courier;"># Define a worker using ajp13<br />
worker.worker1.port=8009<br />
worker.worker1.host=192.168.0.3<br />
worker.worker1.type=ajp13<br />
worker.worker1.lbfactor=1<br />
# Define prefered failover node for worker1<br />
worker.worker1.redirect=worker2</span></p>
<p><span style="font-family: courier new,courier;"># Define another worker using ajp13<br />
worker.worker2.port=8009<br />
worker.worker2.host=192.168.0.4<br />
worker.worker2.type=ajp13<br />
worker.worker2.lbfactor=1<br />
# Disable worker2 for all requests except failover<br />
worker.worker2.activation=disabled</span></p>
<p><span style="font-family: courier new,courier;"># Define the LB worker<br />
worker.router.type=lb<br />
worker.router.balance_workers=worker1,worker2</span></p>
<p><span style="font-family: courier new,courier;"># Define a &#8216;jkstatus&#8217; worker using status<br />
worker.jkstatus.type=status</span></p></blockquote>
<p>Con esta configuración todas las peticiones se enviarán al conector worker1, y si algo falla, se enviarán al conector worker2.</p>
<p>Evidentemente en esta solución caben varias mejoras, pero antes de mejorar en esta parte, me centraré en mejorar la publicación de contenido estático. Quizás nuestro amigo Apache webserver tenga que convivir con Cherokee o Lighttpd.</p>
<p>Las sugerencias siempre son bienvenidas.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.manuelrecena.com/blog/archives/129/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache JMeter (screencast)</title>
		<link>http://www.manuelrecena.com/blog/archives/93</link>
		<comments>http://www.manuelrecena.com/blog/archives/93#comments</comments>
		<pubDate>Fri, 17 Aug 2007 21:15:35 +0000</pubDate>
		<dc:creator>Manuel Jesús Recena Soto</dc:creator>
				<category><![CDATA[Escalabilidad y rendimiento]]></category>
		<category><![CDATA[Herramientas]]></category>

		<guid isPermaLink="false">http://www.manuelrecena.com/wordpress/archives/93</guid>
		<description><![CDATA[He preparado un screencast con el ejemplo de uso que exponía en el anterior post sobre Apache JMeter. La verdad es que el screencast no está demasiado trabajado, pero la experiencia preparando el screencast ha sido un poco frustante. Después de tener preparada la secuencia, a la hora de renderizarla, se me ha quedado colgado [...]]]></description>
			<content:encoded><![CDATA[<p>He preparado un <a title="Screencast con un pequeño ejemplo de Apache JMeter" href="/misc/jmeter/jmeter_opina.html" target="_blank">screencast</a> con el ejemplo de uso que exponía en el <a title="Referencia a un post anterior" href="/blog/archives/82-Apache-JMeter.html">anterior post</a> sobre Apache JMeter. La verdad es que el screencast no está demasiado trabajado, pero la experiencia preparando el screencast ha sido un poco frustante. Después de tener preparada la secuencia, a la hora de renderizarla, se me ha quedado colgado el equipo en varias ocasiones y he tenido que repetir todo el proceso (con lo que ello implica). Quiero recordar que <a title="Sitio web de la herramienta Wink" href="http://www.debugmode.com/wink/" target="_blank">Wink</a>, la herramienta que he usado para crear el screencast, funcionaba mejor en Microsoft Windows XP. Mi experiencia con Microsoft Vista no está siendo muy satisfactoria.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.manuelrecena.com/blog/archives/93/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

