Seconds_Behind_Master no para de crecer

timeYa hemos hablado de replicación Master-Slave (o replicación) con anterioridad, pero, ¿cómo saber en qué estado están los slaves? ¿Está todo funcionando?

Hay un comando sumamente útil (y necesario) que nos muestra una serie de información, que nos puede venir muy bien para saber cómo están nuestros slaves. El comando lo ejecutaríamos en el cliente MySQL de cada servidor slave:

mysql> show slave status\G;

Entre la información que devuelve, destacan dos variables que han de estar a «Yes» para asegurar que la replicación está funcionando:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

El parámetro «Seconds_Behind_Master» también nos ayudará a ver cómo de sincronizado va ese slave, respecto al master, en segundos, pero no es un valor muy exacto.

Continuar leyendo «Seconds_Behind_Master no para de crecer»

Configuración MySQL Master Slave

Cloud ComputingÉste es un post que he tenido en borrador durante varios meses, por la pereza de acabar de pulirlo. Por fín, me ha coincidido otra configuración de MySQL Máster-Slave (esta vez basada en un entorno CentOS 6.3 con Percona Server 5.5), y he aprovechado para, a la vez que seguía los pasos, acabar de documentar el proceso.

Una de las posibilidades que nos ofrece MySQL (o Percona), es la de montar un entorno en el que se tienen varios servidores, cada uno con una réplica de las bases de datos. De esta manera, el servidor con el rol de máster, es el único que permite lecturas y escrituras, mientras que el resto de servidores, con el rol de slaves, únicamente permiten lecturas, y se encargan de actualizar sus datos con las modificaciones que reciben del master.

Está claro que este tipo de entornos mejora el rendimiento de cualquier aplicación, al repartir la carga de trabajo de la base de datos entre varios servidores. Además, se puede usar un balanceador de carga para los slaves, de manera que podamos incluir más slaves según lo necesitemos.

Partimos de un entorno con MySQL Server instalado en nuestros servidores (vamos a usar un servidor como Master y otro como Slave, a modo de ejemplo). Los MySQL Servers se han iniciado (creando así las tablas de sistema) y pueden tener tuneadas o no, sus configuraciones. Sin embargo, en el ejemplo, no hay bases de datos adicionales, más allá de las que genera el propio sistema al iniciar el servidor. NOTA: No pasaría nada si el master tuviera otras bases de datos, pero lo importante es que los slaves no tengan otras bases de datos, a ser posible, puesto que si algún slave ya tuviera una base de datos también existente en el master, tendríamos problemas si los datos difirieran.

Continuar leyendo «Configuración MySQL Master Slave»

Instalación y configuración de Percona

Percona MySQL ServerPercona es un conocido fork de MySQL que promete aumentar rendimiento y fiabilidad, además de añadir funcionalidades adicionales interesantísimas.

Tenemos varias opciones de instalación de Percona, según nuestras necesidades, pero yo he probado a instalar Percona Server, para montar replicación tipo Master-Slave. Para ello he usado un Centos 6.3 i386, como PC de tests, donde le he instalado un Percona Server 5.5. Dejaré Percona XtraDB-Cluster para otra ocasión.

Requisitos de Percona Server

Desde ya, recomendaría deshabilitar selinux (o configurarlo convenientemente) antes de iniciar este proceso. También deberemos asegurarnos de que la máquina pueda resolver su hostname, revisando el fichero de hosts.

Continuar leyendo «Instalación y configuración de Percona»

Detalles de MySQL Master-Slave

Master Slave databaseMySQL master-slave tiene las siguientes características:

  • Replicación asíncrona: en cuanto se ejecuta una query de modificación en el master, ésta se lanza al momento para ejecutárse en los slaves.
  • La replicación puede basarse en:
    • Statement Based Replication (SBR): ejecuta en los slaves, la sentencia SQL ejecutada en el master.
    • Row Based Replication (RBR): replica en los slaves, únicamente las filas que han cambiado en el master (replica datos en lugar de sentencias que han de ejecutarse).
    • Mixed Based Replication (MBR): una mezcla de las dos anteriores.
    • Se puede verificar el tipo de replicación utilizado, ejecutando en cualquier server:

mysql> show global variables like ‘binlog_format’;
+—————+———–+
| Variable_name | Value |
+—————+———–+
| binlog_format | STATEMENT |
+—————+———–+
1 row in set (0.00 sec)

Continuar leyendo «Detalles de MySQL Master-Slave»

Pasos para migrar un proyecto web

LAMP MigrationMigrar un proyecto web (php/mysql) de un servidor a otro(s) puede parecer un proceso sencillo, pero rara es la vez en la que no salen imprevistos. Por esta razón, prefiero tener bien documentado todo el proceso de migración, antes de empezar, para evitar sobresaltos e ir sobre seguro.

La idea del siguiente proceso, es clonar la base de datos del servidor a migrar al nuevo servidor, y una vez clonada, modificar el código del servidor a migrar para empezar a usar la base de datos del nuevo server en lugar de la que usaba hasta ahora. De esta manera, no se perderán datos cuando se inicie la modificación de las DNS para apuntar al nuevo servidor.

REQUISITOS

  • En el nuevo servidor, abrir (por lo menos) los puertos 22 y 3306 para la IP del servidor a migrar.
  • Apache y MySQL instalados y configurados en el nuevo server, incluído el vhost del proyecto.
  • Resto de dependencias del proyecto instaladas en el nuevo server.

Continuar leyendo «Pasos para migrar un proyecto web»

Optimización de mysql

Apache HTTPEste es un post difícil, y no pretende ni mucho menos, ser una guía definitiva de la optimización de MySQL, si no un mero resumen de lo que podrían ser algunas acciones encaminadas a mejorar el rendimiento de MySQL, basado sobre todo, en las directrices de la documentación oficial. Si tienes pensado aplicar alguna de estas medidas, te recomendaría probarla antes en un entorno de test. 😉

Identificar el cuello de botella

El cuello de botella suele venir por:

  • Búsquedas en el disco duro: actualmente los discos suelen tener una velocidad de búsqueda de menos de 10ms, pudiendo tener un máximo teórico de 100 búquedas por segundo. Distribuyendo los datos en diferentes discos se aumentará el rendimiento.
  • i/o: una vez el disco esté en posición (haya encontrado el segmento con los datos que buscamos) necesitaremos leer los datos. Actualmente un disco entrega información a razón de 10-20MB/s. Se puede montar un entorno en RAID para la lectura en paralelo de múltiples discos, o usar discos con mayor número de IOPS, como los discos SSD.
  • Ciclos de CPU: Se recomienda trabajar con tablas pequeñas para mejorar el rendimiento.

Continuar leyendo «Optimización de mysql»

Instalar y configurar un servidor LAMP

Hoy me lanzo a la piscina con un paso a paso para instalar un servidor LAMP (Linux, Apache, Mysql, Php) y realizar los primeros pasos, en entornos tipo servidor Red Hat (Fedora, CentOS, etc.). Hay muchas formas de hacer ésto, pero la descrita a continuación siempre me suele funcionar:

Primer paso, instalar todos los componentes con yum:

yum install -y httpd php mysql-server mysql php-mysql

Continuar leyendo «Instalar y configurar un servidor LAMP»

Cambiar motor tablas mysql

MySQL EngineEn más de una ocasión, me he encontrado con la necesidad de verificar el motor (innodb o myisam) de las tablas de una determinada base de datos en mysql. Se puede ver el motor usado, seleccionando la base de datos y ejecutando el comando «show table status»:

use mydatabase;
show table status;

También me he encontrado con la necesidad de cambiar varias (o todas) las tablas de un motor a otro. Existe la posibilidad de ejecutar la siguiente sentencia para cambiar el motor de una tabla:

ALTER TABLE mytable ENGINE=InnoDB

Continuar leyendo «Cambiar motor tablas mysql»

Usuarios y permisos MySQL

MysqlYa he escrito algunos posts donde se ha hablado un poco de la administración de usuarios y permisos en MySQL como éste o éste otro. Sin embargo, voy a resumir en un breve post la administración de usuarios y permisos de MySQL.
Podemos ver los usuarios que tenemos en el mysql con el siguiente comando:

mysql> select * from mysql.user;

Esto nos mostrará todos los usuarios definidos en mysql, separando además los usuarios por host (si tenemos un usuario user@localhost y el mismo usuario para acceder desde cualquier host user@’%’, aparecerán dos líneas para este usuario.

Para conocer los permisos que tiene un determinado usuario, se podrá usar:

mysql> show grants for user@’host’

Por ejemplo: mysql> show grants for user@’%’

Continuar leyendo «Usuarios y permisos MySQL»