jueves, 22 de julio de 2010

Solaris: MySQL y MySQLD_MULTI

Para empezar esto se presentó en el trabajo, se requería que en un solo equipo (T2000) con Solaris 10 se instalara MySQL, eso es sencillo, lo complicado se vino cuando dijeron "Pero a parte necesito 3 instancias más dentro de ese mismo equipo en diferentes puertos".

Ok, pues para poder realizarlo fue una labor de investigación y de andar de foro en foro, descubrí una cosa llamada mysqld_multi en la página de MySQL, después de ver ejemplos y haciendo pruebas, así fue como quedó.

Instalación de MySQL

Descargar de la página de Sunfreeware los siguientes paquetes:

libgcc-3.4.6
openssl-0.9.8f
zlib-1.2.3
ncurses-5.6
mysql-5.0.41

Todos los paquetes descargados vienen comprimidos en gz, lo siguiente es instalar dichos paquetes:

# gunzip *.gz
# pkgadd -d libgcc-3.4.6-sol10-sparc-local
# pkgadd -d openssl-0.9.8f-sol9-sparc-local
# pkgadd -d zlib-1.2.5-sol10-sparc-local
# pkgadd -d ncurses-5.7-sol10-sparc-local
# pkgadd -d mysql-5.0.67-sol10-sparc-local

Esto instalará MySQL sobre /usr/local/mysql.

Se realizan una serie de configuraciones para poder ejecutar el demonio.

# groupadd mysql
# useradd -g mysql -d /export/home/mysql -s /usr/bin/bash mysql
# passwd mysql
# cd /usr/local/mysql
# chown -R mysql .
# chgrp -R mysql .
# ln /usr/bin/hostname /usr/local/bin/hostname
# bin/mysql_install_db --user=mysql
# cp share/mysql/mysql.server /etc/init.d/mysql
# ln -s /etc/init.d/mysql /etc/rc3.d/S99mysql
# ln -s /etc/init.d/mysql /etc/rc0.d/K00mysql
# /etc/init.d/mysql start

Con esto el demonio de MySQL ya se está ejecutando, para efectos posteriores será necesario que se declare en el PATH la ruta de los binarios de la aplicación.

# export PATH=$PATH:/usr/local/mysql/bin

Una vez hecho esto es necesario asignarle la contraseña al root de MySQL por seguridad.

# mysqladmin -u root password 'newpass'

Para probar la configuración podemos accesar a MySQL ejecutando:

# mysql -u root -p

De esta forma el demonio de MySQL esté en ejecución, ahora bien, lo que es necesario hacer para efectos de configurar las demás instancias es crear el archivo de configuración de MySQL, para esto podemos copiar el archivo de ejemplo de un servidor de ejecución medio (my-medium.cnf) a /etc y llamarlo my.cnf para después poderlo editar nosotros.

# cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf

Esto lo que hace es que configura las variables de ejecución de MySQL para las instancias que se ejecuten.

Después de tener el archivo de configuración en la ruta específica podemos editarlo con cualquier editor como vim para poder agregar las líneas en donde especificaremos la cantidad de demonios adyacentes que se ejecutarán, para esto agregamos las siguientes lineas a dicho archivo /etc/my.cnf

[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
user = mysql
password = mismo_pass_mysql_user

[mysqld2]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
socket = /tmp/mysql.sock2
port = 3307
pid-file = /usr/local/mysql/var2/hostname.pid2
datadir = /usr/local/mysql/var2
language = /usr/local/mysql/share/mysql/english
user = mysql

[mysqld3]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /path/to/mysqladmin/mysqladmin
socket = /tmp/mysql.sock3
port = 3308
pid-file = /usr/local/mysql/var3/hostname.pid3
datadir = /usr/local/mysql/var3
language = /usr/local/mysql/share/mysql/english
user = mysql

[mysqld4]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
socket = /tmp/mysql.sock4
port = 3309
pid-file = /usr/local/mysql/var4/hostname.pid4
datadir = /usr/local/mysql/var4
language = /usr/local/mysql/share/mysql/english
user = mysql

Como se mencionó anteriormente en la instalación de inicio de MySQL la ubicación de está quedo en /usr/local por lo que para las demás instancias se utilizarán las mismas rutas de mysqld para levantar las BD y los demonios y solo hay que tomar en cuenta, y es muy importante, que para cada instancia hay que especificar un datadir diferente, en este caso se utilizaron var, var2, var3, ..., varN y obviamente los puertos donde escuchará cada instancia, por default MySQL escucha en el 3306, de ahí podemos partir en orden secuencial por el 3307 para var2, 3308 para var3 y así sucesivamente; de igual forma debemos establecer sockets diferentes para cada instancia.

Una vez realizado esto debemos instalar las BD de MySQL para su ejecución en cada una de las instancias declaradas.

# mysql_install_db --user=mysql --datadir=/usr/local/mysql/var2
# mysql_install_db --user=mysql --datadir=/usr/local/mysql/var3
# mysql_install_db --user=mysql --datadir=/usr/local/mysql/var4

Esto creará en cada datadir las BD por defecto para la correcta ejecución de MySQL en cada puerto.

Con esto las BD ya están creadas y solo resta ejecutar el demonio para su ejecución y uso, esto lo hacemos con mysqld_multi.

# mysqld_multi start 2
# mysqld_multi start 3
# mysqld_multi start 4

Recordemos que la instancia 1 es la de default que se instalo al inicio.

Así entonces las 4 instancias diferentes están en ejecución, podemos ver su estatus utilizando "mysqld_multi report", que mostrará el estatus de cada instancia que crea multi

# MySQL server from group: mysqld2 is running
# MySQL server from group: mysqld3 is running
# MySQL server from group: mysqld4 is running

Y podemos ver los puertos de cada LISTENER haciendo un netstat

# netstat -na | grep LISTEN | grep 33*

*.3306 *.* 0 0 49152 0 LISTEN
*.3307 *.* 0 0 49152 0 LISTEN
*.3308 *.* 0 0 49152 0 LISTEN
*.3309 *.* 0 0 49152 0 LISTEN

Con esto podemos comprobar que se está ejecutando cada instancia de manera correcta.

Para poder accesar a las diferentes BD la forma de hacerlo es para cada instancia:

1 - Default
# mysql -u root -p

2 - MySQLD2
# mysql -u root -S /tmp/mysql.sock2

3 - MySQLD3
# mysql -u root -S /tmp/mysql.sock3

4 - MySQLD4
# mysql -u root -S /tmp/mysql.sock4

Espero les sirva como a mí.

*Serenidad y Paciencia*