Cluster multi-master com MariaDB 10.1 + Galera

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

[ Hits: 3.318 ]

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

Plugin BACULA

facilitando e organizando a configuracao do mrtg com ipfm

Montando pendrive

Criar usuários com ponto (nome.usuario) no Slackware

rc.mailMyIp - Informa seu IP externo para o Gmail


  

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