Cluster multi-master com MariaDB 10.1 + Galera

Publicado por Bruno Ricardo Rodrigues (última atualização em 20/09/2016)

[ Hits: 3.335 ]

Homepage: Não Possuo

Download MariaDB 10.1 + Galera Cluster.sh




O Galera Cluster possui replicação síncrona, ou seja, todos os nós do cluster vão estar sempre sincronizados permitindo que a aplicação leia e grave em qualquer nó do cluster, e sem se preocupar com a integridade dos dados.

Para facilitar esta tarefa de criação do cluster, criei este script tem por objetivo instalar e configurar um cluster de MariaDB 10.1 utilizando o Galera Cluster no CentOS 7.

Vale ressaltar que a documentação do Galera Cluster recomenda no mínimo 3 nós, por este motivo o script irá solicitar os dados de 3 hosts.

Utilizando o Script:

1 - Baixe o Script no primeiro nó do cluster;
2 - No primeiro host gere a chave SSH com o usuário root com o comando ssh-keygen (Não crie senha);
3 - Compartilhe a chave SSH com os demais hosts, para isso basta utilizar o comando ssh-copy-id root@<IP_HOST>;
4 - Antes de iniciar o Script, tenha em mãos o hostname desejado dos nós do cluster e o IP. O Script se encarregará de alterar o hostname das máquinas e criar as entradas no /etc/hosts;
5 - Inicie o script e responda as informações solicitadas.

Após o término, seu cluster estará pronto para ser utilizado. Para mais informações basta ler a documentação do MariaDB e o Galera Cluster.

Observações: caso o cluster seja desativado (Todos os nós pararem), o primeiro nó do cluster deve ser iniciado com o comando galera_new_cluster, os demais podem ser iniciados normalmente com systemctl start mariadb.

  



Esconder código-fonte

#!/bin/bash

#### DEPENDÊNCIAS ####

type dialog &>> /tmp/script.log
if [ "$?" = 0 ]; then
        echo -e " \033[0;32m Dependencias Instaladas... \033[0m"
else
        echo -e " \033[0;32m Dependencias não encontradas. Instalando Dependencias... \033[0m"
        yum install -y dialog > /dev/null
        echo -e " \033[0;32m Dependencias Instaladas... \033[0m"
fi

#### INSTALAÇÃO ####

instacao_func()
{
cat > /tmp/$HOST_VAR.sh << COD
#!/bin/bash

sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
cat > /etc/init.d/firewall.sh << EOM
#!/bin/bash

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
EOM
chmod +x /etc/init.d/firewall.sh
chmod +x /etc/rc.d/rc.local
echo "/etc/init.d/firewall.sh" >> /etc/rc.d/rc.local

echo $THIS_HOST > /etc/hostname
/bin/hostname $THIS_HOST

cat > /etc/yum.repos.d/MariaDB.repo << EOM
# MariaDB 10.1 CentOS repository list - created 2016-07-22 17:17 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOM

cat >> /etc/hosts << EOM
$IP1   $HOST_IP1
$IP2   $HOST_IP2
$IP3   $HOST_IP3
EOM

echo -e " \033[0;32m Instalando o MariaDB 10.1 + Galera Cluster no $THIS_HOST... \033[0m"
yum install -y socket MariaDB-server MariaDB-client rsync galera &>> /tmp/script.log
echo -e " \033[0;32m Iniciando o MariaDB no $THIS_HOST... \033[0m"
systemctl start mariadb
echo -e " \033[0;32m Configurando senhas e usuários no MariaDB no $THIS_HOST... \033[0m"
echo -e "\ny\n$ROOT_PASS\n$ROOT_PASS\ny\ny\ny\ny\n" | mysql_secure_installation &>> /tmp/script.log
mysql -u root -p$ROOT_PASS -e "GRANT USAGE ON *.* TO '$USU_REPL'@'%' IDENTIFIED BY '$USU_PASS'; GRANT ALL PRIVILEGES ON *.* TO '$USU_REPL'@'%'; FLUSH PRIVILEGES;"
echo -e " \033[0;32m Configurando o Galera Cluster no $THIS_HOST... \033[0m"
systemctl stop mariadb

cat > /etc/my.cnf.d/server.cnf << EOM
[galera]
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://$IP1,$IP2,$IP3"
wsrep_cluster_name="My_Galera_Cluster"
wsrep_node_address="$THIS_IP"
wsrep_node_name="$THIS_HOST"
wsrep_sst_method=rsync
wsrep_sst_auth=$USU_REPL:$USU_PASS
 
binlog_format=row
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1
query_cache_size=0
query_cache_type=0
bind-address=0.0.0.0
datadir=/var/lib/mysql
innodb_log_file_size=100M
innodb_file_per_table
innodb_flush_log_at_trx_commit=2
EOM
COD
chmod +x /tmp/$HOST_VAR.sh
}


