msgbartop
Tips de administración de servidores y herramientas Web
msgbarbottom

5 cosas que perjudican la Escalabilidad

septiembre 29, 2011 Publicado en Admin-tips, Escalabilidad, InfraEstructura con 23 Comentarios



Mapeadores de Objetos Relacionales (ORM)

Los ORM permiten a los desarrolladores ser más productivos, evitando las dificultades de la interacción con la Base de Datos, y permitiendoles concentrarse en las funcionalidades y las caracteristicas de las aplicaciones.

Desde el lado de Rendimiento la imagen es bien diferente, al permitir que un ORM sea quien construya las consultas que se ejecutan, tendremos consultas bien complejas que la Base de Datos no podra optimizar de la mejor manera.

Procesos sincronos, seriales, acoplados o bloqueantes

Se deben evitar al maximo posible los procesos que generan bloqueos a nivel de Base de Datos, si definitivamente lo necesitamos lo mejor es usar tablas de tipo InnoDB, las cuales generan bloqueos a nivel de registro, y no bloqueos a nivel de tabla como trabaja MyIsam.

Evite procesos sincronos o semi-sincronos, los cuales esperan la respuesta de otro servicio para continuar y detienen la ejecución de codigo. En una aplicacion altamente transaccional estas esperas pueden resultar en miles de sesiones simultaneas o concurrentes.

Unica copia de la Base de Datos

Sin replicación, dependemos de una unica Base de Datos. Con esta configuración limitamos a nuestros WebServers a usar una unica Base de Datos, lo cual obviamente resultara en un cuello de Botella para nuestra aplicación.

Lo mejor es tener varias Bases de Datos, y dar la opcion a nuestros WebServers de utilizar la que ellos consideren adecuada, o mejor la que nuestro algoritmo dictamina debemos usar.

No tener Metricas

Sin metricas no podremos tener un panorama de lo que sucede en nuestra infraestructura cada vez que tenemos una nueva funcionalidad al aire, o cuando estamos teniendo problemas en nuestra aplicacion, sin este tipo de informacion nuestro equipo de Ingenieros no podran estar sensibilizados sobre lo que esto supone y sera mas dificil que trabajemos en pos de mejorar.

Existen muchas soluciones que trabajan con SNMP y que no son invasivas, para citar algunas Cacti, Munin, OpenNMS, Ganglia y Zabbix.

Las metricas deben incluir metricas de negocio como Cantidad de usuarios registrados, Numero de comentarios por hora, Numero de articulos vendidos; asi como las metricas tecnicas de infraestructura como Espacio en disco, Memoria disponible, Numero de procesos ejecutandose, consultas por segundo.

Banderas de funcionalidades

En las aplicaciones que son construidas sin banderas de funcionalidades es mucho mas dificil degradar correctamente.

Cuando un sitio esta teniendo un pico de trafico o de request y no es posible escalar o expander la capacidad, las banderas permitiran bajar funcionalidades mientras la carga baja en los servidores sin tener que bajar el sitio por completo. Esto le dara tiempo para poder realizar los ajustes necesarios.

Sin estas recomendaciones limitara la Escalabilidad y la Disponibilidad de las aplicaciones.

Tags: , , , , , , , ,

Nginx Virtual Hosts – Multiples sitios

diciembre 2, 2010 Publicado en Configuración, Escalabilidad, InfraEstructura con 2 Comentarios


Nginx - web server y reverse proxy

En Apache es posible hacer que una unica instancia de la aplicación sirva, aloje, o responda por varios sitios web gracias a la directiva VirtualHost, en nginx es tambien posible hacer esto gracias a la directiva Server.  En una entrada anterior, Instalación de nginx como servidor estático, les hable sobre el servidor estático nginx y como se instalaba,  a continuación voy a mostrarles como configurarlo para que aloje varios sitios web a la vez de una manera ordenada al mejor estilo de apache.

Lo primero que debemos hacer es crear la carpeta donde almacenaramos los archivos de configuración para cada uno de nuestros sitios:

$ mkdir /etc/nginx/conf.d

creamos el archivo de configuración para nuestro primer sitio

$ vi /etc/nginx/conf.d/sitio1.conf

y lo editamos

server {
	listen       192.168.1.1:80;
	server_name  www.dominio1.com;
 
	access_log  /var/log/dominio1/access.log  main;
	error_log /var/log/dominio1/error.log warn;
 
	#SECCION PRINCIPAL
	location / {
		root /path/to/document/root/domain1;
		index index.html index.htm;
	}
	error_page 404 /error.html;
}

