Archivo

Posts Tagged ‘menéame’

Técnicas y trucos para la versión móvil “responsive” del Menéame

noviembre 18, 2013 19 comentarios

No sé si habréis notado, pero si accedéis a Menéame desde un móvil o tableta, se carga muy rápido y están disponibles prácticamente todas las funcionalidades de la versión “normal” de la web. Aunque en realidad no se tratan de dos versiones diferentes, es la misma pero con cambios muy pequeños en la lógica del servidor, y muy poco de Javascript.

El 30% de los accesos a Menéame son desde móviles, antes teníamos una versión más reducida (sigue disponible en m.meneame.net), pero recibíamos quejas por ser muy limitado en cuanto a funcionalidades. Por otro lado, era demasiado trabajo mantener dos versiones diferentes.

También queríamos adaptar la web para los monitores Retina y de alta definición que tienen la mayoría de teléfonos y tabletas de gama media y alta (su densidad de pixels por pulgada es mayor -hasta dobla- a los típicos 96 px/pulgada de los monitores tradicionales), para ello hay que detectarlos y servir en estos casos una imagen del doble de resolución.

Así, hace unas semanas nos pusimos a tope para lograr una única versión integrada, con pocas diferencias en la lógica del backend, y casi ninguna modificación hecha con Javascript en el lado cliente. Aunque el PageSpeed no es una medida cualitativa absoluta, sí que da bastante idea de velocidad y ligereza:

Image

Como se puede deducir, las mejoras de velocidad de carga para móviles también afectó positivamente a la versión normal del web. A continuación describiré cuáles fueron los trucos y técnicas más importantes.

Leer más…

“Particionado funcional” económico en Amazon RDS… y cachea todo ¡estúpido!

marzo 17, 2013 6 comentarios

El miércoles pasado di una charla de cómo tenemos Menéame en Amazon AWS. Iba a explicar, al final de la charla, un truco de “particionado” [ver nota al final] económico, pero que no pudo ser: me tocó vivir en directo una saturación de la base de datos, producida por el nombramiento del nuevo Papa. Ahora explico cuál es ese “truco” de “particionado” económico y sencillo que sirve para ahorrar costes en RDS, y luego qué pasó y cómo solucioné la saturación de una de las bases de datos (de allí la frase “cachea todo ¡estúpido!”, el estúpido soy yo ;) ).

La base de datos principal de Menéame está en MySQL sobre Amazon RDS, con Multi AZ, lo que significa que tenemos failback y failover over automático y desantendido si el master falla. Da mucha comodidad, pero también tiene su coste: se paga el doble (el tamaño que tenemos es el large).

Leer más…

Seis años de Menéame

diciembre 7, 2011 68 comentarios

En 3 horas se cumplirán 6 años de Menéame (el primer anuncio público, en la lista de Bulma). Estoy muy cansado para escribir mucho más, pero en mi desvelo de la noche pasada conté algunas anécdotas por Twitter:

  1. En 27 horas Menéame cumple 6 años desde que salió al aire. Incosciencia de juventud ;)
  2. Cuando comenzamos Menéame pensé que sabía bastante de bases de datos. Hoy sé que no tenía ni puta idea, y todavía me falta.
  3. Cuando comenzamos Menéame pensé que luego de un par de meses de estabilización sería relajado, qué iluso.
  4. Queda poco código de hace 6 años, pero cuando lo veo me quiero dar hostias, por capullo.
  5. Me llevo bien con el PHP, HTML, Python, Javascript, SQL y Perl de Menéame. Pero el CSS me sigue frustrando, mucho.
  6. Hace 6 años pensaba que el Javascript era una chapuza de lenguaje, hoy sé que es muy bueno.
  7. En 6 años recibimos miles de críticas, sólo un premio: PC Actual al mejor proyecto 2.0, en 2008. Gracias ;-)
  8. Lo peor del desarrollo de Menéame fue dar soporte a IE6. Además ni tenía un Windows en casa, era a ojo, y pidiendo que otros prueben
  9. ¿Qué técnica nos ahorró miles de líneas de código y tiempo? Las expresiones regulares, imprescindibles para desarrollo web.
  10. Lo peor de Menéame, las llamadas telefónicas con amenazas, emails con amenazas de muerte, y los pesados de burofaxes de abogados ;-)
  11. Al principio me angustiaban los burofaxes y cartas certificadas, hoy ya nos descojonamos.
  12. Lo mejor de Menéame, las quedadas con mucha bebida por toda España (y hasta una en Argentina, y una boda). Habrá que recuperarlas.
  13. También hubo una quedada en Amsterdam, pero ni @benjami ni yo pudimos ir, creo.
  14. Un sábado el CEO de Digg y K. Rose nos piden reunión en Nueva York el martes, dijimos podríamos el miércoles, ellos no. Nunca se hizo.

