sexta-feira, 1 de julho de 2011

Múltiplas Instâncias do MySQL

O MySQL server possui um recurso interesse de permitir a carga de várias instâncias no mesmo servidor (realizado através do mysqld_multi), permitindo assim que você possa distribuir a carga de acesso em seus ESQUEMAS DE BANCO através destas várias portas, como por exemplo a 3306/TCP (porta padrão MySQL) e a 3307/TCP. Abaixo segue um pequeno manual de como as configurações necessárias, lembrando que esta configuração foi aplicada na Distro Debian versão 6.

:: Instalar o MySQL
# apt-get install mysql-server
# /etc/init.d/mysql stop

:: Configurando o Ambiente
# mkdir /mysql && mkdir /mysql/socket && mkdir /mysql/pids && mkdir /mysql/3306 && mkdir /mysql/3307
# chown mysql:mysql /mysql –R

:: Instalando a Base Padrão do MySQL
# mysql_install_db --basedir=/usr/ --datadir=/mysql/3306
# mysql_install_db --basedir=/usr/ --datadir=/mysql/3307

:: Criando o arquivo de configuração
# vim /mysql/my.cnf

[mysqld_multi]
mysqld           = /usr/bin/mysqld_safe
mysqladmin       = /usr/bin/mysqladmin
user             = multi
password         = multi

[mysqld1]
socket           = /mysql/socket/mysql1.sock
port             = 3306
pid-file         = /mysql/pids/pidfile1.pid
datadir          = /mysql/data/3306
language         = /usr/share/mysql/english
user             = multi

[mysqld2]
socket          = /mysql/socket/mysql2.sock
port            = 3307
pid-file        = /mysql/pids/pidfile2.pid
datadir         = /mysql/data/3307
language        = /usr/share/mysql/english
user            = multi

Obs.: mysqld# informa o número do Grupo MySQL; user e password são dados do usuário que possui permissão de realizar SHUTDOWN do MySQL.

:: Conectando as bases e configurando as permissões
O usuário e a senha padrão das bases récem criadas são:

Usuário: root
Senha: {vazia/nenhuma/semNada}

# mysql –u root –p –S /mysql/socket/mysql1.sock
mysql> GRANT SHUTDOWN ON *.* TO multi@localhost IDENTIFIED BY 'multi';
mysql> FLUSH PRIVILEGES;
mysql> quit

# mysql –u root –p –S /mysql/socket/mysql2.sock
mysql> GRANT SHUTDOWN ON *.* TO multi@localhost IDENTIFIED BY 'multi';
mysql> FLUSH PRIVILEGES;
mysql> quit

Nota: Observe que realizamos a conexão com o MySQL através do SOCKET e não da PORTA.

:: Subindo as Instâncias
# mysqld_multi –defaults-file=/mysql/my.cnf start 1
# mysqld_multi –defaults-file=/mysql/my.cnf start 2

Obs.: O parâmetro 1 no final do comando indica qual instância será iniciada. Ex.: [mysqld1]. Para subir todas as instâncias ao mesmo tempo basta remover o número do GRUPO no final do comando. Os logs do mysqld_multi são gravados /var/log/syslog.

:: Checando a carga
# mysqld_multi –defaults-file=/mysql/my.cnf report 1
# mysqld_multi –defaults-file=/mysql/my.cnf report 2

ou, para todas

# mysqld_multi –defaults-file=/mysql/my.cnf report

ou

# netstat –na | grep /mysql/socket

:: Shutdown das Instâncias
# mysqld_multi –defaults-file=/mysql/my.cnf stop 1
# mysqld_multi –defaults-file=/mysql/my.cnf stop 2

ou, para todas:

# mysqld_multi –defaults-file=/mysql/my.cnf stop

:: Configurando o Startup Automático
Como realizamos a instalação do mysql via apt-get, todas as configurações para o startup automático foram criadas, faltando apenas a alteração do arquivo /etc/init.d/mysql para atender nossas necessidades. Então:
# vim /etc/init.d/mysql

#!/bin/bash

case "${1:-''}" in
  'start')
        mysqld_multi --defaults-file=/mysql/my.cnf start
        ;;

  'stop')
        mysqld_multi --defaults-file=/mysql/my.cnf stop
        ;;

  'restart')
        stop
        start
        ;;

  'status')
        mysqld_multi --defaults-file=/mysql/my.cnf report
        ;;

  *)
        echo "Usage: $SELF start|stop|restart|status"
        exit 1
        ;;
esac

:: Pontos Importantes
Mesmo configurando outro arquivo my.cnf a inicialização do MySQL lê os parâmetros de configuração do arquivo /etc/mysql/my.cnf, então para liberar acesso as conexões remotas não se esqueça de comentar a linha:

[...]
# bind-address          = 127.0.0.1
[...]

Para acessar o MySQL através da porta devemos também alterar este arquivo, informado em qual socket queremos realizar a conexão, assim fiz as seguintes alterações na seção  [cliente]:

[...]
[client]
port            = 3306
socket          = /mysql/socket/mysql1.sock
# port          = 3307
# socket        = /mysql/socket/mysql2.sock
[...]

Desta forma você pode adicionar/remover o comentário de qual instância será realizada a conexão e acessar através do comando:

# mysql -u root -p

Você pode consultar a documentação do mysqld_multi  acessando http://dev.mysql.com/doc/refman/5.0/en/mysqld-multi.html ou # man mysqld_multi

Até a próxima.

Nenhum comentário: