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

FJZQPDDJWQNY6N9.png

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

ConectandoSQL.png
Validando.png

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

ConsultaTabela.png

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.