Una de las cosas más importantes es la cantidad de lo que aprendí en programación, bases de datos, administración de sistemas y desarrollo de proyecto webs. Estoy escribiendo un libro para escribir para contarlo, especialmente orientado a programadores sin mucha experiencia en desarrollo para web (en realidad llevo muchos meses dándole vueltas, pero el índice de capítulos y temas -lo más duro de hacer- va convergiendo). Me voy a centrar en las técnicas fundamentales que se deben dominar en este tipo de proyecto. Desde mi humilde y honesta opinión, por supuesto.

Categorías:menéame, personal Etiquetas: ,

Diseñar y administrar un sistema requiere mucho de sentido común, aunque no lo creas

agosto 12, 2011 46 comentarios

En mi apunte sobre los que nos pasó con Amazon AWS dejaron todo tipo de comentarios, la mayoría razonable, pero otros simplemente comentan de oídas, sin conocer las características, precios, limitaciones de la arquitectura de AWS… e incluso temas básicos de costes. El siguiente comentario es un estereotipo del que repite blablás con mucha autoridad sin conocer a fondo el problema de lo que ocurrió, por lo que aprovecharé para contestar:

Leer más…

Categorías:desarrollo, menéame Etiquetas: , , ,

La crisis con Amazon AWS

agosto 10, 2011 88 comentarios

El viernes 5 de agosto  me voy con toda la familia a un pueblo de Extremadura cerca de la frontera con Portugal (Valencia de Alcántara) a visitar a unos amigos. Regresábamos el martes 9 a la tarde, ¿qué podía pasar en Menéame que no se pudiese solucionar con una navegador y la consola web de AWS si nunca habíamos tenido problemas graves? Si necesitaba algo más, podía instalar las herramientas de AWS en otro ordenador y solucionarlo en pocos minutos. Así que por primera vez viajo sin mi portátil, sólo mi tablet Android con conexión 3G Vodafone (además de mi teléfono también con 3G).

Pues ocurrió el desastre en Amazon, les falló todo lo que podía fallar, todos nuestros planes de contingencia no podía aplicarse (salvo el “rehacer desde cero” con los bakups) y yo sin mi portátil y con el 3G completamente inestable, prácticamente como si no tuviese conexión. Si no hubiese sido así Menéame no habría estado “off line” tanto tiempo, quizás sólo unas pocas horas. Fue una pesadilla.

Amazon tuvo varios fallos: primero el corte completo de la conectividad a todas las instancias, luego la desincronización del API de gestión, luego los EBS que quedaron totalmente inaccesibles y bloqueando la gestión de las instancias que los usaban, y para rematar un fallo en el software de creación de los “snapshots” (backups por bloques en S3) que borraba datos de algunos bloques (lo descubrieron durante la crisis, y nos afectó a nosotros).

Nota: es un relato rápido, ya corregiré erratas, ahora me voy a duchar, que la última vez fue en Valencia de Alcántara ;)

Leer más…

Categorías:personal Etiquetas: , , ,

Haanga: plantillas “Django” para PHP, über eficiente

agosto 11, 2010 15 comentarios

A mediados de mayo fui a Japón, la empresa de internet más grande de ese país estaba interesado en montar un Menéame en japonés. En junio las conversaciones estaban más o menos avanzadas y tenía la sensación que algo iba a salir. Sabía que si íbamos a mantener la versión sincronizada con la nuestra, íbamos a tener complicaciones. Así que empecé a pensar seriamente en que debíamos desarrollar o migrar a un sistema de plantillas.

Cuando empecé a desarrollar Menéame en noviembre de 2005 la única alternativa madura que había era Smarty. No me gustó nada, su lenguaje de macros era bastante complicado, además era muy ineficiente. Así, decidí hacerlo sólo en PHP y separar la generación de código en funciones específicas, de forma muy similar a como hace o hacía WordPress.

Mientras no teníamos que responsabilizarnos nosotros de mantener versiones sincronizadas iba muy bien. Como estaba separado por “módulos de interfaz” (cabecera, cajas, pie de página) y orientado a objetos (cada clase como Link, Comment, Post tiene su método print_summary() ) los cambios lo hacíamos rápido y sin complicaciones. Pero ya era hora de mejorarlo y modernizarlo.

Hace meses empecé a mirar si podía reusar el sistema de plantillas de Synfony, CodeIgniter, H2O. El que más se acercaba era H2O, pero no terminaba de convencerme, le faltaban características que necesitamos para Menéame,  su rendimiento tampoco es tan bueno.

