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";'