# rm-rf.es

Múltiples instancias MySQL en un servidor o Cluster

Ya sea dentro de un Cluster o directamente en un servidor estándar, podemos necesitar tener más de una instancia diferenciada de un servicio, en este caso MySQL. Vamos a ver el proceso de instalación y configuración de dos instancias/servidores MySQL dentro de un único servidor.

Lo primero que hacemos es la instalación propiamente dicha de MySQL, ya sea por rpm, yum, apt o compilando. Nosotros bajamos el rpm de MySQL 5.5 y lo instalamos:

# wget http://mysql.mirrors.ovh.net/ftp.mysql.com/Downloads/MySQL-5.5/MySQL-5.5.20-1.linux2.6.x86_64.tar
# tar -xvf MySQL-5.5.20-1.linux2.6.x86_64.tar
# rpm -ivh MySQL-server-5.5.20-1.linux2.6.x86_64.rpm MySQL-client-5.5.20-1.linux2.6.x86_64.rpm

Una vez instalado vamos ver como estructurar el sistema:

  1. Todas las instancias compartirán los binarios y librerías, ubicados en /usr/bin/mysql /usr/lib64/mysql
  2. Cada instancia tendrá su filesystem o directorio en el que almacenar sus ficheros propios de configuración, bases de datos y logs. Si es un cluster se encontrará en una NAS y servido por iSCSI o FC.
    /mysql1
    /mysql1/etc
    /mysql1/data
    /mysql1/data/logs
    /mysql2
    /mysql2/etc
    /mysql2/data
    /mysql2/data/logs
    ...
    ...
  3. Cada instancia tendrá su propio script de arranque:
    /etc/init.d/mysql1
    /etc/init.d/mysql2
    ...
    ...

El punto 1 está hecho ya que tenemos MySQL instalado. Para el punto 2, creamos la estructura de directorios indicada y copiamos en /mysqlX/etc/ el fichero de configuración por defecto de MySQL my.cnf ubicado en /etc:

# cp -p /etc/my.cnf /mysql1/etc/

Para diferenciar cada instancia debemos hacer lo siguiente:

  1. Cada instancia escuchará por una IP distinta. Si comparten IP tendrán que escuchar por puertos distintos.
  2. Cada instancia usará un socket distinto.
  3. Cada instancia tendrá un PID file distinto.
  4. Cada instancia tendrá un datadir distinto.

Así pues, editamos dichos valores en cada my.cnf de cada instancia según requerimientos:

[mysqld]

# Ruta al datadir de cada instancia:
datadir=/mysql1/data

# Puerto de escucha, si las instancias comparten IP
# debe ser distinto en cada una
port=3306

# IP de escucha, si se quiere mantener el mismo puerto TCP
# para todas debe ser única en cada una:
bind-address=10.0.0.110

# Ruta al socket (único por instancia)
socket=/var/tmp/mysql1.sock

Una vez configurados los my.cnf de todas las instancias podemos inicializar e instalar las bases de datos por defecto:

# mysql_install_db --datadir=/mysql1/
# mysql_install_db --datadir=/mysql2/

Ya podríamos arrancar las dos instancias manualmente, únicamente debemos especificar el fichero de configuración:

# /usr/bin/mysqld_safe --defaults-file=/mysql1/etc/my.cnf &
# /usr/bin/mysqld_safe --defaults-file=/mysql2/etc/my.cnf &

Si queremos usar los scripts de arranque en init.d deberemos cambiar los siguientes parámetros:

# If you change base dir, you must also change datadir. These may get
# overwritten by settings in the MySQL configuration files.

# Únicamente si no se especifican en el my.cnf
basedir=
datadir=

Ruta al PID file de cada instancia:

mysqld_pid_file_path=/mysql1/data/mysql1.pid

En el case de arranque añadir el fichero de configuración:

case "$mode" in
  'start')
    # Start daemon

    # Safeguard (relative paths, core dumps..)
    cd $basedir

    echo $echo_n "Starting MySQL"
    if test -x $bindir/mysqld_safe
    then
      # Give extra arguments to mysqld with the my.cnf file. This script
      # may be overwritten at next upgrade.
      mysqld_safe --defaults-file=/mysql1/etc/my.cnf --pid-file="$mysqld_pid_file_path" >/dev/null 2>&1 &
Salir de la versión móvil