Primero pensé que sería mejor hacerlo con el API C de PHP, y así en junio tiré un globo sonda a César Rodas, un chaval de Asunción (Paraguay) que es un puto crack de PHP (desaprovechado, y se dedica a empezar decenas de proyectos al mismo tiempo :-) ).

El globo sonda dio resultado, a los pocos días me dijo que lo estudiaría. Me propuso la alternativa, interpretar las plantillas con PHP, pero como resultado se generaría una función PHP que además se cachearía por el xcache (que es el que usamos en los servidores www de MnM) por lo que sería muy eficiente.

César lo siguió desarrollando, a finales de julio ya tenía una versión bastante madura, le llamó Haanga (en guaraní significa dibujo o figura). Después de una hora de conversación telefónica nos pusimos de acuerdo en qué es lo que faltaba programar, cuál era el fast path, cómo debería implementarlo, y cómo haríamos las pruebas con Menéame (también hablamos de dinero, pero esto no interesa a nadie ;-) ).

Las pruebas consistieron en instalarlo primero en sus servidores e implementar las plantillas para reemplazar el código HTML de print_summary() de las clases Post (las notas) y Comment (los comentarios). Una vez me confirmo funcionaban en su servidor, el viernes 6 de agosto (hace cinco días) lo instalamos en los servidores de Menéame para hacer las primeras pruebas con datos reales. Fueron sorprendentes.

A parti de ese momento se aceleró y en menos de dos días corregimos bugs, lo optimizamos aún más y en la madrugada del domingo al lunes creamos la versión 4 de menéame en el svn y migramos  el servidor en “porducción” al sistema de plantillas. Por ahora sólo con esos dos templates, pero poco a poco vamos migrando a nuevos templates (ya tenemos seis).

Vale, vale ¿pero qué es el Haanga?

Un sistema de plantillas, software libre, con la conocida sintaxis de Django o I2O, con algunas extensiones necesarias para Menéame (como tratar uniformemente objetos y diccionarios, facilitar la traducción con el GNU gettext, ejecutar funciones de forma controlada, pre definir variables globales, eliminar los espacios de sangrados en la plantilla…). Está desarrollado por César Rodas a pedido nuestro para cubrir nuestras necesidades, pero se hizo de tal forma que pueda ser fácilmente integrado en cualquier proyecto PHP de la misma forma en que se integró en Menéame.

Por ese interés de que sea de uso genérico, se mantendrá como proyecto independiente, liderado por César y en su propio repositorio GIT.

Su funcionamiento es simple:

  • Se llama a una función para inicializar variables básicas, como el directorio donde almacenará los ficheros PHP. Por ejemplo en Menéame:
    /* Load template engine here */
    $config = array(
    	'template_dir' => mnmpath.'/'.$globals['haanga_templates'],
    	'cache_dir' =>  $globals['haanga_cache'] .'/Haanga/'.$_SERVER['HTTP_HOST'],
    	'autoload' => FALSE, /* Don't use Haanga's autoloader */
    	'bootstrap' => 'haanga_bootstrap',
    	'compiler' => array( /* opts for the tpl compiler */
    		'if_empty' => FALSE,
    		'autoescape' => FALSE,
    		'strip_whitespace' => TRUE,
    		'allow_exec'  => TRUE,
    		'global' => array('globals', 'current_user'),
    	),
    	'use_hash_filename' => FALSE, /* don't use hash filename for generated php */
    );
    
    require mnminclude.'Haanga.php';
    Haanga::configure($config);
    
  • Se llama a la función para generar la salida en HTML:
        $vars = compact('title', 'greeting', 'id');
        return Haanga::Load('header.html', $vars);
    
  • Haanga::Load verifica si existe el fichero de caché PHP y si es más nuevo que la plantilla. Si no se así, carga el compilador, genera el PHP, lo almacena y lo evalúa.

El código generado es muy eficiente, elimina los espacios innecesarios, no hace cambios de contexto, usa el echo –es construcción del lenguaje–, no usa comillas dobles para los strings. El template más complicado y largo que tenemos por ahora es el header.html, genera las cabeceras XHML y el HTML de los menús superiores. Este es el código generado en PHP, se puede ver que es prácticamente imposible hacerlo más eficiente (diría que imposible, pero seguro se nos escapan algunos trucos que no conocemos).

Actualizado: la plantilla de “links” es la más complicada por ahora, el código generado.

Desde que está funcionando en Menéame no hemos notado variación considerable (es muy difícil medir con precisión tan fina) con el sistema sin plantillas. Hay un pequeño overhead en la verficación de fechas de los ficheros originales y el cache compilado, pero muchas veces se ve compensado porque el código generado es más óptimo que el original programado manualmente a base de echo.

