SnapDragon's Cluster Projetct: Banco De Dados Distribuído
by jumahelena11 in Circuits > Linux
82 Views, 1 Favorites, 0 Comments
SnapDragon's Cluster Projetct: Banco De Dados Distribuído
Neste tutorial irá ser mostrado como implementar um cluster de MySqL.
Pré-Requisitos
Para este turorial, serão necessários um total de três computadores: dois para os nodes SQL (ndbd) e um para o Cluster Manager (ndb_mgmd) e servidor/cliente do MySQL (mysqld e mysql).
No datacenter do DigitalOcean serão necessários três droplets Ubuntu 18.04 com rede privada habilitados e um usuário não-root com privilégios SUDO, em https://cloud.digitalocean.com/login.
Neste tutorial utilizaremos os seguintes IPs para os nodes do cluster:
198.51.100.0 MySQL Cluster 01
198.51.100.1 MySQL Cluster 02
198.51.100.2 Cluster Manager & MySQL server
Instalação E Configuração Do Cluster Manager
Para instalar o Cluster Manager é necessário
pegar o instalador .deb do site oficial do MySQL Cluster em https://dev.mysql.com/downloads/cluster/.
Neste local deve-se selecionar o SO utilizado, no caso do tutorial Ubuntu Linux 18.04 (x86, 64-bit) em Ubuntu Linux -> Ubuntu Linux 18.04 (x86, 64-bit), DEB Package NDB Management Server (https://dev.mysql.com/downloads/file/?id=486567) e coloque-o no seu Cluster Manager Droplet, abra a pasta onde o deixou pelo terminal e baixe-o com:
$ wget https://dev.mysql.com/get/Downloads/MySQL-Cluster-...
Instale-o com o comando:
$ sudo dpkg -i mysql-cluster-community-management-server_7.6.6-1ubuntu18.04_amd64.deb
Agora é necessário configurar o ndb_mgmd antes de rodar, essa configuração irá garantir a sincronização e distribuição de carga entre os nodes. O Cluster Management deve ser sempre a primeira aplicação a ser rodada em qualquer cluster MySQL. Essa configuração ficará em /var/lib/mysql-cluster/config.ini.
Para isso, crie o diretório em /var/lib/mysql-cluster com o comando:
$ sudo mkdir /var/lib/mysql-cluster
E edite-a com:
$ sudo nano /var/lib/mysql-cluster/config.ini
Coloque o seguinte texto:
[ndbd default] # Que afetam todos os datanodes
NoOfReplicas=2 # Número de replicas
[ndb_mgmd] # Management process options:
hostname=198.51.100.2 # Hostname of the managerdatadir=/var/lib/mysql-cluster # Diretorio dos LOGS
[ndbd]
hostname=198.51.100.0 # Hostname/IP do primeiro datanode
NodeId=2 # Node ID deste datanode
datadir=/usr/local/mysql/data # Diretorio remoto dos arquivos
[ndbd]
hostname=198.51.100.1 # Hostname/IP do segundo datanode
NodeId=3 # Node ID deste datanode
datadir=/usr/local/mysql/data # Diretorio remoto dos arquivos
[mysqld]# SQL node options:
hostname=198.51.100.2 # No caso o MySQL server/client está na mesma Droplet do cluster manager
Confira que os IPs das droplets estejam iguais as configuradas. No arquivo acima é possível colocar componentes adicionais como data nodes (ndbd) ou server nodes (mysql) ao colocar as instancias da sessão apropriada.
Podemos agora iniciar o manager executando o ndb_mgmd binário e especificar seu arquivo de configuração com a flag -f:
$ sudo ndb_mgmd -f /var/lib/mysql-cluster/config.ini
A saída deve ficar assim:
MySQL Cluster Management Server mysql-5.7.22 ndb-7.6.6
2018-07-25 21:48:39 [MgmtSrvr] INFO -- The default config directory '/usr/mysql-cluster' does not exist. Trying to create it...
2018-07-25 21:48:39 [MgmtSrvr] INFO -- Successfully created config directory
Com isso, significa que o Cluster Management foi instalado e está rodando na sua Droplet. Idealmente, o serviço deve começar automaticamente ao iniciar o SO, para isso iremos criar o serviço systemd, porem é necessário antes finalizar o processo:
$ sudo pkill -f ndb_mgmd
Agora edite o systemd com:
$ sudo nano /etc/systemd/system/ndb_mgmd.service
E coloque o código:
[Unit]
Description=MySQL NDB Cluster Management Server
After=network.target auditd.service
[Service]
Type=forking
ExecStart=/usr/sbin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
Agora carregue novamente as configurações do systemd com:
$ sudo systemctl daemon-reload
Habilite o serviço que criamos:
$ sudo systemctl enable ndb_mgmd
E comece o serviço:
$ sudo systemctl start ndb_mgmd
Confirme se o serviço NDB Cluster Management está rodando:
$ sudo systemctl status ndb_mgmd
Sua saída deve ser esta:
ndb_mgmd.service - MySQL NDB Cluster Management Server
Loaded: loaded (/etc/systemd/system/ndb_mgmd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2018-07-26 21:23:37 UTC; 3s ago
Process: 11184 ExecStart=/usr/sbin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini (code=exited, status=0/SUCCESS)
Main PID: 11193 (ndb_mgmd)
Tasks: 11 (limit: 4915)
CGroup: /system.slice/ndb_mgmd.service
└─11193 /usr/sbin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
O que significa que o MySQL Cluster Management está rodando como um serviço systemd.
Iremos adicionar as regras de firewall para permitir conexões externas de ambos os data nodes:
$ sudo ufw allow from 198.51.100.0
$ sudo ufw allow from 198.51.100.1
Sua saída deve ser a seguinte:
Rule added
Instalando E Configurando Os Data Nodes
Esses comandos devem ser realizados em ambos os data nodes.
Para instalar os binários dos data nodes, de forma que eles comuniquem com o Cluster Manager, precisamos pegar o .deb da pagina do MySQL.
Da mesma forma que o Cluster Management, vá em Ubuntu Linux -> Ubuntu Linux 18.04 (x86, 64-bit), DEB Package NDB Data Node Binaries (https://dev.mysql.com/downloads/file/?id=486562) e coloque-o no seu Cluster Node, abra a pasta onde o deixou pelo terminal e baixe-o com:
$cd ~
$ wget https://dev.mysql.com/get/Downloads/MySQL-Cluster...
Porém antes de instalá-lo, é necessário instalar uma dependência (ibclass-methodmaker-perl):
$ sudo apt update
$ sudo apt install libclass-methodmaker-perl
Instalar o binário utilizando o dpkg:
$ sudo dpkg -i mysql-cluster-community-data-node_7.6.6-1ubuntu18.04_amd64.deb
A sua configuração fica no caminho padrão do MySQL, /etc/my.cnf. Crie o arquivo:
$ sudo nano /etc/my.cnf
E os parâmetros de configuração:
[mysql_cluster]
# Options for NDB Cluster processes:
ndb-connectstring=198.51.100.2 # location of cluster manager
Especificar o local do Cluster Management é a única configuração necessária para o nddb iniciar, o resto das configurações vem diretamente do manager.
No nosso exemplo, o data node irá encontrar sua pasta de configuração em /usr/local/mysql/data de acordo com a configuração do manager. Antes de iniciar o daemon, vamos criar esta pasta no node:
$ sudo mkdir -p /usr/local/mysql/data
Iniciamos o data node com:
$ sudo ndbd
A saída deve ser assim:
2018-07-18 19:48:21 [ndbd] INFO -- Angel connected to '198.51.100.2:1186'
2018-07-18 19:48:21 [ndbd] INFO -- Angel allocated nodeid: 2
O data node NDB foi instalado e está rodando. Devemos também permitir as conexões externas do outro cluster MySQL na rede privada:
$ sudo ufw allow from 198.51.100.0
$ sudo ufw allow from 198.51.100.2
A saída deve ser:
Rule added
Seu data node agora pode comunicar com seu Cluster Manager e com seu outro data node.
Como no servidor, iremos configurar o daemon para iniciar automaticamente ao ligar o SO. Da mesma forma matamos o serviço ativo:
$ sudo pkill -f ndbd
Abra o editor systemd com:
$ sudo nano /etc/systemd/system/ndbd.service
E coloque o código:
[Unit]
Description=MySQL NDB Data Node Daemon
After=network.target auditd.service
[Service]
Type=forking
ExecStart=/usr/sbin/ndbd
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
Carregue novamente a configuração do systemd com o daemon-reload:
$ sudo systemctl daemon-reload
Habilitamos o serviço:
$ sudo systemctl enable ndbd
E iniciamos o serviço:
$ sudo systemctl start ndbd
Para verificar se o serviço de Cluster Manager está rodando:
$ sudo systemctl status ndbd
Sua saída deverá ser esta:
ndbd.service - MySQL NDB Data Node Daemon
Loaded: loaded (/etc/systemd/system/ndbd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2018-07-26 20:56:29 UTC; 8s ago
Process: 11972 ExecStart=/usr/sbin/ndbd (code=exited, status=0/SUCCESS)
Main PID: 11984 (ndbd)
Tasks: 46 (limit: 4915)
CGroup: /system.slice/ndbd.service
├─11984 /usr/sbin/ndbd
└─11987 /usr/sbin/ndbd
O que indica que o Cluster de Data Node MySQL está rodando como serviço systemd. Seu data node deverá estar completamente funcional e apto a conectar no Cluster Manager.
Lembre de repetir estes passos para o outro node (ou quantos forem configurados).
Verificando a Instalação Do Cluster
Para verificar a instalação do MySQL Cluster, log no seu cluster manager e abra o cliente MySQL com o seguinte comando (usuário root).
$ mysql -u root -p
Deverá aparecer uma saída assim:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.22-ndb-7.6.6 MySQL Cluster Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Uma vez dentro do cliente MySQL digite o seguinte comando
Mysql> SHOW ENGINE NDB STATUS \G
Você deverá ver informações sobre o cluster NDB começando com os parâmetros de conexão:
*************************** 1. row ***************************
Type: ndbcluster
Name: connection
Status: cluster_node_id=4, connected_host=198.51.100.2, connected_port=1186, number_of_data_nodes=2, number_of_ready_data_nodes=2, connect_count=0
. . .
Isso indica que você conectou ao seu Cluster SQL.
Note que o número de ready_data_nodes: 2. Essa redundância permite que o cluster MySQL continue operando mesmo de um de seus data nodes falhe. Também significa que suas consultas SQL serão carregadas de forma balanceada entre os dois data nodes.
Você pode tentar desligar um dos data nodes para testar a estabilidade do cluster, o teste mais simples (e melhor neste caso) é reiniciar um dos data nodes para testar o processo de recuperação automático. O número de ready_data_nodes: deverá mudar para 1 e de volta para 2 quando o computador reiniciar e o serviço subir.
Para sair do prompt MySQL basta digitar quit ou CTRL+D.
Inserindo Dados No MySQL Cluster
Para demonstrar a funcionalidade do cluster, vamos criar uma tabela utilizando o NDB e inserir algum dado de amostra. Note que para utilizar a funcionalidade do cluster, a engine tem que explicitamente ser NDB. Se utilizar a InnoDB (padrão) ou outra engine, não irá utilizar o cluster.
Vamos criar uma database chamada testecluster com o comando:
Mysql > CREATE DATABASE testecluster;
Mude para a base:
Mysql > USE testecluster;
Agora crie uma tabela chamada tabela_teste:
Mysql > CREATE TABLE tabela_teste (name VARCHAR(20), value VARCHAR(20)) ENGINE=ndbcluster;
Note que especificamos o nbcluster para que seja utilizado o cluster.
Agora inserir dados:
INSERT INTO tabela_test (name,value) VALUES('Juma','Sistemas Distribuidos');
Para verificar que o dado foi inserido utilize o select:
SELECT * FROM tabela_test;
Quando você insere dados em uma tabela ndbcluster, o cluster carrega as consultas de forma balanceada entre todos os data nodes. Isso melhora a performance e estabilidade do seu banco.
Você pode configurar a engine padrão para ndbcluster no arquivo my.cnf que editamos anteriormente. Com isso você não terá que especificar a engine ao criar as tabelas.