creamos el archivo de configuración para nuestro segundo2sitio

$ vi /etc/nginx/conf.d/sitio2.conf

y lo editamos

server {
	listen 192.168.1.1:80;
	server_name www.dominio2.com;
 
	access_log /var/log/dominio2/access.log main;
	error_log /var/log/dominio2/error.log warn;
 
	#SECCION PRINCIPAL
	location / {
		root /path/to/document/root/domain2;
		index index.html index.htm;
	}
	error_page 404 /error.html;
}

En los archivos de configuración de los sitios la directiva Server es quien nos permite definir los diferentes sitios que queremos alojar en nginx, y el serverName es quien permitira distinguir a nginx a cual sitio el usuario quiere ingresar.

Ahora modificamos el archivo principal de configuración de nginx para indicarle donde debe buscar los archivos .conf que acabamos de crear, asi deberia verse el archivo principal

user nginxuser nginxgroup;
worker_processes 4;
worker_rlimit_nofile 10240;
 
events {
	worker_connections 2048;
}
 
http {
	include mime.types;
	default_type application/octet-stream;
	server_name_in_redirect off;
	server_tokens off;
	include /etc/nginx/conf.d/*.conf;
}

Ahora lo unico que necesitamos es crear un archivo index dentro de cada una de las carpetas de los dos sitios, reiniciar el servidor nginx y acceder por browser a nuestros dos sitios según lo definido en la directiva ServerName, si son sitios locales necesitaremos modificar nuestro archivos hosts

Tags: , , , , , , ,

Bug Php ZendFrameWork – Memcached

septiembre 30, 2010 Publicado en Admin-tips, Escalabilidad, InfraEstructura con 39 Comentarios


Tengo varias aplicaciones que hacen uso del aplicativo memcached y las cuales se estaban comportando de manera extraña, donde al hacer una modificación de información e invalidar la llave de memcached, la información parecia no ser actualizada.

Lo primero que hice fue aislar el aplicativo para que solo utilizara un servidor de BackEnd, y que este a su vez utilizara unicamente un servidor de Memcached, para poder monitorear de manera controlada el comportamiento de la aplicación.

Una vez aislada la aplicación, ingrese mensajes de debug en el error_log del apache, donde imprimia en la primer linea la operación que estaba realizando, en la segunda linea el valor devuelto por el servidor de memcached y por ultimo el MD5 del key que se almacena en memcached, este era el resultado:

[Thu Sep 30 11:25:09 2010] [error] [client X.X.X.X] REMOVE CACHE, referer: http://myhost.com/somepath/to/my/app
[Thu Sep 30 11:25:09 2010] [error] [client X.X.X.X] 0, referer: http://myhost.com/somepath/to/my/app
[Thu Sep 30 11:25:09 2010] [error] [client X.X.X.X] e81afd654486c19cb137475a687c7f5e

Despues de ver esto se puede evidenciar que el valor devuelto por el aplicativo era cero (0) o false, lo cual indicaba que no estaba realizando la operación de borrado de la información.

Para verificar la información en el servidor de memcached, me conecte por consola y solicite el valor del key antes y despues de modificar un dato en la aplicación web, evidenciando que el dato permanecia intacto en memcached y no era actualizado, por lo tanto el efecto en la aplicación web era que no se estaba actualizando la información, aun cuando en la BD estaba de manera correcta. Para verificar por consola en memcached nos debemos conectar por telnet al puerto definido en la instalación:

[user@webserver ~]$ telnet 192.168.1.XXX 22522
Trying 192.168.1.XXX…
Connected to 192.168.1.XXX (192.168.1.XXX).
Escape character is ‘^]’.
get e81afd654486c19cb137475a687c7f5e
VALUE e81afd654486c19cb137475a687c7f5e 1 49
a:3:{i:0;s:5:”i:11;”;i:1;i:1285880685;i:2;i:300;}
END

Al ver este comportamiento investigue primero en el framework de Zend, en la libreria para trabajar con Memcache, en la funcion “remove” que era la que estaba fallando, alli pude ver que ZendFramework lo que realiza es un llamado a la función “delete” de la clase memcache de PHP.

Investigando en el sitio web de php, http://www.php.net/manual/es/memcache.delete.php, encontre que se trata de un Bug que se presenta en esta función donde recibe un segundo parametro “Opcional” especificando el tiempo en el cual se debe borrar el key, al parecer no resulto ser tan “Opcional” y para que funcione debe especificarse siempre.

Por tal motivo, tuve que editar el archivo de ZendFramework, ZendFramework-1.7.8/library/Zend/Cache/Backend/Memcached.php

ANTES

public function remove($id)
{
return $this->_memcache->delete($id);
}

DESPUES

public function remove($id)
{
return $this->_memcache->delete($id, 0);
}

adicionando ese segundo paramétro en cero (0), se soluciona el inconveniente y vuelve a trabajar de manera adecuada el servidor de memcached.

NOTA: Esto sucede con ZendFramework inferior a la versión 1.10.X + pecl-memcache 3.0.4 + memcached 1.4.4

Tags: , , ,

Instalación de Nginx como servidor estático

septiembre 27, 2010 Publicado en Admin-tips, Configuración, Escalabilidad, InfraEstructura con 31 Comentarios


En una entrada anterior hablamos sobre los origines y las bondades que tiene el servidor http Nginx, en esta ocasión vamos a instalarlo y a realizar una configuración basica del mismo.

Lo primero que debemos hacer es descargar la ultima versión del servidor Nginx aqui, y la ultima version de pcre(Perl Compatible Regular Expressions) aqui. Para este tutorial vamos a trabajar con las versiónes nginx-0.8.51.tar.gz y pcre-8.10.tar.gz. Adicionalmente vamos a instalar un modulo para nginx que nos permite manejar las cabeceras eTag, desarrollado por kkung, el cual se puede descargar aqui.

Instalando PCRE

Descomprimimos el paquete pcre-8.10.tar.gz e ingresamos a la carpeta generada, ejecutamos los comandos configure, make y make install

tar -zxvf pcre-8.10.tar.gz
cd pcre-8.10
./configure
make
make install

Si todo sale bien, ya tendremos instalado el paquete pcre en  nuestro sistema y continuaremos instalando el servidor Nginx.

Instalando Nginx

Lo primero que debemos hacer es descomprimir el modulo de eTags para archivos estaticos y renombrar la carpeta por facilidad, simplemente con:

tar -zxvf kkung-nginx-static-etags-s20090317-3-gce0fdd4.tar.gz
mv kkung-nginx-static-etags-s20090317-3-gce0fdd4 nginx-static-etags

Descomprimimos el paquete nginx-0.8.51.tar.gz e ingresamos a la carpeta generada. Ejecutamos el comando configure incluyendo el paquete que acabamos de descomprimir, asi como la opción que nos permite tener estadisticas del servidor (server-status en apache), seguido de make y make install

tar -zxvf nginx-0.8.51.tar.gz
cd nginx-0.8.51
./configure –user=userowner –group=groupowner –with-http_stub_status_module –add-module=/instaladores/nginx/static-etags
make
make install

Nota: En caso en que al ejeuctar el comando “make” opbtengamos el siguiente error, lo unico que debemos hacer es entrar al archivo /instaladores/nginx-static-etags/ngx_http_static_etags_module.c y generar una linea vacia al final.

/instaladores/nginx-static-etags/ngx_http_static_etags_module.c:168:2: no newline at end of file
make[1]: *** [objs/addon/nginx-static-etags/ngx_http_static_etags_module.o] Error 1
make[1]: Leaving directory `/instaladores/nginx-0.8.51′
make: *** [build] Error 2

Hasta aqui ya tenemos instalado nuestro servidor nginx para HTTP el cual se encuentra en /usr/local/nginx, ahora vamos a realizar unas tareas administrativas para que sea mas sencillo configurar y trabajar con nginx.

Primero que todo vamos a configurar el sistema para que podamos acceder a la configuración del servidor nginx en /etc/nginx, para esto necesitamos crear dos links simbólicos de la siguiente manera:

ln -s /usr/local/nginx/conf/ /etc/nginx
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx

lo segundo, es que vamos a crear un script por medio del cual podemos subir y bajar el servidor nginx como cualquier otro servicio de linux, y lo alojaremos en /etc/init.d/, aca les dejo el script para que los descarguen nginx script inicio

Por último modificaremos el archivo de configuración para colocar un sitio de ejemplo, para esto debemos modificar el archivo /etc/nginx/nginx.conf para que quede de la siguiente manera:

user  userowner groupowner;
worker_processes  1;

events {
worker_connections  512;
}

http {

include       mime.types;
default_type  application/octet-stream;

log_format  main  ‘$remote_addr – $host $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” “$http_user_agent” “$gzip_ratio” “$http_x_forwarded_for” “$upstream_status”‘;
server {
listen       80;
server_name  test.local;

access_log  /var/log/access.log  main;
# [ debug | info | notice | warn | error | crit ]
error_log   /var/log/error.log  debug;

etags on;
etag_hash on;
etag_hash_method md5;

#SECCION PRINCIPAL
location / {
root   /var/www/;
index  index.html index.htm;
}

#####NGINGX STATUS
location /nginx_status {
stub_status on;
access_log   off;
allow all;
}
error_page   404  /error.html;
}
}

Una vez creado el archivo de configuración de nuestro sitio de prueba, subimos el servicio y listo, al acceder por un navegador podremos ver nuestro sitio funcionando.

/etc/init.d/nginx start

En una próxima entrada estare hablando de configuraciones y optimizaciones especificas para este servidor.

Tags: , , , , , ,

Los 4 secretos de escalabilidad en Facebook

junio 24, 2010 Publicado en Escalabilidad, InfraEstructura con 55 Comentarios


Aditya Agarwal, Director de Ingenieía de Facebook, dio una excelente conferencia acerca del escalamiento en Facebook que cubrio su arquitectura, pero la charla realmente fue más sobre como escalar una organizacion preservando lo mejor de su cultura. La clave de la conferencia es:

You can get the code right, you can get the products right, but you need to get the culture right first. If you don’t get the culture right then your company won’t scale.

Puedes tener el codigo bien, puedes tener los productos bien, pero necesitas tener bien la cultura primero. Si no tienes bien la cultura entonces la compañia no podrá escalar

Esto nos lleva a los 4 secretos de escalabilidad en Facebook:

  1. Escalamiento necesita Iteración
  2. No sobredimensione
  3. Escoja la mejor herramienta, pero tenga en cuenta que traerá consigo otras consideraciones
  4. Ajuste la cultura. Muevase rápido – rompa paradigmas. Alto Impacto – equipos pequeños. Sea valiente – innove.

Estas son algunas consideraciones antes de hablar sobre cada uno de los cuatro secretos en Facebook:

Facebook es muy grande

400 millones de usuarios actuvos; los usuarios utilizan facebook 20 minutos al dia en promedio; 5 billones de piezas de contenido (actualizaciones de estado, comentarios, gustos, carga de fotos, carga de videos, mensajes de chat, mensajes de correo, eventos, paginas de fans, conexiones de amigos) son compartidas en facebook cada semana; 3 billones de fotos cargadas cada mes; 250 aplicaciones que tienen mas de 1 millon de usuarios al mes; 80.000 conexiones de aplicacion, 500.000 aplicaciones; 2 millones de desarrolladores; 150 millones de operaciones por segundo en memcache; miles de servidores de memcache con decenas de Terabytes en memoria.

Facebook es dificil de escalar

Cada tipo de contenido tiene su propio patrón de acceso lo cual hace dificil el escalamiento. Todos usan Facebook de una manera diferente. Cada experiencia de usuario es unica. La mayoria de sitios web escalan de manera horizontal, porque su data puede ser particionada. En Facebook los usuarios no pueden ser particionados porque pueden unirse a cualquier red, Facebook es una red global que trata de cautivar a todo el mundo, permite a cualquiera ser amigo de cualquiera, y puede representar cualquier relación entre usuarios. cada usuario nuevo puede acceder los datos de cualquier otro usuario por lo tanto no se puede particionar geograficamente o por otra tipo de criterio. En promedio, cada usuario de Facebook tiene 130 amigos.

La arquitectura tiene 4 componentes principales

  • Balanceador de Carga
  • Servidores Web (PHP)
  • Servicios (Buscador, publicidad, memcache,etc)
  • Bases de Datos

Los 4 secretos de escalabilidad en Facebook

1. Escalamiento necesita Iteración. Las soluciones por lo general funcionan al principio, pero deben ser modificadas a medida que pasa el tiempo. Lo que funciona en el primer año, podria no funcionar despues. PHP, por ejemplo, es simple usarlo al principio, pero no es una buena elección cuando se tienen miles de webservers.

Otro ejemplo son las fotos, actualmente sirven 1.2 millones de fotos por segundo. La primera versión se creo de la manera facil, sin preocuparse ucho por como escalaba, simplemente enfocandose en que funcionara bien. El cargador almacenaba el archivo en un NFS y la meta-data en MySql, funciono bien los 3 primeros meses y causo muchas noches sin poder dormir, aun lo hace. El Time to market, o tiempo para salir al mercado fue la ventaja más competitiva que se tenia, tener la funcionalidad era más importante que si esta escalaba bien o no.

La segunda fase fue la optimización, se evidencio que las imagenes pequeñas son mas accesadas por lo cual se empezaron a almacenar en cache, además empezaron a usar un CDN, el servicio NFS no fue diseñado para almacenar 80 billones de pequeños archivos, asi que toda la meta-data no se ajustaba a la memoria, por lo cual eran necesarios 2 o 3 IOs a disco, lo cual era lento.

La tercera fase es un sistema que crea un archivo que es un BLOB almacenado en el sistema de archivos. Las imagenes son almacenadas en un BLOB y se conoce el offset de la foto en el BLOB para su recuperacion, esto se traduce en 1 IO por cada foto.

2. No sobredimensione. Unicamente utilice lo necesario a medida que va escalando. Descubra donde debe iterar en una solución, optimice o construya la solución usted mismo. Ellos dedicaron mucho tiempo tratando de optimizar PHP, terminaron escribiendo HipHop, un transformador de código que convierte PHP en C++, lo cual genero una cantidad masiva de ahorro en CPU y memoria. Esto no debe ser realizado en el dia 1, pero deberia, enfoquese primero en el producto antes de escribir un lengueaje nuevo por completo.

3. Escoja la mejor herramienta, pero tenga en cuenta que traerá consigo otras consideraciones. Si usted realmente necesita usar Python adelante, pero tenga en cuenta que tendrá su costo, usualmente en instalación, monitoreo, operación. Si usted decide usar una arquitectura basada en servicios, tendrá que construir la mayoria del backend usted mismo y eso toma tiempo, con LAMP por ejemplo tiene todo esto gratis. A medida que incursiona en el alcance por servicios, tendrá que reinventar la rueda.

4. Ajuste la cultura. Muevase rapido – rompa paradigmas. Alto Impacto – equipos pequeños. Sea valiente – innove. Construya un ambiente interno que promueva la construcción correcta de las funcionalidades y despues se optimicen segun sea necesario, sin preocuparse por la innovación, sin preocuparse por romper paradigmas, pensando en grande, pensando en que será lo siguiente en construir despues de este primer paso. Usted puede tener el codigo correcto, los productos correctos, pero si la cultura no es la apropiada no podrá escalar de manera eficiente.

  • Muevase rápido. Sea el primero en el mercado, esta bien si rompe paradigmas. Por ejemplo, Facebook corre en una capa web compuesta en su totalidad por HipHop, el cual fue desarrollado por 3 personas. Muy arriesgado, esto llevo a que el sitio se cayera regularmente (Sin memoria, cilcos infinitos), pero al final la recompensa es que encontraron como hacer que funcionará. La alternativa era que se realizaran pruebas durante 3 meses, lo cual retrasaba todo el desarrollo. Este es un ejemplo puntual, pero lo más importante es la cultura, que la gente crea que lo más importante es que tan rápido se pueden mover en el mercado.
  • Alto Impacto. Los equipos pequeños pueden hacer grandes cosas. Buscador, fotos, chat, HipHop, fueron desarrollados por pequeños equipos. Arme los equipos con la gente adecuada, empoderelos y dejelos trabajar.
  • Sea Valiente. No le tema al fracaso, esta bien intentar cosas nuevas y fallar, puede ser descabellado decir “Vamos a hacer una nueva JVM”, pero la recompensa puede ser grandiosa cuando funciona.

En Facebook no hay dueños del producto, todos son dueños del producto. Dele a la gente apropiación de lo que hacen, si solo una persona obtiene el crédito, entonces nadie contribuira para llevar el producto al siguiente nivel. Las ideas vienen internamente de los usuarios y las personas, si la responsabilidad no esta distribuida y solo un número de personas siente que son parte del producto, entonces solo ellos serán suceptibles de ser motivados. Moverse rápido no es solo un deseable, las compañias deben encontrar maneras para que la gente sienta que es una realidad.

A continuación les dejo el link donde pueden ver el video completo de la conferencia :

http://www.infoq.com/presentations/Scale-at-Facebook

Tags: , , , , , , , , , , , , , , , , ,