MySQL Cluster no Debian 6

De Tesliuk Wiki
Ir para: navegação, pesquisa

Tabela de conteúdo

Sobre este tutorial

Este tutorial foi escrito baseado baseado no tutorial http://tech.jocke.no/2011/03/13/mysql-cluster-how-to-with-load-balancing-failover/ , foram feitos apenas alguns ajustes leves referentes a caminhos e acrescentada algumas informações além é claro da tradução , este tutorial tem um efeito apenas didático, o mesmo trabalha utilizando tres servidores, sendo 2 para o cluster e um terceiro para o mysql-proxy (responsavel pelo failover) , esta solução não é recomendada em produção, você deve utilizar como solução minima dois servidores para o processo do ndbd (este é referente ao storage), dois servidores para o ndb_mgm (este é quem gerencia os dados para o storage), e pelo menos dois servidores frontend (a instancia do mysql em si), ou seja, minimo de 6 servidores, o storage ndb pode ser ampliado para até quatro servidores, o ndb_mgm dois são suficientes, os servidores mysql você pode adicionar quantos quiser enquanto os storages possuirem espaço e capacidade (desempenho) para suportar.

É muito importante que após você concluir o tutorial você leia a documentação sobre o mysql cluster para conhecer melhor os parametros que você pode usar, este tutorial tem o intuito apenas de apresentar a solução a você de forma simplificada (e funcional).

Algumas das informações que eu expliquei neste pedaço do tutorial vão fazer mais sentido para você quando você concluir o tutorial e tudo estiver funcionando, então aproveite o conteúdo e divirta-se!


Pre requisitos

apt-get install vim libaio1

Download

O download pode ser feito diretamente no site do MySQL , eu por questao de facilidade utilizei o acesso a um mirror direto, faça da forma que achar mais conveniente.

cd /usr/src
wget -c ftp://mirror.anl.gov/pub/mysql/Downloads/MySQL-Cluster-7.3/mysql-cluster-gpl-7.3.1-debian6.0-x86_64.deb

Agora vamos proceder com a instalação do pacote

dpkg -i mysql-cluster-gpl-7.3.1-debian6.0-x86_64.deb

Instalando o Node

Este procedimento instalará os arquivos em /opt/ , desta forma precisamos após a instalação, adicionar em nossas bibliotecas o diretório , para isso abra seu arquivo /etc/ld.so.conf e acrescente o diretório /opt/mysql/server-5.6/lib ao arquivo, após este processo execute o comando ldconfig

Agora vamos criar usuários e diretórios necessários.

groupadd mysql
useradd -d /opt/mysql/ -s /bin/false -g mysql mysql
chown -R mysql.mysql /opt/mysql
mkdir /opt/mysql/server-5.6/data

Agora vamos criar a estrutura principal de tabelas.

cd /opt/mysql/mysql-5.6/
./scripts/mysql_install_db --user=mysql --no-defaults --datadir=/opt/mysql/server-5.6/data/

Para que nosso servidor seja iniciado no boot do sistema, devemos executar o procedimento abaixo.

cp support-files/mysql.server /etc/init.d/
chmod +x /etc/init.d/mysql.server
update-rc.d mysql.server defaults

Configurando o Node

Agora que temos todos os arquivos em seus devidos locais, vamos fazer a configuração, crie o arquivo /etc/my.cnf e acrescente o conteúdo abaixo.

[mysqld]
basedir=/opt/mysql/server-5.6
datadir=/opt/mysql/server-5.6/data
event_scheduler=on
default-storage-engine=ndbcluster
ndbcluster
ndb-connectstring=node0.mycluster,node1.mycluster   

key_buffer = 512M
key_buffer_size = 512M
sort_buffer_size = 512M
read_buffer_size = 512M

[mysql_cluster]
ndb-connectstring=node0.mycluster,node1.mycluster  

Veja que utilizamos como nome dos hosts node0.mycluster e node1.mycluster, é necessário acrescentar estas entradas no arquivo /etc/hosts com os respectivos endereços ip de cada servidor

Preparando o ndb_mgmd

O NDB é o nosso sistema de compartilhamento de dados por assim dizer, é graças a ele que os servidores trabalham os mesmos dados.

mkdir /opt/mysql/server-5.6/cluster_data/
chown mysql.mysql /opt/mysql/server-5.6/cluster_data/

Agora crie o arquivo /opt/mysql/server-5.6/cluster_data/config.ini com o conteúdo abaixo.

[NDBD DEFAULT]
NoOfReplicas=2
DataDir=/opt/mysql/server-5.6/cluster_data/
# Atencao aos parametros abaixo para nao exceder os limites de seu sistema
DataMemory=8G
IndexMemory=4G

[MYSQLD DEFAULT]
[NDB_MGMD DEFAULT]
[TCP DEFAULT]

# Servidores de gerenciamento
[NDB_MGMD]
HostName=node0.mycluster    
NodeId=1

[NDB_MGMD]
HostName=node1.mycluster    
NodeId=2

# Servidores de storage (Pode ser utilizado servidores separados para storage e sql) 
[NDBD]
HostName=node0.mycluster    
NodeId=3
[NDBD]
HostName=node1.mycluster    
NodeId=4

# Clientes MySQL
# Deixe em branco para permitir troca rapida de servidores
[MYSQLD]
[MYSQLD]

Verifique os valores adicionados nas variaveis Datamemory e Indexmemory pois estes valores serão alocados quando o serviço for iniciado, então é necessário ter esta memoria, pois caso contrario o sistema poderá informar que a tabela está cheia, para maiores informações verifique a documentação [1] e [2]

Iniciando o ndb_mgmd

cd /opt/mysql/server-5.6/
./bin/ndb_mgmd -f /opt/mysql/server-5.6/cluster_data/config.ini --initial --config-dir=/opt/mysql/server-5.6/cluster_data/

Claro este procedimento deve ser executado nos dois nodes

Agora vamos iniciar o ndb

cd /opt/mysql/server-5.6/
./bin/ndbd --initial

Execute o procedimento nos dois servidores

Iniciando o mysql

Agora vamos iniciar o servidor MySQL , para isso utilize o comando abaixo

/etc/init.d/mysql.server start

Se você seguiu o procedimento de forma correta não deverá ter nenhum problema, agora para que nossa referencia de autenticação, usuários e permissões fiquem identicas em todos os servidores, devemos alterar a engine das tabelas do mysql.

Para acessar o mysql digite:

/opt/mysql/server-5.6/bin/mysql 

No shell digite a seguinte sequencia de comandos.

 ALTER TABLE mysql.user ENGINE=NDBCLUSTER;
 ALTER TABLE mysql.db ENGINE=NDBCLUSTER;
 ALTER TABLE mysql.columns_priv ENGINE=NDBCLUSTER;
 ALTER TABLE mysql.procs_priv ENGINE=NDBCLUSTER;
 ALTER TABLE mysql.proxies_priv ENGINE=NDBCLUSTER;
 SET GLOBAL event_scheduler=1;
 CREATE EVENT `mysql`.`flush_priv_tables` ON SCHEDULE EVERY 30 second ON COMPLETION PRESERVE DO FLUSH PRIVILEGES;


Com este procedimento executa em uma das maquinas, você pode ir na outra, e digitar os seguintes comandos.

use mysql;
show create table db;

Você verá a string de criação da tabela e desta forma verá que a mesma ja consta como engine ndbcluster, oque significa que os dois estão sincronizados.

Verificando status

Para verificar o status, podemos utilizar o comando ndb_mgm

/opt/mysql/server-5.6/bin/ndb_mgm

No shell do ndb_mgm , digite o comando show, e você verá o status do cluster atualmente, veja um exemplo abaixo.

ndb_mgm> show
Connected to Management Server at: node0.mycluster:1186
Cluster Configuration
---------------------
[ndbd(NDB)]	2 node(s)
id=3	@10.1.10.100  (mysql-5.6.10 ndb-7.3.1, Nodegroup: 0, Master)
id=4	@10.1.10.101  (mysql-5.6.10 ndb-7.3.1, Nodegroup: 0)

[ndb_mgmd(MGM)]	2 node(s)
id=1	@10.1.10.100 (mysql-5.6.10 ndb-7.3.1)
id=2	@10.1.10.101  (mysql-5.6.10 ndb-7.3.1)

[mysqld(API)]	2 node(s)
id=5	@10.1.10.100 (mysql-5.6.10 ndb-7.3.1)
id=6	@10.1.10.101  (mysql-5.6.10 ndb-7.3.1)


Testando

Agora para testar faremos o seguinte, acesse um dos dois mysql's e então execute os seguintes comandos.

create database cluster;
create table tabela1 ( id int(10) NOT NULL AUTO_INCREMENT PRIMARY KEY, coluna1 varchar(20) NOT NULL, coluna2 varchar(20) NOT NULL, coluna3 varchar(20) ) ENGINE=NDBCLUSTER;
INSERT INTO tabela1 VALUES ( NULL,'valor c1', 'valor c2', 'valor c3' );

Agora vá no outro servidor, e verifique se os dados estão de acordo.

Para isso digite os seguintes comandos.

use cluster;
show tables;
select * from tabela1;

Se tudo foi correto, você verá a informação que você inseriu no servidor anterior.


Agora vamos fazer um teste diferente, se voce digitar um show database, voce vera o seu node 1 marcado como master quando voce checa o status no cli do ndb_mgm, então vamos supor que temos um problema em nossa maquina, para simular isso, vamos apenas eliminar o processo do ndbd, faça isso na maquina que atualmente é o master

killal ndbd

Agora na segunda maquina faça o comando status no cli do ndb_mgm , você deverá ter uma saída similar a abaixo.

ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]	2 node(s)
id=3 (not connected, accepting connect from node0.mycluster)
id=4	@10.1.10.101  (mysql-5.6.10 ndb-7.3.1, Nodegroup: 0, Master)

[ndb_mgmd(MGM)]	2 node(s)
id=1	@10.1.10.100  (mysql-5.6.10 ndb-7.3.1)
id=2	@10.1.10.101 (mysql-5.6.10 ndb-7.3.1)

[mysqld(API)]	2 node(s)
id=5	@10.1.10.100  (mysql-5.6.10 ndb-7.3.1)
id=6	@10.1.10.101  (mysql-5.6.10 ndb-7.3.1)

Veja que como derrubamos apenas o ndb o segundo host assumiu a posição de master

Agora acesse novamente o mysql, e faça alguma alteração na sua tabela.

use cluster;
INSERT INTO tabela1 VALUES ( NULL,'valor 3 c1', 'valor 3 c2', 'valor 3 c3' );
select * from tabela1;

Sua tabela irá se parecer como a abaixo.

+----+------------+--------------+---------------+
| id | coluna1    | coluna2      | coluna3       |
+----+------------+--------------+---------------+
|  3 | valor 3 c1 | valor 3 c2   | valor 3 c3    |
|  1 | valor c1   | valor c2     | valor c3      |
|  2 | valor id2  | valor c2 id2 | valor c3, id2 |
+----+------------+--------------+---------------+

Vamos agora iniciar o ndbd em nosso host

/opt/mysql/server-5.6/bin/ndbd

Ao retornar você podera checar no comando status que o host nao voltou a ser master, entrando no mysql, você poderá verificar que os dados da tabela estão de acordo (sincronizados), você pode fazer uma nova alteração que tudo funcionará corretamente.

NDBD e NDBD_MGM na inicializacao

É necessário criarmos os scripts de inicialização para o ndbd e para o ndbd_mgm, para isso segue abaixo os scripts referentes /etc/init.d/ndbd

#!/bin/bash
# Linux Standard Base comments
### BEGIN INIT INFO
# Provides:          ndbd
# Required-Start:    $local_fs $network $syslog $remote_fs
# Required-Stop:     $local_fs $network $syslog $remote_fs
# Should-Start:
# Should-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: mysql cluster manager client
# Description:       mysql cluster manager client
### END INIT INFO
 
ndbd_bin=/opt/mysql/server-5.6/bin/ndbd
 
if ! test -x $ndbd_bin; then
	echo "Can't execute $ndbd_bin";
	exit;
fi
 
start_ndbd(){
	number_of_ndbd_pids=`ps aux|grep -iv "grep"|grep -i "/opt/mysql/server-5.6/bin/ndbd"|wc -l`
	if [ $number_of_ndbd_pids -eq 0 ]; then
		$ndbd_bin
		echo "ndbd started."
	else
		echo "ndbd is already running."
	fi
}
 
stop_ndbd(){
	number_of_ndbd_pids=`ps aux|grep -iv "grep"|grep -i "/opt/mysql/server-5.6/bin/ndbd"|wc -l`
        if [ $number_of_ndbd_pids -ne 0 ]; then
		ndbd_pids=`pgrep ndbd`
        	for ndbd_pid in $(echo $ndbd_pids); do
                	kill $ndbd_pid 2> /dev/null
        	done
 
		number_of_ndbd_pids=`ps aux|grep -iv "grep"|grep -i "/opt/mysql/server-5.6/bin/ndbd"|wc -l`
 
        	if [ $number_of_ndbd_pids -eq 0 ]; then
                	echo "ndbd stopped."
        	else
                	echo "Could not stop ndbd."
        	fi
	else
		echo "ndbd is not running."
	fi
}
 
 
case "$1" in
    'start' )
        start_ndbd
        ;;
    'stop' )
	stop_ndbd
        ;;
    'restart' )
        stop_ndbd
	start_ndbd
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}" >&2
        ;;
esac

Agora coloque o mesmo na inicialização

chmod +x /etc/init.d/ndbd
update-rc.d ndbd defaults


