Percona Live 2011 en Londres

Hace una semana que tuve la oportunidad de visitar por primera vez Londres para ir al evento Percona Live London 2011. Este evento organizado por Percona (una de las mayores distribuciones de MySQL) tenía buena pinta, así que arrastré conmigo a Rubén Ortiz (uno de los mejores administradores de sistemas que conozco y además buen amigo).

El evento se dividió en un par de días. El primero de ellos iba enfocado más a cosas prácticas, ya que eran talleres. Yo me fui a uno que duró todo el día (mañana y tarde) y que hablaba de cómo escalar LAMP (Linux + Apache + MySQL + PHP) aunque en este caso la A era N, de nginx. El profe del taller era Alexey Rybak, que trabaja en Badoo, y que, aunque no explicó tampoco ninguna cosa fuera de lo normal, sí que me gustó algunos puntos de vista muy distintos a la hora de trabajar de lo que estamos acostumbrados. Por ejemplo, ellos prefieren centrarse en el rendimiento de la plataforma que no en la integridad del mismo. Es por eso que hacen SQL Sharding (y más info) para distribuir la información de la mejor forma posible.

Allí nos encontramos con gente de Softonic que también había ido al evento. Sin duda nuestras problemáticas y las suyas son bastantes distintas en todos los sentidos, tanto de sistemas como de SEO, donde la forma de trabajar es muy distinta, aunque muy complementaria, ya que pudimos comentar jugadas y problemáticas que hemos podido también hablar con la gente de Trovit. Al final, la mayoría tenemos siempre los mismos problemas.

El segundo día las charlas fueron enfocadas más a otros temas. Estuve en varias, de la cuáles de cada una me quedo alguna cosa… por ejemplo, una en la que se hablaba de Varnish nos sirvió de mucho ya que llevamos una temporada usando esta tecnología, o la de Paypal donde explicaban cómo escalan la plataforma y sus cálculos muchas veces sobre Amazon AWS.

Como resumen de todo lo que viví en las charlas me quedo con que es mejor mirar al rendimiento que no a la integridad del proyecto (excepto en aquellos en los que la integridad prima sobre otras cosas) y que hay que aprovechar al máximo los sistemas de almacenaje en memoria sobre los de disco (exceptuando los SSD). Y, eso sí, cachear, cachear todo.

Para acabar, me gustaría recomendaros un local en el que pasamos largos ratos llamado The Trinity en el que se está muy a gusto, en el que se comen unas hamburguesas muy muy ricas (y está justo al lado de una parada de metro).

NewSQL

Bases de datos hay muchas, y formas de almacenar datos hay ilimitadas. Pero sistemas de bases de datos que cumplan el estándar SQL99 no hay tantas, y menos si hablamos de las versiones posteriores. Pero últimamente se está hablando mucho de qué sistemas de bases de datos usan servicios como Google, Facebook, twitter… se habla de las bases de datos NoSQL (que personalmente, al no ser relacionales, para mi no son bases de datos completas) y de una nueva era de bases de datos llamadas NewSQL, muchas de ellas compatibles con MySQL.

Sin duda un primer tema al que hay que darle una ojeada a el al de la integridad relacional. Formatos como MyISAM no son precisamente los mejores para almacenar datos, ya que si algo falla, ahí se queda. InnoDB es un buen formato que viene con el propio MySQL y el formato MEMORY es muy decente para almacenar datos en memoria con un acceso temporal (por ejemplo sesiones de usuario o información pre cargada).

La peor situación en cualquier caso es cuando tienes que manejar una cantidad muy elevada de datos, millones de filas. Sin duda las últimas versiones de MySQL están haciendo los deberes, sobre todo con la versión 5.5 y la futura versión 5.6. En estos casos hablamos de la MySQL Community Server. Aunque desde hace un tiempo también tenemos otra posibilidad, la MySQL Cluster que pretende solventar los problemas que existen al tener toda la información en una máquina, separándola en cluster; aunque para ello hay que tener un sistema de clustering como pudiera ser Hadoop.

Aun así, no cabe duda que para escalar a esos niveles podríamos plantear una mezcla de Hadoop + HDFS + Cassandra que es lo que Facebook estaría usando parcialmente.

Pero volvamos a los nuevos sistemas de bases de datos, los llamados NewSQL. Yo personalmente me quedo con MariaDB que está creado por la misma gente de MySQL y que básicamente lo único que hay que hacer es sustituir el software, ya que los ficheros de datos son compatibles.

El NewSQL es la forma de llamar a lo que se podría considerar un ScalableSQL, es decir, es la forma de llamar a una nueva generación de bases de datos que están pensadas para ser escalables y/o tener un alto rendimiento y alta disponibilidad. Algunas de estas bases de datos son estas:

Akiban, Amazon Relational Database Service, Clustrix, CodeFutures, Database.com, Drizzle, FathomDB, GenieDB, JustOne DB, Microsoft SQL Azure, MySQL Cluster with NDB, MySQL with HandlerSocket, NimbusDB, RethinkDB, ScalArc, ScaleBase, ScaleDB, Schooner, Tokutek, VoltDB, Xeround

La lista es larga, cada una de ellas hace una cosa distinta aunque similar y se gestionan de una forma que en algunos casos es muy sencilla y en otras más compleja. Así que sin duda, si vas a comenzar un proyecto en el que necesites escalabilidad, sobre todo al hacer una estrategia internacional, deberías plantearte alguno de estos servicios y plataformas para solventar lo que te puede deparar el futuro.

Evita, con PHP, ataques XSS y SQL injection

Una de las cosas que normalmente no revisamos cuando creamos un sitio web es la vulnerabilidad que se tiene a ataques por URL por cosas como XSS e incluso a ataques a la base de datos por una mala configuración. Para esto normalmente se usa una revisión y se ejecuta, con PHP, la función htmlentities() que, gracias a eliminar el código HTML puede filtrar cosas como los <script>. Para solventar esto existe una cosa llamada Genius Open Source Libraries que, con unas simples funciones, permiten hacer una megalimpieza contra ataques de todo tipo.


require_once 'Core/sgConfig.inc.php';
// Output an unsafe string, presumably user input
$xss = '<script>alert(\'oh snap\');</script>';
echo 'If your entered your name as ' . $xss . ', we\'d be in trouble.<br>' . "\n";
// Sanitize that string, and output it safely
$htmlContentContext = sgSanitizer::sanitizeForHTMLContent($xss);
echo "But if we sanitize your name, " . $htmlContentContext . ", then all is well.<br>\n";
echo '<h2>HTML Attribute</h2>';
// We can also safely sanitize it for an HTML attribute context
$htmlAttributeContext = sgSanitizer::sanitizeForHTMLAttribute($xss);
echo 'Tainted strings can also be used in an <a href="http://google.com" title="' . $htmlAttributeContext . '">HTML attribute</a> context.<br>' . "\n";
echo '<h2>JavaScript string</h2>';
// And we can even make strings used in JavaScript safe
$jsString = '\';alert(1);var b =\'';
echo '<script type="text/javascript">
var a = \'' . $jsString . '\';
var aSafe = \'' . sgSanitizer::sanitizeForJS($jsString) . '\';
</script>';

En este sistema de limpieza descargable como proyecto Genius encontramos algunas funciones como sanitizeForHTMLContent (que limpia el contenido teniendo en cuenta que es código HTML), sanitizeForHTMLAttribute (que limpia como atributo de HTML, por ejemplo el “alt” de una imagen) o sanitizeForJS (que dejaría el código arreglado para poder ejecutarse como JavaScript).

Sin duda una biblioteca de funciones interesante a la hora de aumentar la seguridad de un sitio web.

Buscando desarrollador web

Hoy comenzamos el día con una oferta de trabajo, que tal y como está la cosa, no es moco de pavo. El perfil es de desarrollador PHP y MySQL.

Quién se incorpore estará bajo mi supervisión y se dedicará principalmente a la continuidad de un proyecto que he estado elaborando estos últimos meses, por lo que si le gusta la emoción no ha podido caer en un sitio mejor…

También es interesante que tenga las ideas claras y que le guste Internet, ya que este proyecto se mueve a una velocidad bastante rápida y la evolución puede necesitar ir a la misma velocidad.

Con respecto a la jornada laboral, puede ser media jornada (si fuera de mañanas sería de 09:30 a 13:30; en caso de ser de tardes sería de 15:00 a 19:00) o jornada completa (de lunes a jueves de 09:30 a 19:30 y los viernes de 09:30 a 14:30). La zona de trabajo es Plaça de les Glories en Barcelona.

La retribución ahora mismo no la sé, pero lo más probable es que sea por convenio (que si no recuerdo mal, está por encima de lo mileurista).

Para enviar el curriculum y lo que queráis (algún proyecto que hayáis hecho de ejemplo o similar si os parece conveniente) podéis hacerlo en la cuenta de correo simple@kisslab.com donde una amable secretaria os atenderá (NOTA: la amable secretaria puede no ser tan amable, puede no ser secretaria, puede ser un tío e incluso diría que podría ser yo mismo).

Lo que hace un índice

Como ayer comenté, a veces las decisiones de actualizar software y tal quizá no sean las mejores, aunque lo flipante es que una gilipollez consiga tirarte una máquina y llevar locos a los técnicos de un ISP.

Estos días ando ayudando a migrar un proyecto que estaba antes en HTML con PHP que llamaba y tal, y que ya era ingestionable, y decidimos pasarlo a SQL, recuperando del HTML la información importante y como CMS decidimos utilizar WordPress.

El problema nos lo hemos encontrado al tener más de 21.000 posts y una base de datos que ocupa más de 250 megas. La cuestión es que no tenía sentido que se cayera cada dos por tres el servidor, el Apache, el mySQL y todo en reacción en cadena… Al final, más movimientos han hecho que los del ISP se quejen diciendo que se había jodido la máquina…

Total, al final, como el tema estaba en que había muchas “query_slow” he pedido que activen el log y me he puesto a mirar que era… y la solución ha sido una de las mayores tonterías del mundo… algo que ha hecho que una máquina con 4 procesadores que iba al 95% de media antes haya pasado a un 50% de CPU, y que los 2 GB de memoria que estaba antes al 98% ocupados hayan quedado al 60%.

¿Cómo es posible que un campo de la base de datos de WordPress con el que se ordenan cientos de consultas no esté indexada? Pues sí, ha sido mano de santo.

Tan sólo hay que ejecutar esto en el SQL y se solucionan algunos problemas, sin que afecte a la configuración inicial de WordPress. Por cierto, cuidado con el “prefijo” de la tabla, que según como lo hayáis dado de alta puede o no ser el mismo.

ALTER TABLE wp_posts ADD INDEX (post_date)

En fin, si alguien que utiliza o desarrolla WordPress me puede decir porqué eso no está indexado, se lo agradecería enormemente… porque estoy pensando en avisar para que se incluya de serie… porque en grandes cantidades de información esto muere. Básicamente es que el “listar entradas” del panel, hace un ORDER BY post_date

Cuando los jefes deciden la tecnología

prohibido tocarUna de las cosas que más rabia me da es que la gente que “ya no tiene ni idea de tecnología” se meta donde no se les llama. Podría dar un par de ejemplos, pero prefiero callarme y que se de por aludido quien tenga que darse…

La cuestión es que, por poner un par de ejemplos, me he encontrado que un CEO (que no CTO) ha decidido que actualizar la versión de MySQl era lo mejor para solucionar problemas. ¿Seguro? ¿Cambiar de la 5.0.10 a la 5.0.20 va a solucionarte un problema que va más allá de todo? Está claro que no, y que los “fallos” de petadas y demás no se arreglan con una simple “miniversión”. Si me dijeras de cambiar de MySQL 4 a MySQL 5, pues te diré que sí, o incluso de la 5.0 a la 5.1, pero no menos… la cuestión es que, “curiosamente” esa nueva versión ha empeorado las cosas porque tiene errores de base que aún no están solucionados…

Lo peor, quizá es que haya una persona responsable de un proyecto, o un administrador de sistemas y que esa persona se entere “a posteriori” de un cambio de configuración que puede afectar a multitud de proyectos en paralelo.

Otro ejemplo que nunca entenderé es porqué un “usuario normal” quiera tener permisos de administrador en un WordPress. Nadie, y repito, nadie, excepto el responsable de tecnología debería tener acceso de administrador, porque, al final, el nivel de Editor es más que suficiente para una persona que ha de gestionar los artículos, páginas, comentarios…

Y es que, que alguien que no conoce en profundidad una plataforma “aunque le parezca muy sencilla” y active o modifique elementos de forma manual, cuando se generan por norma general de forma automática, es un error…

En fin, simplemente quería dejar esta reflexión… porque, si algo he aprendido en los últimos años es que uno no puede conocer, por muy informático que sea y estudios que tenga, todo sobre lo que se lanza cada día… y es mejor sólo dedicarle tiempo a lo que uno sabe… unos a programar y otros a navegar por feisbuc.

Qué jodida es la migración

Si hay algo chungo en la vida son las migraciones… estos días he tenido que hacer una y he tardado 4 días en llevarla al final, suponiendo que hasta lo que he acabado hace unos minutos funcione.

Para empezar, desde el jueves hasta esta mañana no ha funcionado casi nada… muchos habréis visto este blog con una pantalla de CentOS de otra máquina…

Me he encontrado 2 problemas en la migración. La primera de ellas, que al migrar de un Plesk a otro, aún siendo versiones muy similares, el Migration Manager tocaba la configuración de las bases de datos. Lo que hacía, de forma extraña, era convertir a UTF-8 algo que ya estaba en UTF-8, de forma que si entrabas en este blog, por ejemplo, se veía todo con caracteres extraños… la cuestión es que si lo ponías en modo ISO, se veía en el UTF-8 original que debía haber… en fin, para los que alguna vez os encontréis (y para yo tenerlo también) en la misma situación:

mysqldump --user=XXXXX --password='XXXXX' --opt
--default-character-set=latin1 --skip-set-charset
basededatos > basededatos.sql

El siguiente paso ha sido mover el fichero SQL a la máquina de destino y hacer lo siguiente:

mysql --user=XXXXX --password='XXXXX'
basededatos < basededatos.sql

Con esto se ha copiado la base de datos de forma intacta... así que sólo con eso ya volvía a funcionar completamente todo...

El otro problema aún no está claro, aunque tiene que ver con un plugin del qMail del Plesk... del que os hablaré con más detalle cuando tenga algo más de información... por ahora simplemente lo he desactivado y parece que ya vuelvo a tener correo...