Nesta postagem do blog, veremos como implantar uma configuração de replicação MariaDB em um ambiente de várias nuvens. Suponha que nosso aplicativo principal esteja localizado na AWS, é a melhor ideia configurar a AWS como o datacenter principal que hospeda o mestre MariaDB. O escravo MariaDB será hospedado no GCP e o ClusterControl está localizado dentro da infraestrutura de nuvem privada da empresa no escritório. Eles estão todos conectados via túnel VPN simples e seguro WireGuard na faixa de IP de 192.168.50.0/24. O ClusterControl usará essa interface VPN para realizar implantação, gerenciamento e monitoramento em todos os nós do banco de dados remotamente.
Aqui estão nossos anfitriões:
- Amazon Web Service (AWS):
- Anfitrião:MariaDB master
- IP público:54.151.183.93
- IP privado:10.15.3.170/24 (VPC)
- IP da VPN:192.168.50.101
- SO:Ubuntu 18.04.4 LTS (Bionic)
- Especificação:t2.medium (2 vCPU, 4 GB de memória)
- Google Cloud Platform (GCP):
- Host:MariaDB slave
- IP público:35.247.147.95
- IP privado:10.148.0.9/32
- IP da VPN:192.168.50.102
- SO:Ubuntu 18.04.4 LTS (Bionic)
- Especificação:n1-standard-1 (1 vCPU, 3,75 GB de memória)
- Nuvem Privada VMware (Escritório):
- Host:ClusterControl
- IP público:3.25.96.229
- IP privado:192.168.55.138/24
- IP da VPN:192.168.50.100
- SO:Ubuntu 18.04.4 LTS (Bionic)
- Especificação:VMWare de nuvem privada (2 CPUs, 2 GB de RAM)
Nossa arquitetura final ficará assim:
O mapeamento de host em /etc/hosts em todos os nós é:
3.25.96.229 cc clustercontrol office.mydomain.com
54.151.183.93 aws1 db1 mariadb1 db1.mydomain.com
35.247.147.95 gcp2 db2 mariadb2 db2.mydomain.com
Configurar o mapeamento de host simplificará nosso gerenciamento de resolução de nomes entre hosts, onde usaremos o nome do host em vez do endereço IP ao configurar os peers do Wireguard.
Instalando o WireGuard para VPN
Como todos os servidores estão em três locais diferentes, que são conectados apenas via rede pública, vamos configurar o encapsulamento VPN entre todos os nós usando o Wireguard. Adicionaremos uma nova interface de rede em cada nó para esta comunicação com a seguinte configuração de IP interno:
- 192.168.50.100 - ClusterControl (nuvem privada do Office)
- 192.168.50.101 - MariaDB mestre (AWS)
- 192.168.50.102 - MariaDB slave (GCP)
Instale o Wireguard conforme mostrado nesta página em todos os três nós:
$ sudo add-apt-repository ppa:wireguard/wireguard
$ sudo apt-get upgrade
$ sudo apt-get install wireguard
Para hosts Ubuntu, apenas aceite o valor padrão se solicitado durante a instalação do wireguard. Observe que é muito importante atualizar o sistema operacional para a versão mais recente para que o wireguard funcione.
Reinicie o host para carregar o módulo do kernel Wireguard:
$ reboot
Depois de pronto, configure nosso mapeamento de host dentro de /etc/hosts em todos os nós para algo assim:
$ cat /etc/hosts
3.25.96.229 cc clustercontrol office.mydomain.com
54.151.183.93 aws1 db1 mariadb1 db1.mydomain.com
35.247.147.95 gcp2 db2 mariadb2 db2.mydomain.com
127.0.0.1 localhost
Configurando o Wireguard
** Todas as etapas desta seção devem ser executadas em todos os nós, a menos que especificado de outra forma.
1) Em todos os nós como usuário root, gere uma chave privada e atribua uma permissão segura
$ umask 077
$ wg genkey > /root/private
2) Em seguida, adicione uma nova interface chamada wg0:
$ ip link add wg0 type wireguard
3) Adicione o endereço IP correspondente à interface wg0:
Para o host "cc":
$ ip addr add 192.168.50.100/32 dev wg0
Para o host "aws1":
$ ip addr add 192.168.50.101/32 dev wg0
Para o host "gcp2":
$ ip addr add 192.168.50.102/32 dev wg0
4) Faça a porta de escuta para 55555 e atribua a chave privada gerada à interface Wireguard:
$ wg set wg0 listen-port 55555 private-key /root/private
5) Abra a interface de rede:
$ ip link set wg0 up
6) Quando a interface estiver ativa, verifique com o comando "wg":
(cc1)$ wg
interface: wg0
public key: sC91qhb5QI4FjBZPlwsTLNIlvuQqsALYt5LZomUFEh4=
private key: (hidden)
listening port: 55555
(aws1) $ wg
interface: wg0
public key: ZLdvYjJlaS56jhEBxWGFFGprvZhtgJKwsLVj3zGonXw=
private key: (hidden)
listening port: 55555
(gcp2) $wg
interface: wg0
public key: M6A18XobRFn7y7u6cg8XlEKy5Nf0ZWqNMOw/vVONhUY=
private key: (hidden)
listening port: 55555
Agora estamos prontos para conectar todos eles.
Conectando hosts via interface Wireguard
Agora vamos adicionar todos os nós como peers e permitir que eles se comuniquem. O comando requer 4 parâmetros importantes:
- colega :chave pública para o host de destino.
- ips permitidos :endereço IP do host com o qual tem permissão para se comunicar.
- endpoint :o host e o Wireguard e a porta de escuta (aqui configuramos todos os nós para usar a porta 55555).
- manter-se persistente :Como os firewalls NAT e stateful rastreiam "conexões", se um peer atrás de NAT ou um firewall deseja receber pacotes de entrada, ele deve manter o mapeamento NAT/firewall válido, enviando periodicamente pacotes keepalive. O valor padrão é 0 (desativar).
Portanto, no host cc, precisamos adicionar "aws1" e "gcp2":
$ wg set wg0 peer ZLdvYjJlaS56jhEBxWGFFGprvZhtgJKwsLVj3zGonXw= allowed-ips 192.168.50.101/32 endpoint aws1:55555 persistent-keepalive 25
$ wg set wg0 peer M6A18XobRFn7y7u6cg8XlEKy5Nf0ZWqNMOw/vVONhUY= allowed-ips 192.168.50.102/32 endpoint gcp2:55555 persistent-keepalive 25
No host "aws1", precisamos adicionar o cc e o gcp2:
$ wg set wg0 peer sC91qhb5QI4FjBZPlwsTLNIlvuQqsALYt5LZomUFEh4= allowed-ips 192.168.50.100/32 endpoint cc:55555 persistent-keepalive 25
$ wg set wg0 peer M6A18XobRFn7y7u6cg8XlEKy5Nf0ZWqNMOw/vVONhUY= allowed-ips 192.168.50.102/32 endpoint gcp2:55555 persistent-keepalive 25
No host "gcp2", precisamos adicionar o cc e aws1:
$ wg set wg0 peer sC91qhb5QI4FjBZPlwsTLNIlvuQqsALYt5LZomUFEh4= allowed-ips 192.168.50.100/32 endpoint gcp2:55555 persistent-keepalive 25
$ wg set wg0 peer ZLdvYjJlaS56jhEBxWGFFGprvZhtgJKwsLVj3zGonXw= allowed-ips 192.168.50.101/32 endpoint aws1:55555 persistent-keepalive 25
De cada host, tente fazer ping uns aos outros e certifique-se de obter algumas respostas:
(cc)$ ping 192.168.50.101 # aws1
(cc)$ ping 192.168.50.102 # gcp2
(aws1)$ ping 192.168.50.101 # cc
(aws1)$ ping 192.168.50.102 # gcp2
(gcp2)$ ping 192.168.50.100 # cc
(gcp2)$ ping 192.168.50.101 # aws1
Verifique a saída "wg" para verificar o status atual. Aqui está a saída do ponto de vista do host cc:
interface: wg0
public key: sC91qhb5QI4FjBZPlwsTLNIlvuQqsALYt5LZomUFEh4=
private key: (hidden)
listening port: 55555
peer: M6A18XobRFn7y7u6cg8XlEKy5Nf0ZWqNMOw/vVONhUY=
endpoint: 35.247.147.95:55555
allowed ips: 192.168.50.102/32
latest handshake: 34 seconds ago
transfer: 4.70 KiB received, 6.62 KiB sent
persistent keepalive: every 25 seconds
peer: ZLdvYjJlaS56jhEBxWGFFGprvZhtgJKwsLVj3zGonXw=
endpoint: 54.151.183.93:55555
allowed ips: 192.168.50.101/32
latest handshake: 34 seconds ago
transfer: 3.12 KiB received, 9.05 KiB sent
persistent keepalive: every 25 seconds
Todo o status parece bom. Podemos ver os endpoints, o status do handshake e o status da largura de banda entre os nós. É hora de tornar essa configuração persistente em um arquivo de configuração, para que ela possa ser carregada facilmente pelo WireGuard. Vamos armazená-lo em um arquivo localizado em /etc/wireguard/wg0.conf. Primeiramente, crie o arquivo:
$ touch /etc/wireguard/wg0.conf
Em seguida, exporte a configuração de tempo de execução para a interface wg0 e salve-a em wg0.conf usando o comando "wg-quick":
$ wg-quick save wg0
Verifique o conteúdo do arquivo de configuração (exemplo para host "cc"):
(cc)$ cat /etc/wireguard/wg0.conf
[Interface]
Address = 192.168.50.100/24
ListenPort = 55555
PrivateKey = UHIkdA0ExCEpCOL/iD0AFaACE/9NdHYig6CyKb3i1Xo=
[Peer]
PublicKey = ZLdvYjJlaS56jhEBxWGFFGprvZhtgJKwsLVj3zGonXw=
AllowedIPs = 192.168.50.101/32
Endpoint = 54.151.183.93:55555
PersistentKeepalive = 25
[Peer]
PublicKey = M6A18XobRFn7y7u6cg8XlEKy5Nf0ZWqNMOw/vVONhUY=
AllowedIPs = 192.168.50.102/32
Endpoint = 35.247.147.95:55555
PersistentKeepalive = 25
O comando wg-quick fornece alguns atalhos interessantes para gerenciar e configurar as interfaces do WireGuard. Use esta ferramenta para ativar ou desativar a interface de rede:
(cc)$ wg-quick down wg0
[#] ip link delete dev wg0
(cc)$ wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 192.168.50.100/24 dev wg0
[#] ip link set mtu 8921 up dev wg0
Finalmente, instruímos o systemd a carregar esta interface logo durante a inicialização:
$ systemctl enable [email protected]
Created symlink /etc/systemd/system/multi-user.target.wants/[email protected] → /lib/systemd/system/[email protected]
Neste ponto, nossa configuração de VPN está concluída e agora podemos iniciar a implantação.
Implantando a replicação MariaDB
Uma vez que todos os nós da arquitetura podem se comunicar, é hora de prosseguir com a etapa final para implantar nossa Replicação MariaDB usando o ClusterControl.
Instale o ClusterControl no cc:
(cc)$ wget https://severalnines.com/downloads/cmon/install-cc
(cc)$ chmod 755 install-cc
(cc)$ ./install-cc
Siga as instruções até que a instalação seja concluída. Em seguida, precisamos configurar um SSH sem senha do host ClusterControl para ambos os nós MariaDB. Primeiramente, gere uma chave SSH para o usuário root:
(cc)$ whoami
root
(cc)$ ssh-keygen -t rsa # press Enter for all prompts
Copie o conteúdo da chave pública em /root/.ssh/id_rsa.pub nos nós MariaDB em /root/.ssh/authorized_keys. Isso pressupõe que o root tem permissão para SSH para o host. Caso contrário, configure o daemon SSH para permitir isso adequadamente. Verifique se o SSH sem senha está configurado corretamente. No nó ClusterControl, execute o comando SSH remoto e certifique-se de obter uma resposta correta sem nenhum prompt de senha:
(cc)$ ssh 192.168.50.101 "hostname"
aws1
(cc)$ ssh 192.168.50.102 "hostname"
gcp2
Agora podemos implantar nossa replicação MariaDB. Abra um navegador da web e vá para ClusterControl UI em http://public_ip_of_CC/clustercontrol, crie um login de usuário super admin. Vá para Deploy -> MySQL Replication e especifique o seguinte:
Em seguida, escolha "MariaDB" como fornecedor com a versão 10.4. Especifique também a senha de root do MariaDB. Na seção "Definir topologia", especifique o endereço IP do Wireguard (wg0) dos nós MariaDB, semelhante à captura de tela a seguir:
Clique em Implantar e aguarde até que a implantação seja concluída. Feito isso, você deverá ver o seguinte:
Nossa configuração de replicação MariaDB agora está sendo executada em três locais diferentes (escritório, AWS e GCP), conectados a um túnel VPN seguro entre nós.