Archive of September 2009
Monitorizar la replicación de Mysql
Imaginemos que tenemos una infraestructura Maestro/Esclavo y el esclavo lo usamos para lecturas, backup o simplemente para dar un servicio mínimo si el Maestro se cae. Imaginemos que dicha replicación lleva caída un mes y el Maestro se rompe. Cuando te das cuenta es demasiado tarde y entonces toca imaginarse como huir sin que te pillen :)
Monitorizar si la replicación es correcta es sencillo, ya que MySQL nos puede dar en segundos el desfase que existe entre un host y otro a la hora de replicar los cambios. Con "SHOW SLAVE STATUS\G" tendremos la información que necesitamos:
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.60.1.3
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000021
Read_Master_Log_Pos: 327326
Relay_Log_File: mysqld-relay-bin.000061
Relay_Log_Pos: 327463
Relay_Master_Log_File: mysql-bin.000021
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 327326
Relay_Log_Space: 327463
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Cada entrada en el log lleva un timestap indicando el momento exacto en el que es escrito en el Master. Por lo tanto, el "Seconds_behind_master" hace una simple resta, entre nuestro timestamp y el del master para saber la diferencia.
Dicho esto, la solución es tan sencilla como tirar de Bash Scripting:
#!/bin/sh
treshold=1200
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
if [ -z $1 ] ; then
echo "Usage: $0 /path/to/mysql.sock"
exit 255
fi
seconds=mysql -S $1 -N -e "show slave status\G" | grep Seconds_Behind_Master | cut -d: -f 2
if [ -z $seconds ] ; then
exit 255
fi
if [ $seconds = "NULL" ]; then
echo Replication kaput!!!
exit 255
fi
if [ $seconds -gt $treshold ]; then
echo Slave behind the master more than $treshold seconds!
fi
Pero claro, antes de realizar estas comprobaciones se deben tener en cuenta una serie de requisitos previos:
- Los equipos deben tener la hora sincronizada :)
- A poder ser, deben estar LAN. Si tenemos una WAN con mucha latencia y encima microcortes, olvídate de esto.
Si se busca en internet hay múltiples formas de hacerlo, pero esta es la más sencilla. Y si le añadimos algun "exit 0" y "exit 1" tenemos un checker para Nagios :P Y también es recomendable añadir otro grep más para comprobar si los threads SQL e IO están en funcionamiento (Slave_IO_Running, Slave_SQL_Running)...
Si Mikel, esta entrada va por ti xD
Oracle: Nosotros no competimos contra MySQL
Esa frase, pronunciada por Ellison (CEO de Oracle), es una frase más propia del Capitán Obvio.
Ahora mismo la situación es algo incierta para SUN, con 100 millones de perdidas cada mes necesita la fusión cuanto antes de las dos empresas para dejar tirar dinero, pero para ello necesitan la aprobación de los tribunales tanto Estadounidenses como Europeos. Este recelo es lógico, ya que las dos empresas tienen como pilares básicos dos Bases de Datos, Oracle y MySQL. Pero algo que está claro, es que a pesar de ser lo mismo, no tiene ni el mismo enfoque ni el mismo mercado como objetivo, por lo tanto la frase de Ellison es de una lógica más que aplastante. MySQL no es competencia para ellos y no se desharán de el. Ni de Mysql ni de otras de las punteras tecnologías que SUN dispone, como SPARC, almacenamiento, virtualización, etc.
"We are keeping everything. We're keeping tape. We're keeping storage. We're keeping x86 technology and SPARC technology--and we're going to increase the investment in it. Sun has fantastic technology. We think it's got great microprocessor technology--it needs a little more investment, but we think it can be extremely competitive."
"MySQL and Oracle do not compete at all. If you look at where we compete it's with DB2, Microsoft's SQL Server, Sybase, and a long list of others. We never compete against mySQL, it addresses very different markets."
Aunque creo que se trata de algo obvio, no está de más aclararlo. Y alguien no se siente agusto, siempre tiene MariaDB, un fork de MySQL con el nuevo Engine "Maria", que tiene pinta de que será la leche :)
¡El Software libre solo desaparece cuando la gente deja de desarrollarlo y usarlo, no cuando lo compra una empresa!
Replicación desincronizada
A veces puede darse el caso de una desincronización entre los distintos servidores que forman parte nuestra infraestuctura. Esto puede causar tanto la caida del host desincronizado como la caida de casi todo el sistema si estamos ante una replicación circular. Dichas desincronizaciones pueden deberse a muchas causas, fallos en MySQL, en nuestra aplicación, en la red, en la configuración de los sistemas, etc. O como no, un fallo humano, como por ejemplo borrar o modificar tablas y registros en un servidor Esclavo.
Cuando esto ocurre se pasa siempre por dos fases:
1- Histeria
2- Solución
La fase de histeria es bien conocida, así que iremos directamente a la solución.
Si analizamos los logs del servidor desincronizado, podemos ver cual es la query problematica y descrubir la razón del problema:
Sep 11 11:13:16 test2 mysqld[6776]: 090911 11:13:16 [ERROR] Slave: Error 'Table 't' already exists' on query. Default database: 'mysql'. Query: 'CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin)', Error_code: 1050
Sep 11 11:13:16 test2 mysqld[6776]: 090911 11:13:16 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin.000003' position 421
Como se puede leer, la query enviada por el Maestro es un "CREATE TABLE t...) pero el Esclavo no puede hacerlo ya que la tabla YA existe. O alguien la ha creado a mano en el Esclavo por equivocación o el anterior DROP TABLE no llegó a sincronizarse. Apuesto por la primera, la manaza de alguien :P
Además nos proporciona más información valiosa, como el log binario que se está leyendo así como la posición en la que se encontraba, valores importantes si deseamos reiniciar la sincronizacion con un dump completo.
Como ese comando, el CREATE TABLE, ya no es necesario que se sincronize, ya que la tabla en realidad ya existe porque algún manazas la creo en el Esclavo, vamos a decirle que lo ignore y siga con la replicación:
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
Query OK, 0 rows affected (0.00 sec)
mysql> start slave;
Traducido quiere decir:
- Para de funcionar como Esclavo.
- Ignora la última query recibida del Maestro.
- Vuelve a funcionar como Esclavo
¡Y listo!
Arquitectura Maestro / Esclavo en Mysql
Cuando se trabaja con bases de datos hay dos cosas sobre las que se prestan especial atención:
- Copias de seguridad
- Balanceo de carga
Y la solución tiene un único nombre, replicación :) La replicación se basa en unos conceptos muy básicos y sencillos. En lugar de tener un servidor MySQL tenemos un número N, que se dividen en Maestros y Esclavos, cada uno con una tarea muy especifica. A la hora de diseñar nuestra red de servidores hay que tener en cuenta las siguientes reglas:
- Un Maestro puede tener múltiples Esclavos.
- Un Esclavo puede tener un único Maestro.
- Los Maestros envian las modificaciones realizadas en las BBDD a los Esclavos.
- Los esclavos no pueden modificar la BBDD a su antojo, solamente recibir las modificaciones del Maestro y aplicarla.
En resumidas cuentas, como máximo un Maestro (escritura) y múltiples Esclavos (lectura). Con esto ya podeís comprobar que tanto las copias de seguridad como el balanceo de carga está solucionado. Los esclavos actuan como copias exactas del original, mintras que si dirigimos las lecturas a los esclavos escribiendo únicamente en el Maestro, estamos realizando un balanceo de carga.
Un esquema para verlo más claro:

