MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

Implantação em várias nuvens para replicação MariaDB usando o WireGuard

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.