Table of Contents

mysqld_multi: Varias instancias de un servidor MySQL

En esta guía se van a presentar dos formas de configurar un servidor Mysql con múltiples instancias gracias a mysqld_multi. La primera sería la forma normal de hacerlo. La segunda posibilidad sería configurando un directorio para que las tablas trabajen en memoria RAM (RAMDisk), de esa forma podemos acelerar tareas al utilizar software como puede ser PHPUnit o cualquier otro software que haga un uso elevado de tablas MySQL.

Múltiples instancias de un servidor MySQL en un mismo sistema con mysqld_multi

El programa mysqld_multi se utiliza para administrar diversos procesos servidor MySQL (mysqld) dentro de una única instalación MySQL. Teniendo cada una de ellas conexiones en diferentes archivos socket en Unix, puertos TCP/IP, directorios, configuración etc. Puede arrancar o parar servidores, o reportar su estado actual. Cuando se necesitan tener varios servicios MySQL utilizando una misma instancia de MySQL, mysqld_multi es la mejor alternativa. Se expone a continuación una configuración muy básica tomando como sistema operativo CentOS, pero debería ser aplicable a cualquier otra distribución GNU/Linux.

Documentación mysqld_multi: http://dev.mysql.com/doc/refman/5.0/es/mysqld-multi.html

Configurar dos instancias (dos servicios: mysqld1 y mysqld2) MySQL editando /etc/my.cnf.

# Mysqld_multi
[mysqld_multi]
mysqld     = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user       = multi_admin
password   = multipass
 
[mysqld1]
socket     = /var/lib/mysql/mysql.sock
port       = 3306
pid-file   = /var/lib/mysql/prueba.pid
datadir    = /var/lib/mysql
language   = /usr/share/mysql/english
user       = mysql
server-id  = 1
 
[mysqld2]
socket     = /var/lib/mysql_phpunit/mysqld_phpunit.sock
port       = 3307
pid-file   = /var/lib/mysql_phpunit/mysqld_phpunit.pid
datadir    = /var/lib/mysql_phpunit
language   = /usr/share/mysql/english
user       = mysql
server-id  = 2

Crear las carpetas correspondientes y base de datos mysql para la segunda instancia del servicio MySQL (/var/lib/mysql_phpunit), el directorio /var/lib/mysql es el utilizado por defecto, por lo que no es necesario crearlo en este caso.

mkdir /var/lib/mysql_phpunit
chown mysql:mysql /var/lib/mysql_phpunit/
mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql_phpunit/

NOTA: De no utilizar la versión predeterminada de MySQL como primera instancia, se debería de ejecutar ese mismo comando pero indicando el directorio de esa primera instancia que se quiera utilizar.

Configuración de las diversas instancias si se quiere permitir la parada del servicio con el comando service. Las dos instancias deben tener el mismo usuario / password y el privilegio de usuario SHUTDOWN.

#mysqld1
mysql -S /var/lib/mysql/mysql.sock -u root -proot --execute='GRANT SHUTDOWN ON *.* TO "multi_admin"@"localhost" IDENTIFIED BY "multipass"'
 
#mysqld2
mysql -S /var/lib/mysql_phpunit/mysqld_phpunit.sock  -u root -proot --execute='GRANT SHUTDOWN ON *.* TO "multi_admin"@"localhost" IDENTIFIED BY "multipass"'

Método alternativo (cuando no se quiere utilizar el comando service).

mysqladmin -h127.0.0.1 -P3307 -uroot -p shutdown
mysqladmin -h127.0.0.1 -P3306 -uroot -p shutdown

Establecer la clave de root para el servicio mysqld2. (Lo mismo se tendría que hacer con la primera instancia si no estuviera configurada).

mysqladmin -S /var/lib/mysql_phpunit/mysqld_phpunit.sock -u root password root

Para hacer login en la instancia mysqld2 con el usuario root.

mysql -S /var/lib/mysql_phpunit/mysqld_phpunit.sock  -u root -proot

Ejemplo: Realizar un volcado en la base de datos stash de mysqld2.

mysql -S /var/lib/mysql_phpunit/mysqld_phpunit.sock  -u root -proot stash < fichero.sql

Crear un script de arranque (Fichero /etc/init.d/mysqld_multi).

#!/bin/sh
 
basedir=/usr
bindir=/usr/bin
 
if test -x $bindir/mysqld_multi
then
  mysqld_multi="$bindir/mysqld_multi";
else
  echo "Can't execute $bindir/mysqld_multi from dir $basedir";
  exit;
fi
 
case "$1" in
    'start' )
        "$mysqld_multi" start $2
        ;;
    'stop' )
        "$mysqld_multi" stop $2
        ;;
    'report'|'status' )
        "$mysqld_multi" report $2
        ;;
    'restart' )
        "$mysqld_multi" stop $2
        "$mysqld_multi" start $2
        ;;
    *)
        echo "Uso: $0 {start|stop|report|status|restart}" >&2
        ;;
esac

Se desactiva el servicio mysqld en el arranque y se pone el nuevo servicio (mysqld_multi), para que al arrancar el sistema se inicien todas las instancias si así se desea.

chkconfig mysql off
chkconfig --add mysqld_multi
chkconfig mysqld_multi on

Consultar el estado, arrancar y parar la primera instancia del servidor MySQL (mysqld1), si se quiere indicar la segunda, valdría con cambiar el 1 por un 2.

service mysqld_multi status 1
service mysqld_multi start 1
service mysqld_multi stop 1

Múltiples instancias de un servidor MySQL en un mismo sistema con mysqld_multi en RAMDisk

Esta información es complementaria a la comentada anteriormente, simplemente se cambia el directorio de trabajo de la tablas, de disco duro a memoria RAM para la instancia mysqld2 (/var/lib/mysql_phpunit/).

Recordemos que los datos que se almacenen en esta instancia son perecederos, en cuanto se reinicie el sistema estos son eliminados. También tenemos que calcular detenidamente cuanto espacio debemos utilizar.

Preparar el entorno RAMDisk

Creamos un directorio RAMDisk de 1Gb en /var/lib/mysql_phpunit.

mkdir /var/lib/mysql_phpunit
chown mysql:mysql /var/lib/mysql_phpunit/
mount -o size=1G,gid=mysql,uid=mysql -t tmpfs none /var/lib/mysql_phpunit/
mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql_phpunit/

Editamos el fichero /etc/fstab para que se monte al reiniciar el sistema.

Datei /etc/fstab bearbeiten.
tmpfs                   /var/lib/mysql_phpunit  tmpfs   rw,uid=mysql,gid=mysql,size=1G,mode=755 0    0

Editar el fichero /etc/rc.d/rc.local para que al reiniciar el sistema se configure el entorno automáticamente.

/usr/bin/mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql_phpunit/
service mysqld_multi start 2
sleep 2
/usr/bin/mysqladmin -S /var/lib/mysql_phpunit/mysqld_phpunit.sock -u root password root
sleep 2
/usr/bin/mysql -S /var/lib/mysql/mysql.sock -u root -proot --execute='GRANT SHUTDOWN ON *.* TO "multi_admin"@"localhost" IDENTIFIED BY "multipass"'
sleep 2
/usr/bin/mysql -S /var/lib/mysql_phpunit/mysqld_phpunit.sock  -u root -proot --execute='GRANT SHUTDOWN ON *.* TO "multi_admin"@"localhost" IDENTIFIED BY "multipass";'