El usuario desde su aplicación, lee de un grupo de servidores esclavos, a poder ser contra una IP virtual de algún balanceador de carga, mientras que escribe en el Master. Esto se hará a nivel de aplicación y de forma transparente para el usuario. A continuación las configuraciones:
Dump de la Base de datos
En primer lugar hay que dumpear la base de datos y recuperarla en cada uno de los nodos Esclavos. Esto se hará con mysqldump haciendo uso en esta ocasión de una opción especial:
mysqldump --all-databases --master-data=2 > dump_file
--master-data indica al mysqldump que incluya en los comentarios del dump tanto el nombre del masterlog como su posición, de forma que los esclavos sepan desde donde deben comenzar a replicar.
M1 (Maestro)
/etc/mysql/my.cnf
[mysqld]
binlog-do-db = a
binlog-do-db = b
bin-log=/var/log/mysql/mysql-binlog
server-id=1
Mysql:
mysql> GRANT REPLICATION SLAVE ON . TO 'slave_user2'@'192.168.1.2' IDENTIFIED BY 'slave_pass';
mysql> GRANT REPLICATION SLAVE ON . TO 'slave_user3'@'192.168.1.3' IDENTIFIED BY 'slave_pass';
mysql> GRANT REPLICATION SLAVE ON . TO 'slave_user4'@'192.168.1.4' IDENTIFIED BY 'slave_pass';
mysql> GRANT REPLICATION SLAVE ON . TO 'slave_usern'@'192.168.1.n' IDENTIFIED BY 'slave_pass';
H1 (Esclavo)
/etc/mysql/my.cnf
[mysqld]
server-id=2
Mysql:
mysql> CHANGE MASTER TO MASTER_HOST = ‘192.168.1.1’, MASTER_USER = ‘slave_user2’, MASTER_PASSWORD = ‘slave_pass’, MASTER_LOG_FILE = ‘master_log_file’, MASTER_LOG_POS = master_log_pos;
mysql> START SLAVE;
En MASTER_LOG_FILE y MASTER_LOG_POS debemos poner los datos que aparecen en los comentarios del dump, tal y como hemos indicado anteriormente.
Con START SLAVE comenzamos la replicación, desde la posición indicada. Si ahora ejecutásemos un SHOW PROCESSLIST, tendríamos que ver dos procesos más en cada Esclavo, "I/O Thread" y "SQL Thread".
Y listo, tenemos replicación activa :)
MySQL SandBox, el mejor entorno de pruebas
Juguetear con MySQL es divertido, pero la preparación de los distintos servidores un coñazo. Distintos sockets, distintos puertos, establecer los usuarios y permisos… Existe una utilidad para convertir MySQL en una zona de juego, SandBox:
Esta herramienta te permite por ejemplo, mediante un simple comando, crear una estructura de replicación circular con 20 servidores MySQL :P
Instalación
Hacen falta dos cosas, SandBox y un tar.gz con los binarios de Mysql (que se descargan de la propia web de MySQL). Una vez que lo tenemos, procedemos a instalar SandBox:
Como Root:
perl Makefile.PL
make
make test
make install
Como Usuario:
export PATH=$HOME/usr/local/bin:$PATH
export PERL5LIB=$HOME/usr/local/lib/perl5/site_perl/5.8.8
perl Makefile.PL PREFIX=$HOME/usr/local
make
make test
make install
Puesta en marcha
Imaginemos que queremos montar un sistema de replicación con un maestro y 10 esclavos :) Lo que antes era un infierno ahora se resume en:
make_replication_sandbox --how_many_slaves=10 /tmp/mysql-5.1.37-linux-i686-glibc23.tar.gz
installing and starting master
installing slave 1
installing slave 2
installing slave 3
installing slave 4
[...]
replication directory installed in $HOME/sandboxes/rsandbox_5_1_37
Listo!
Para ejecutar un comando en todos los servidores:
/home/sandboxes/use_all "show databases"
master
Database
information_schema
mysql
test
server: 1:
Database
information_schema
mysql
test
...
Cada MySQL escucha en un puerto y tiene un socket propio. Los puestos los podeis saber con un simple netstat:
[punisher@miguel sandboxes]$ netstat -putan
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:23552 0.0.0.0:* LISTEN 9986/mysqld
tcp 0 0 0.0.0.0:23553 0.0.0.0:* LISTEN 10609/mysqld
tcp 0 0 0.0.0.0:23554 0.0.0.0:* LISTEN 10706/mysqld
tcp 0 0 0.0.0.0:23555 0.0.0.0:* LISTEN 10803/mysqld
tcp 0 0 0.0.0.0:23556 0.0.0.0:* LISTEN 10900/mysqld
tcp 0 0 0.0.0.0:23557 0.0.0.0:* LISTEN 10998/mysqld
tcp 0 0 0.0.0.0:23558 0.0.0.0:* LISTEN 11096/mysqld
tcp 0 0 0.0.0.0:23559 0.0.0.0:* LISTEN 11194/mysqld
tcp 0 0 0.0.0.0:23560 0.0.0.0:* LISTEN 11292/mysqld
tcp 0 0 0.0.0.0:23561 0.0.0.0:* LISTEN 11389/mysqld
tcp 0 0 0.0.0.0:23562 0.0.0.0:* LISTEN 11487/mysqld
Para saber los sockets:
[punisher@miguel ~]$ ls -la /tmp/mysql_sandbox235*
Para pararlos/arrancar todos:
srwxrwxrwx 1 punisher users 0 sep 7 16:44 /tmp/mysql_sandbox23552.sock
srwxrwxrwx 1 punisher users 0 sep 7 16:44 /tmp/mysql_sandbox23553.sock
srwxrwxrwx 1 punisher users 0 sep 7 16:44 /tmp/mysql_sandbox23554.sock
srwxrwxrwx 1 punisher users 0 sep 7 16:44 /tmp/mysql_sandbox23555.sock
srwxrwxrwx 1 punisher users 0 sep 7 16:44 /tmp/mysql_sandbox23556.sock
srwxrwxrwx 1 punisher users 0 sep 7 16:44 /tmp/mysql_sandbox23557.sock
srwxrwxrwx 1 punisher users 0 sep 7 16:44 /tmp/mysql_sandbox23558.sock
srwxrwxrwx 1 punisher users 0 sep 7 16:44 /tmp/mysql_sandbox23559.sock
srwxrwxrwx 1 punisher users 0 sep 7 16:44 /tmp/mysql_sandbox23560.sock
srwxrwxrwx 1 punisher users 0 sep 7 16:44 /tmp/mysql_sandbox23561.sock
srwxrwxrwx 1 punisher users 0 sep 7 16:44 /tmp/mysql_sandbox23562.sock
$HOME/sandboxes/start_all $HOME/sandboxes/stop_all
Para acceder a uno en particular:
Con la herramienta mysql (clave de root msandbox) o mediante unos script:
$HOME/sandboxes/rsandbox_5_1_37/m (master)
$HOME/sandboxes/rsandbox_5_1_37/s1 (slave 1)
$HOME/sandboxes/rsandbox_5_1_37/s2 (slave 2)
etc.
Farmacéutica Novartis, creadores de la vacuna de la gripe A
"La filial de vacunas de la multinacional suiza Novartis ha iniciado ya el envío a España de su vacuna contra la gripe estacional, con lo que ha adelantando en más de dos semanas la provisión con respecto a años anteriores." Enlace
Para entender mejor como son esta gente, nada mejor que leer algunos extractos de la Wikipedia :)
Ganancias
Desde los inicios de la compañía, ésta ha estado en superávit continuo. En 2005 la cifra de negocios alcanzó los USD 32.200 millones (14% más que en el ejercicio anterior) y las ganancias alcanzaron los USD 6.100 millones (10% más que en el ejercicio anterior). Este resultado se debe en cierta parte a la venta de productos contra el cáncer, la leucemia y la hipertensión. Novartis es considerada una de las cinco empresas farmacéuticas más grandes del mundo (datos de IMS, agosto 2004), además de constituir un importante pilar de la economía de Suiza, en particular en la región de Basilea, donde tiene su sede principal. Su facturación anual ronda los 20.000 millones de € (2003).
Artemisa annua
La Artemisa annua es una planta tradicional de la medicina china con una efectividad del 95% contra la malaria. Tras pasar fiebres, el tratamiento con esta planta logra que la persona sane después de unos tres días. La OMS firmó un acuerdo en 2001 con Novartis para producir cantidades anuales a bajo coste bajo la marca Coartem, una pastilla de dosis fija de artemeter/lumefantrina. La Artemisa tiene una cosecha anual, lo que dificulta su producción. Novartis no realizó la inversión adicional prometida pese a tener la previsión oficial de la OMS de producir 60 millones de tratamientos para 2005. Al tener Novartis la exclusiva de Coartem, la desidia en su producción ha permitido la enfermedad y muerte de millones de personas en los últimos años, mientras que tratamientos de menor eficacia copan el actual negocio del tratamiento de la malaria. En septiembre de 20063 Novartis seguía sin haber cumplido el compromiso, pero anunció de nuevo que asumiría el suministro del medicamento, sin que por el momento se tengan noticias de que se haya iniciado. Coartem sigue siendo casi imposible de encontrar en muchos países afectados o tiene un acceso muy limitado.
Vacunas
El 12 de junio de 2009 anunció la creación del primer lote de vacunas contra la gripe porcina causada por una variante del Influenzavirus A. Igualmente anunció que no hará caso a la petición de la Organización Mundial de la Salud, por lo que no donará vacunas a los países pobres. Indicó su director general, Vasella, que "el costo de cada vacuna es de entre 10 y 15 dólares en grandes pedidos y algo más si el volumen del pedido es menor".
Solo falta que su logo sea un paraguas... Las farmacéuticas, el nuevo cáncer de la sociedad.
Nostalgia Gamer
Buscando videos del Amstrad CPC 6128 en Youtube he encontrado uno que no me esperaba, es el primer juego de ordenador al que he jugado en mi vida. El Burning Rubber venia en el mismo cartucho que el sistema operativo Basic y al encender la máquina te daba la oportunidad de jugar o ponerte a escribir comandos. Logicamente, con 7 u 8 años, lo que yo quería era jugar :P Solo escuchar esa música, ver esos gráficos, el sonido de los derrapes hacen que me emocione. Que tiempos mas bonitos, cuanto se echan de menos a veces, la única preocupación que tenias era terminar el primero en la clasificación.
Tengo que recuperar esa máquina como sea, nada de emuladores, el original!