¿Qué falta?

Faltan implementar algunos detalles que queremos para Menéame, como el include condicional de otra plantilla (será la etiqueta try_include), como no usamos en Menéame el sistema de herencia/bloques (para reducir latencias y consumo de memoria, eso da para otro apunte) no lo tenemos probados en “caso real”, pero están implementados y superan los unit tests.

Lo que sí falta es documentarlo y traducir esta documentación al inglés. Lo que queráis colaborar o probar, poneros en contacto con César: crodas en php.net.

Si tenéis sitios PHP con mucho tráfico/carga y probáis el Haanga, seguro que quedaréis muy contentos. En Menéame nos está cambiando la vida… bueno, es una exageración, pero nos divierte mogollón.

Cuando el problema del hardware se convierte en sólo de software

Disclaimer: No pensaba escribir este apunte porque me parece que es publicidad gratuita a Amazon (y sus servicios AWS), que ya es una empresa de las gordas y dominantes en el mercado… y no me regalaron, ni me regalarán, ni una triste pegatina. Pero lo escribo para compartir experiencia, y que conste en acta que no recibiremos ni unas gracias por este apunte.

Hace un tiempo escribí cómo montamos Menéame a Amazon AWS, y cómo decidimos cambiar de Apache+lighttpd a NGinx, ahora llevamos casi cinco meses de funcionamiento en Amazon AWS y la experiencia no podría haber sido más satisfactoria (aunque con pequeños problemas, relatados al final).

Ejemplos de cambios en servidores

Creo que lo últimos cambios que hicimos son ejemplos claros de las ventajas de no tener que lidiar con hardware y limitarnos a solucionar problemas de software (que siempre tiene solución, si sabes programar).

Nuestra intención era migrar los servidores a Ubuntu Lucid en cuando esta saliese por tres razones fundamentales: es LTS (soporte a largo plazo), el PHP 5.3 que trae soporta conexiones persistentes a MySQL usando las nuevas librerías mysqli (que son las que usamos, más eficientes y elegantes que la anterior) y el arranque es mucho más rápido (importante para las instancias web que se crean dinámicamente según la carga –con el AutoScaler–).

El primer paso fue migrar las instancias webs, para ello tuve que arrancar un instancia con la nueva imagen (AMI) oficial de Ubuntu Lucid para Amazon, instalar los paquetes necesarios (básicamente NGInx y php5), configurarlas (fundamentalmente el NFS y el servicio SMTP), generar una nueva AMI y cambiar la configuración del AutroScaler (dos líneas de comandos). Todo eso me llevó unos dos horas de trabajo y ya teníamos la Lucid con 0 segundos de interrupción (diría que con 0 conexiones fallidas)… a un coste de 0.18€ por las dos horas de instancia adicionales.

El segundo paso fue más gordo, migrar el servidor secundario (aws1) que hace de slave del MySQL (para backups e indexación del Sphinx), de buscador (el Sphynx), DNS secundario y backups diarios a S3. Esta instancia estaba antes como “normal”, es decir sin almacenamiento persistente (EBS, o Elastic Block Storage), la idea era ponerla con EBS dado la complejidad de los servicios que presta. Pues la sorpresa fue que Canonical ya genera imágenes oficiales de Ubuntu preparadas para EBS (antes era un proceso manual un poco tedioso, es espectacular el servicio de Canonical sobre Amazon EC2 y la smejoras que introducen).

Este cambio también llevó poco tiempo, menos de dos horas para preparar todo (lo que más tiempo llevó fue la preparación del slave de MySql) y un par de horas más de pruebas. Cuando estuvo preparada lo único que hubo que hacer fue cambiar la IP fija (Elastic IP) para la nueva instancia, et voilà. Cero segundos de interrupción, a un coste de unos 0.36€.

Hace sólo uno días me decidí a optimizar la gestión de cache de imágenes (miniaturas y avatares). Estas se guardan en S3, pero como el coste de conexión es demasiado elevado para ficheros pequeños no tiene sentido –y es extremadamente caro– servirlas desde S3, así que se guarda una copia cache (que se genera/regenera automáticamente a partir de los originales en S3) en un disco montado por NFS. El servidor de NFS lo hacía la misma instancia que el servidor central de base de datos (aws0), la idea era moverlo a aws1 y así descargar el tráfico de red para ganar unos microsegundos con las conexiones de mysql y distribuir mejor el NFS del código fuente PHP (que sigue en aws0) con las imágenes estáticas (que además pueden tener más tiempo de cache NFS, configurable con los parámetros acregmin, aregmax, acdirmin, acdirmax o actimeo).

Lo único que hubo que hacer es generar una nueva AMI para las instancias web con el nuevo punto de montaje (es menor de media hora de trabajo, a 0.09€ la hora o fracción), forzar al arranque con las nuevas instancias y cuando todas ya eran la nueva cambiar un enlace simbólico en aws0 para apuntar el cache al nuevo directorio. Et voilà. Funciona así ahora, ganamos unos pocos microsegundos, con cero segundos de interrupción.

Situación general

Aquí tenéis la carga de aws0 (servidor de base de datos). Veréis que la carga es baja, muy estable y predecible.

Carga 24hs de aws0

Esta es la carga de aws1, los picos son de la indexación del Sphinx para las búsquedas (casi 7 millones de comentarios, casi 1 millón de enlaces y más de 100.000 notas):

Carga aws1

Carga 24hs de aws1

El siguiente es el estado de las instancias a estas horas (0 hs del miércoles). Se puede ver las dos instancias EBS (aws0 la large, aws1 la small) y las cuatro instancias de servidores web en marcha.

Instancias EC2

Y este es el gráfico de carga de un día de una instancia web.

Carga 24hs de una instancia web

Nota: me hice un pequeño script para poder monitorizar al minuto el estado de las instancias webs desde mi teléfono, es públicamente accesible: m.meneame.net/ec2.php

Rendimiento general

Una de las grandes dudas (y pegas) que teníamos para migrar a Amazon es que al estar situado en Dublin aumenta la ditancia, el número de saltos por routers y quizás las latencias introducidas por las redes virtuales, firewalls y balanceadores de carga. De hecho sólo el ping hacia una instancia casi triplica lo que teníamos en España (Ferca, luego Acens), pasó de 20 y pico milisegundos a unos 60 a EC2 Dublin.

Sin embargo creo que nadie se quejará de la velocidad de acceso y visualización de Menéame.

Tiene mucho que ver las optimizaciones que hemos hecho, como la separación de imágenes estáticas en dominio independiente, mejoras en el código, en las consultas a la base de datos, ajuste del NGInx, php-fastcgi, compresión del HTML, y cache de PHP (XCache). Pero también ayuda a que los balanceadores de carga (usan varios para cada “dominio”) de Amazon funcionan muy bien, tienen conexiones persistentes y unos firewall muy bien configurados que no sólo lo hacen ir rápido, sino que es de un rendimiento predecible que evita que haya conexiones más lentas que son las que más dan la impresión de “lentitud”.

En este sentido estamos también muy satisfechos. Sí, tienes que ir con cuidado porque no tiene sentido sobredimensionar el “hardware virtual” –además creo que no se ganaría casi nada– para solventar los problemas del software o mal diseño de base de datos, pero una vez hallados y solucionados los pocos cuellos de botella, funciona todo como una seda.

Servicios y costes

Cuando estábamos en Ferca/Acens teníamos dos servidores, uno muy potente (2 Quad Core) y otro menos (Duo). Teníamos un muy buen precio, unos 700€/mes todo incluido. Pero teníamos problemas muy difíciles de solucionar:

  • Aunque íbamos muy sobrados, en horas picos o eventos excepcionales el Apache nos saturaba ambas máquinas, como en las finales de la Copa de Europa de fútbol que tuvimos que alquilar temporalmente servidores en Amazon EC2, aunque con latencias muy altas a la base de datos –estaba replicada en Amazon, pero las actualziaciones iban al central en Ferca/Acens–.
  • No teníamos servicio de “backups externos” y cifrados.
  • Poner un balanceador de carga dedicado nos hubiese costado mucho dinero.
  • Teníamos problemas en poner más servidores conectados a la misma red privada (por que no había espacio en el rack, porque había que ir y poner un switch específico, porque obligaba a paradas… etc.).
  • Cada vez que necesitábamos algo puntual era un largo proceso de conversaciones y negociaciones, a tal punto que muchas de las cosas eran imposibles de contratar porque se escapaba a lo que considerábamos un presupuesto razonable.
  • Problemas constantes de “mala configuración” del firewall del CPD que nos bloqueaba conexiones (suponemos porque el número de conexiones era más elevada que la media considerada “normal”, aunque nunca lo supimos bien del todo).

Al momento que migramos a Amazon todos esos problemas se solucionaron:

  • Tenemos S3 para copias, backups y almacenamiento permanente.
  • Tenemos balanceador de carga de muy buena calidad, incluso configurable con “session stickiness”.
  • Podemos habilitar un CDN con los mismos costes que las conexiones S3 (no la usamos).
  • Podemos escalar automáticamente para dar buen servicio sin malgastar el dinero.
  • Disponemos de los servidores que nos hacen falta en no más de un par de minutos, a muy bajo coste.
  • Sistemas de discos (EBS) de muy alta fiabilidad.
  • Control de las IPs (Elastic IPs) y a qué servidor le asignas, puedes cambiarla en cualquier momento, e incluso puedes solicitar la resolución DNS inversa para cada una de ellas.
  • Sistema de seguridad/firewall muy potente, seguro y casi transparente de usar (por ejemplo, las instancias que están en un mismo grupo automáticamente tienen conectividad entre ellas). Al mismo tiempo todas tus instancias están aisladas del resto de instancias.
  • Absolutamente todo es controlable con software (la consola web para la mayoría, para cosas muy específicas las líneas de comandos, el API disponible en varios lenguajes para los scripts de monitorización y control).
  • No tenemos que negociar nada con nadie, todos los servicios –para todo el mundo– están bien claros y especificados, y los precios no son negociables, por nadie.
  • En todo este tiempo no tuvimos ninguna incidencia (salvo problemas de conectividad Internet esporádicos con algunas regiones o ISPs, pero esto pasa con cualquier hosting).

Todos estos servicios disponibles, con la flexibilidad de usarlos como mejor te parezca nos permitió implementar nuevas funcionalidades en Menéame que antes se nos hacían cuesta arriba por la necesidad de tener más hardware [infrautilizado]:

  1. Buscador extendido a comentarios y notas (algo que hace tiempo pedían los usuarios).
  2. Almacenamiento de imágenes y avatares en S3 que generación automática de cache en nuestros discos, los que nos hizo olvidar del problema de almacenar y hacer backups de ficheros.
  3. Cambios en la infraestructura (como de Apache a lighttpd, luego a NGInx con fastcgi, versiones de Ubuntu, etc.) y programas o configuración sin tener que interrumpir el servicio: se hace de forma paralela y luego se hace el switch.
  4. Compramos tranquilidad: duermo mucho más tranquilo, y aunque España llegue a la final del mundial no tendré que preocuparme de buscar estresado y bajo presión una solución a la sobrecarga de la hora posterior del partido.

Todo el que llegó hasta aquí seguramente se pregunta, ¿cuánto nos cuesta todo este tinglado adicional? Aquí tenéis la “factura” del mes de abril, en dólares, haced la conversión a euros :-) [1]

Pagos Amazon abril 2010

Por eso suelo decir, ¿qué hacéis todavía lidiando con hardware y negociando interminablemente para tener un servicio de backup o de balanceo de carga?

Nota: Esto funciona porque Amazon AWS está muy bien diseñado y su servicio es de calidad constante y predecible. Sé que hay varios más, pero no conozco cómo funcionan.

Los problemas

Por supuesto no todos fueron ventajas, tuvimos algunos problemas:

  1. La infraestructura del balanceador de carga es sofisticada, no es sólo un “cacharro” con una IP, son balanceadores distribuidos y se selecciona el mejor dependiendo desde la zona de conexión y el estado de la infraestructura de Amazon. Eso hace que cuando asignas un balanceador no te dan una dirección IP, sino un hostname que debes usarlo como CNAME. Eso impide que puedas usar una zona de primer nivel –el estándar de DNS no lo admite–por ello tuvimos que migrar el web de meneame.net a http://www.meneame.net (con la consiguiente penalización que sufrimos de Google, una caída de visitas –menos del 10% de visitas vienen de Google por búsquedas que no sean “meneame”–, hasta en el PageRank –creo que bajó hasta 6, no sé cómo está ahora–, supongo que con el tiempo y las redirecciones permanentes se recuperará, afortunadamente no nos afectó tanto ya que creo nunca superamos el 12-15% de visitas desde Google).
  2. Como Amazon sufrió abusos de spammers que alquilaban instancias sólo para envíos masivos de emails. La misma Amazon dió de alta todas sus direcciones IP en las organizaciones de listas negras e impedía enviar más de unos pocos correos desde sus instancias. Aunque puedes solicitar la apertura, seguían apareciendo las IPs en Spamhaus, lo que nos impidió enviar correos directamente. Ahora creo que ya lo han cambiado [2] (incluso ya resuelven la inversa de Elastic IP al dominio quele indiques, porbado por ejemplo la inversa de 79.125.22.108). Nosotros hemos tenido que hacerlo vía SMTPAuth.com que funciona muy bien, por lo que todavía no hemos pensado en hacerlo desde nuestros servidores (también tenemos cuenta en SendGrid.com, hablan muy bien de ellos y ofrecen hasta gráficas y estadísticas de quiénes leen los correos o los clics de los receptores).
  3. Desde el servidor web detrás del balanceador no son visibles directamente las IP de los navegadores (es crítico para el control de abusos del Menéame), sino a través de la cabecera HTTP X-Forwarded-For. Afortunadamente en Menéame ya hacíamos control de proxies para permitir votos desde ordenadores detrás de los proxies transparentes de Telefónica y de los teléfonos con conexión IP que salen por proxies (como todos los de Vodafone). Así que sólo usamos la misma función, pero simplificada para que sea más rápida:
  4. function check_ip_behind_load_balancer() {
        // It's similar to behind_proxy but faster and only takes in account
        // the last IP in the list.
        // Used to get the real IP behind a load balancer like Amazon ELB
        // WARN: does not check for valid IP, it must be a trusted proxy/load balancer
        if ($_SERVER["HTTP_X_FORWARDED_FOR"]) {
            $ips = preg_split('/[, ]/', $_SERVER["HTTP_X_FORWARDED_FOR"],
                                             -1, PREG_SPLIT_NO_EMPTY);
            $ip = array_pop($ips);
            if ($ip) return $ip;
        }
        return $_SERVER["REMOTE_ADDR"];
    }
    
  5. En el caso de servidores web seguros (SSL) el problema anterior es más difícil de solucionar. Como la conexión es cifrada el balanceador no puede agregar cabeceras HTTP, por lo que es imposible averiguar la IP desde el servidor. Aquí hay tres opciones: 1) no preocuparte de la IP, 2) dejar el servidor seguro fuera del balanceador, 3) buscar otro método. Como en Menéame se necesita la IP para control y soy un purista de arquitecturas –todos o ninguno– me decidí por la tercera. Cuando se necesita pasar por conexión segura se hace un formulario desde el servidor normal donde se incluye la IP de origen más un hash para controlar que no se manipula. Así el servidor seguro siempre recibe la IP –verificable– como un campo oculto del formulario (y esta es la razón que no se “salta” directamente al servidor seguro sino desde el “action” en un formulario).
  6. Los umbrales y reglas del AutoScaler funcionan bien, salvo para el escalado hacia abajo. Las reglas se definen con un umbral bajo y uno alto. Si la carga seleccionada (en nuestro caso uso de CPU) supera el umbral alto, cre nuevas instancias, si es inferior al bajo mata instancias. El problema es el siguiente, en nuestro caso el bajo es 30% y el alto 75%. Supongamos que hay cuatro instancias al 40% (carga total = 160%), el autoescalador no decrementará hasta llegar al 30% aunque si quita una queda muy por debajo del 75% (con tres quedaría en 53% cada una). Así no se optimiza muy bien el uso de recursos, ni los costes. Amazon dice que introducirá “reglas de usuarios”, mientras tanto yo lo solucioné con un script bastante simple que hace esos cálculos. Si la carga total con una instancia menos es inferior a un “umbral intermedio” (60% en nuestro caso) y hay más de dos instancias en marcha, entonces ordena al AutoScaler que baje termine una instancia. Estos cálculos son visibles en m.meneame.net/ec2.php, esos valores son generados por este script adicional de control de escalado.
  7. No dan factura oficial, hasta ahora no hemos tenido problemas con ellas, al menos Benjamí, nuestras contables ni Hacienda no se quejaron todavía, creo ;-)

Esos son los seis problemas fundamentales que hemos tenido, salvo el sexto, los demás son todos solucionables con un poco de programación.

[1] Tenemos tres instancias “reservadas”, es decir se paga una cantidad por adelantado (uno o tres años) y se obtienen muchos mejores precios. El ahorro anual es exactamente el 30% sobre el precio de lista.

[2] Acabo de confirmarlo (12/mayo), ya no aparecen nuestras IPs en las listas de Spamhaus.

Categorías:desarrollo, internet, menéame Etiquetas: , , ,

El karma y la Ley de Benford

abril 25, 2010 16 comentarios

Hoy acabé de leer The Drunkard’s Walk: How Randomness Rules Our Lives (libro duro en algunas partes, pero muy bueno), uno de los temas que toca el libro es la Ley de Benford. Ésta aparece en determinadas series resultado de operaciones acumulativas (especialmente los datos financieros), los primeros dígitos de los números resultates no siguen una distribución uniforme.

La distribución es aproximadamente la siguiente para números de base 10:

d p
1 30.10%
2 17.60%
3 12.50%
4 9.70%
5 7.90%
6 6.70%
7 5.80%
8 5.10%
9 4.60%

La gráfica (de la Wikipedia) queda:

Lo interesante de esta ley es que se usa para auditorías financieras e incluso es admisible como prueba en casis criminales en EEUU. Se basa en que los “balances” financieros (o evolución de precios de la bolsa, subastas en eBayincluso número de enlaces en Delicious) deben seguir esta ley, pero cuando se estafa manipulando los resultados se tiende a poner números aleatorios. Un ejemplo muy mencionado es que se usó para detectar el fraude de un emprendedor, Kevin Lawrence, que se gastó fraudulentamente 91 millones de dólares de sus inversores, también se la mencionó como evidencia de fraude es las lecciones de Irán en 2009, y la usaron para analizar las declaraciones de renta de Clinton (que las pasó correctamente).

Como me llamó la atención, me pregunté si el karma del Menéame seguiría la Ley de Benford. Si fuese así la usaría como evidencia que no hay fraude (y si no me callaría la boca :roll:).

Claramente no podía usar el karma de las noticias publicadas, ya que el karma de publicación es aproximadamente el mismo para todas (más o menos 500-550 de media) y éste se deja de incrementar una vez se publicó. Así que lo hice con todas las noticias que quedaron en pendientes.

La tabla resultante es la siguiente (nota: hay algunos ceros, en los primeros meses no se insertaba el voto del autor automáticamente, y otras que con la suma de positivos y negativos quedan en cero):

d Total p
0 4070 0.7
1 178254 32
2 95631 17.2
3 60085 10.8
4 47170 8.5
5 40710 7.3
6 38589 6.9
7 34191 6.1
8 30738 5.5
9 27251 4.9

Cumple casi a la perfección con la Ley de Benford ideal:

Categorías:ciencia, menéame, pijadas Etiquetas: ,

Los presuntos emails en nombre de Ramoncín®

enero 13, 2010 44 comentarios


El lunes pasado, entre las 14:01h y las 16:56h del lunes 11 de enero recibí en mi dirección personal 29 correos electrónicos enviados por Jonathan P. exigiendo que eliminemos comentarios que nos dejaban en “situación de ilegalidad” [sic].

Aquí la copia literal (sólo se eliminó un nombre de personal) de todos los correos que recibí (en el blog de Menéame se hizo un breve comunicado para aclarar la situación según las recomendaciones de los abogados).

Esto es lo que exigían:

[...]

1.-  Les requerimos fehacientemente para que en un plazo no superior a 24 horas procedan a la eliminación total de los mencionados comentarios, pues en caso contrario nos veríamos obligados a ejercitar en nombre de nuestro cliente, cuantas acciones en derecho nos asistan en defensa de sus intereses, dada la grave vulneración del honor de mi representado que supone dicho contenido, pudiendo hallarnos frente a un posible delito de injurias e incluso de calumnias (Artículo: 208 C.P.),    con agravante de medio y publicidad (Art 209 C.P),  del cual serían Ustedes completamente co-responsables al reproducirlos en su medio Web, en caso de no retirarlos tras el presente requerimiento.

Tras lo detallado, les solicitamos las siguientes acciones:

- Eliminación de todos aquellos comentarios escritos bajo artículos que alberga su dominio o espacio web sobre nuestro cliente o marca que supongan una vulneración del honor de mi representado y su control posterior.

- Eliminación de metadatos y tags con referencia a los comentarios sobre mi representado que pudieran ayudar a la indexación de las páginas en los buscadores, en particular aquellos comentarios que supongan una vulneración del honor de mi representado.

- Todas aquellas acciones que de buena fe tenga a bien realizar para normalizar la situación de ilegalidad en la que Uds. están incurriendo.

- Así mismo le solicito que extienda este requerimiento en todos y cada uno de los espacios web donde Uds. estén incurriendo en actos similares en contra de nuestro cliente o marca .

Esperando que su buen juicio haga innecesaria cualquier otra acción, y esperando que entienda los motivos que le han llevado a nuestro cliente y titular de marca a solicitar la eliminación de dichos comentarios, aprovechamos la ocasión para saludarles.

[...]

Además, aunque hacen copy&paste de contenido externo, esto es lo que se atribuyen:

ATENCIÓN / Les comunicamos que la redacción del presente requerimiento tiene en si mismo propiedad Intelectual que nos corresponde en exclusiva;  y por tanto no les autorizamos  a su reproducción, distribución, comunicación pública ni transformación bajo ningún medio sin autorización previa.

Los correos fueron envíados desde una dirección 212.145.169.xxx localizada en Vigo, diferente a la ciudad del bufete (usaron sistemas de SalesForce.com para el envío masivo de los emails). El dominio de la dirección de correo del que enviaba era de redpoints.es.

Categorías:internet, legales, menéame Etiquetas: , ,

Cambiamos de Apache y lighttpd a nginx

Actualización: Britxardo me envió un esquema bien dibujado:

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 428 seguidores