/etc/init.d/ndbd_mgm

#!/bin/bash
# Linux Standard Base comments
### BEGIN INIT INFO
# Provides:          ndb_mgmd
# Required-Start:    $local_fs $network $syslog $remote_fs
# Required-Stop:     $local_fs $network $syslog $remote_fs
# Should-Start:
# Should-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: mysql cluster manager
# Description:       mysql cluster manager
### END INIT INFO
 
ndb_mgmd=/opt/mysql/server-5.6/bin/ndb_mgmd
config_file=/opt/mysql/server-5.6/cluster_data/config.ini
config_dir=/opt/mysql/server-5.6/cluster_data
 
if ! test -x $ndb_mgmd; then
	echo "Can't execute $ndb_mgmd"	
	exit;
fi
 
start_ndb_mgmd(){
	number_of_ndb_mgmd_pids=`ps aux|grep -iv "grep"|grep -i "$ndb_mgmd"|wc -l`
	if [ $number_of_ndb_mgmd_pids -eq 0 ]; then
		$ndb_mgmd -f $config_file --config-dir=$config_dir
		echo "ndb_mgmd started."
	else
		echo "ndb_mgmd is already running."
	fi
}
 
stop_ndb_mgmd(){
	number_of_ndb_mgmd_pids=`ps aux|grep -iv "grep"|grep -i "$ndb_mgmd"|wc -l`
        if [ $number_of_ndb_mgmd_pids -ne 0 ]; then
		ndb_mgmd_pids=`pgrep ndb_mgmd`
        	for ndb_mgmd_pid in $(echo $ndb_mgmd_pids); do
                	kill $ndb_mgmd_pid 2> /dev/null
        	done
 
		number_of_ndb_mgmd_pids=`ps aux|grep -iv "grep"|grep -i "$ndb_mgmd"|wc -l`
 
        	if [ $number_of_ndb_mgmd_pids -eq 0 ]; then
                	echo "ndb_mgmd stopped."
        	else
                	echo "Could not stop ndb_mgmd."
        	fi
	else
		echo "ndb_mgmd is not running."
	fi
}
 
 
case "$1" in
    'start' )
        start_ndb_mgmd
        ;;
    'stop' )
	stop_ndb_mgmd
        ;;
    'restart' )
        stop_ndb_mgmd
	start_ndb_mgmd
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}" >&2
        ;;
esac

Agora coloque na inicialização

chmod +x /etc/init.d/ndbd_mgm
update-rc.d ndbd_mgm defaults

Faça um boot nas maquinas e verifique se tudo está iniciando de forma adequada.

Failover e LoadBalance

Todo o conteúdo acima é referente a criação do cluster em si, uma ferramenta interessante para ser utilizada o mysql-proxy que permite a você fazer o balanceamento e o failover entre os nodes do seu cluster, é importante lembrar que os hosts de destino neste caso são os SQL's (os servidores onde o servidor mysql estará sendo executado).

Para criar este proxy utilize uma terceira maquina, e nesta maquina instale com o comando abaixo.

apt-get install mysql-proxy

Agora crie o arquivo de configuração /etc/mysql-proxy.conf e coloque o conteudo abaixo no arquivo.

[mysql-proxy]
daemon = true
keepalive = true
proxy-address = mysql-proxy.mycluster:3306

# node0
proxy-backend-addresses = node0.mycluster:3306

# node1
proxy-backend-addresses = node1.mycluster:3306

Lembre-se que neste caso será necessário colocar no /etc/hosts as entradas referentes

Altere a permissão do arquivo para 600

chmod 600 /etc/mysql-proxy.conf

Altere agora o arquivo /etc/default/mysql-proxy altere a variavel ENABLED para true e a variavel OPTIONS acrescente a opção --defaults-file=/etc/mysql-proxy.conf

ENABLED="true"
OPTIONS="--defaults-file=/etc/mysql-proxy.conf"

Vamos voltar em um dos nossos hosts e executar no mysql o comando abaixo.

grant all on cluster.* to 'testuser'@'%' identified by 't3st3';

Assim criamos um usuário com permissão na nossa tabela, agora pegue seu client mysql e tente se conectar ao proxy

mysql -utestuser -pt3st3 -hmysql-proxy.mycluster

Ao se conectar, você poderá executar o comando show databases, e você verá nosso banco cluster, faça um insert na tabela em questão (tabela1) e verifique se a informação é devidamente replicada.

Agora você pode fazer alguns testes para averiguar sobre o failover e o balanceamento .

Ferramentas pessoais
Espaços nominais
Variantes
Ações
Navegação
Telefonia
Linux
Outros
Ferramentas