exit_func()
{
   dialog --title 'Aviso' --msgbox 'Operação cancelada!' 5 35
   clear
   exit
}

#### INICIO DO PROGRAMA ####

dialog --title 'Obrigado!' --msgbox 'Designed and Developed by Bruno Ricardo Rodrigues.' 5 55
dialog --title 'Requisitos!!' --yesno '1 - Este script DEVE ser executado em um dos nós do cluster\n2 - Este host deve conseguir se conectar com os demais nós sem senha(utilizando chave SSH)\n\nOs requisitos foram atendidos?' 0 0
[ $? -eq 1 ] && exit_func
HOST_IP1=$( dialog --stdout --inputbox 'Informe o hostname do PRIMEIRO host (ATUAL):' 0 55 'mariadb-01')
[ $? -eq 1 ] && exit_func
IP1=`ifconfig $INTERFACE | sed -n '2 p' | awk '{print $2}'`
IP1=$( dialog --stdout --inputbox 'Informe o IP do PRIMEIRO host (ATUAL):' 0 55 $IP1)
[ $? -eq 1 ] && exit_func
HOST_IP2=$( dialog --stdout --inputbox 'Informe o hostname do SEGUNDO host:' 0 55 'mariadb-02')
[ $? -eq 1 ] && exit_func
IP2=$( dialog --stdout --inputbox 'Informe o IP do SEGUNDO host:' 0 55 )
[ $? -eq 1 ] && exit_func
HOST_IP3=$( dialog --stdout --inputbox 'Informe o hostname do TERCEIRO host:' 0 55 'mariadb-03')
[ $? -eq 1 ] && exit_func
IP3=$( dialog --stdout --inputbox 'Informe o IP do TERCEIRO host:' 0 55 )
[ $? -eq 1 ] && exit_func
USU_REPL=$( dialog --stdout --inputbox 'Informe o usuário utilizado para a replicação:' 0 55 'galera')
[ $? -eq 1 ] && exit_func
USU_PASS=$( dialog --stdout --inputbox 'Informe a senha utilizada para a replicação:' 0 55 )
[ $? -eq 1 ] && exit_func
ROOT_PASS=$( dialog --stdout --inputbox 'Informe a senha do usuário root no MariaDB:' 0 55 )
[ $? -eq 1 ] && exit_func

dialog --title 'Informações do Cluster' --yesno 'Nome HOST 1             ='$HOST_IP1'\nIP HOST 1               ='$IP1'\nNome HOST 2             ='$HOST_IP2'\nIP HOST 2               ='$IP2'\nNome HOST 3             ='$HOST_IP3'\nIP HOST 4               ='$IP3'\n\nUsuário de replicação   ='$USU_REPL'\nSenha de replicação     ='$USU_PASS'\nSenha do root no DB     ='$ROOT_PASS'\n\nAs informações acima estão corretas?' 0 0
[ $? -eq 1 ] && exit_func

THIS_IP=$IP1
THIS_HOST=$HOST_IP1
HOST_VAR=host1
instacao_func

THIS_IP=$IP2
THIS_HOST=$HOST_IP2
HOST_VAR=host2
instacao_func

THIS_IP=$IP3
THIS_HOST=$HOST_IP3
HOST_VAR=host3
instacao_func

clear
sh /tmp/host1.sh
ssh $IP2 'bash -s' < /tmp/host2.sh
ssh $IP3 'bash -s' < /tmp/host3.sh
echo -e " \033[0;32m Iniciando o Cluster \033[0m"
galera_new_cluster
echo -e " \033[0;32m Cluster iniciado \033[0m"
echo -e " \033[0;32m $HOST_IP1 ingressou no cluster! \033[0m"
ssh $IP2 'systemctl start mariadb'
echo -e " \033[0;32m $HOST_IP2 ingressou no cluster! \033[0m"
ssh $IP3 'systemctl start mariadb'
echo -e " \033[0;32m $HOST_IP3 ingressou no cluster! \033[0m"
sleep 5

rm -rf /tmp/host*sh

dialog --title 'Sucesso' --msgbox 'Parabéns! O cluster já está funcionando.\n\nLogs podem ser encontrados em /tmp/script.log' 8 55
mysql -u root -p$ROOT_PASS -e "SHOW STATUS LIKE 'WSREP%'"

Scripts recomendados

Firewall Dinamico

SlackelsPKG 1.0 - uma réplica de gerenciador de pacotes para o Slackware Current

Instalando docker

Backup do Firebird por data - via rede ou local

Script de alteração do sources.list


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts