sql >> Base de Datos >  >> RDS >> MariaDB

Implementación de varias nubes para la replicación de MariaDB mediante WireGuard

En esta publicación de blog, veremos cómo implementar una configuración de replicación de MariaDB en un entorno de múltiples nubes. Supongamos que nuestra aplicación principal se encuentra en AWS; la mejor idea es configurar AWS como el centro de datos principal que aloja el maestro de MariaDB. El esclavo MariaDB se alojará en GCP y ClusterControl se encuentra dentro de la infraestructura de nube privada de la empresa en la oficina. Todos están conectados a través del túnel VPN simple y seguro de WireGuard en el rango de IP de 192.168.50.0/24. ClusterControl usará esta interfaz VPN para realizar la implementación, administración y monitoreo en todos los nodos de la base de datos de forma remota.

Aquí están nuestros anfitriones:

  • Servicio web de Amazon (AWS):
    • Anfitrión:maestro de MariaDB
    • IP pública:54.151.183.93
    • IP privada:10.15.3.170/24 (VPC)
    • IP VPN:192.168.50.101
    • SO:Ubuntu 18.04.4 LTS (Biónico)
    • Especificación:t2.medium (2 vCPU, 4 GB de memoria)
  • Google Cloud Platform (GCP): 
    • Host:esclavo MariaDB
    • IP pública:35.247.147.95
    • IP privada:10.148.0.9/32
    • IP VPN:192.168.50.102
    • SO:Ubuntu 18.04.4 LTS (Biónico)
    • Especificación:n1-standard-1 (1 vCPU, 3,75 GB de memoria)
  • Nube privada de VMware (oficina):
    • Anfitrión:ClusterControl
    • IP pública:3.25.96.229
    • IP privada:192.168.55.138/24
    • IP de VPN:192.168.50.100
    • SO:Ubuntu 18.04.4 LTS (Biónico)
    • Especificación:Nube privada VMWare (2 CPU, 2 GB de RAM)

Nuestra arquitectura final se verá así:

La asignación de host en /etc/hosts en todos los nodos es:

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 el mapeo de hosts simplificará nuestra gestión de resolución de nombres entre hosts, donde usaremos el nombre de host en lugar de la dirección IP al configurar los pares de Wireguard.

Instalación de WireGuard para VPN

Dado que todos los servidores están en tres lugares diferentes, que solo están conectados a través de una red pública, vamos a configurar un túnel VPN entre todos los nodos usando Wireguard. Agregaremos una nueva interfaz de red en cada nodo para esta comunicación con la siguiente configuración de IP interna:

  • 192.168.50.100 - ClusterControl (nube privada de Office)
  • 192.168.50.101 - Maestro de MariaDB (AWS)
  • 192.168.50.102 - esclavo de MariaDB (GCP)

Instalar Wireguard como se muestra en esta página en los tres nodos:

$ sudo add-apt-repository ppa:wireguard/wireguard
$ sudo apt-get upgrade
$ sudo apt-get install wireguard

Para hosts de Ubuntu, simplemente acepte el valor predeterminado si se le solicita durante la instalación de wireguard. Tenga en cuenta que es muy importante actualizar el sistema operativo a la última versión para que funcione wireguard.

Reinicie el host para cargar el módulo kernel de Wireguard:

$ reboot

Una vez arriba, configure nuestro mapeo de host dentro de /etc/hosts en todos los nodos para algo como esto:

$ 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

Configuración de Wireguard

** Todos los pasos de esta sección deben realizarse en todos los nodos, a menos que se especifique lo contrario.

1) En todos los nodos como usuario raíz, genere una clave privada y asigne un permiso seguro

$ umask 077
$ wg genkey > /root/private

2) Luego, agregue una nueva interfaz llamada wg0:

$ ip link add wg0 type wireguard

3) Agregue la dirección IP correspondiente a la interfaz wg0:

Para host "cc":

$ ip addr add 192.168.50.100/32 dev wg0

Para el host "aws1":

$ ip addr add 192.168.50.101/32 dev wg0

Para el host "gcp2":

$ ip addr add 192.168.50.102/32 dev wg0

4) Haga que el puerto de escucha sea 55555 y asigne la clave privada generada a la interfaz Wireguard:

$ wg set wg0 listen-port 55555 private-key /root/private

5) Abra la interfaz de red:

$ ip link set wg0 up

6) Una vez que la interfaz esté activa, verifique con el 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

Ahora estamos listos para conectarlos a todos.

Conexión de hosts a través de la interfaz Wireguard

Ahora vamos a agregar todos los nodos como pares y permitirles comunicarse entre sí. El comando requiere 4 parámetros importantes:

  • compañero :clave pública para el host de destino.
  • ips-permitidas :dirección IP del host con el que se permite comunicarse.
  • punto final :El host y Wireguard y el puerto de escucha (aquí configuramos todos los nodos para usar el puerto 55555).
  • persistente-keepalive :Debido a que NAT y los firewalls con estado realizan un seguimiento de las "conexiones", si un par detrás de NAT o un firewall desea recibir paquetes entrantes, debe mantener válida la asignación de NAT/firewall mediante el envío periódico de paquetes keepalive. El valor predeterminado es 0 (deshabilitar).

Por lo tanto, en host cc, debemos agregar "aws1" y "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

En el host "aws1", necesitamos agregar cc y 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

En el host "gcp2", necesitamos agregar cc y 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, intente hacer ping entre sí y asegúrese de obtener algunas respuestas:

(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 la salida "wg" para verificar el estado actual. Aquí está la salida desde el punto de vista de 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 el estado se ve bien. Podemos ver los puntos finales, el estado del protocolo de enlace y el estado del ancho de banda entre los nodos. Es hora de hacer que esta configuración sea persistente en un archivo de configuración, para que WireGuard pueda cargarla fácilmente. Lo almacenaremos en un archivo ubicado en /etc/wireguard/wg0.conf. En primer lugar, cree el archivo:

$ touch /etc/wireguard/wg0.conf

Luego, exporte la configuración de tiempo de ejecución para la interfaz wg0 y guárdela en wg0.conf usando el comando "wg-quick":

$ wg-quick save wg0

Verifique el contenido del archivo de configuración (ejemplo 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

Command wg-quick proporciona algunos atajos geniales para administrar y configurar las interfaces de WireGuard. Utilice esta herramienta para activar o desactivar la interfaz de red:

(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, le indicamos a systemd que cargue esta interfaz justo durante el inicio:

$ systemctl enable [email protected]
Created symlink /etc/systemd/system/multi-user.target.wants/[email protected] → /lib/systemd/system/[email protected]

En este punto, nuestra configuración de VPN está completa y ahora podemos comenzar la implementación.

Implementación de la replicación de MariaDB

Una vez que todos los nodos de la arquitectura puedan comunicarse entre sí, es hora de continuar con el paso final para implementar nuestra replicación de MariaDB mediante ClusterControl.

Instalar ClusterControl en cc:

(cc)$ wget https://severalnines.com/downloads/cmon/install-cc
(cc)$ chmod 755 install-cc
(cc)$ ./install-cc

Siga las instrucciones hasta que se complete la instalación. A continuación, debemos configurar un SSH sin contraseña desde el host de ClusterControl a ambos nodos de MariaDB. En primer lugar, genere una clave SSH para el usuario root:

(cc)$ whoami
root
(cc)$ ssh-keygen -t rsa # press Enter for all prompts

Copie el contenido de la clave pública en /root/.ssh/id_rsa.pub en los nodos de MariaDB en /root/.ssh/authorized_keys. Esto supone que la raíz tiene permiso para SSH al host. De lo contrario, configure el demonio SSH para permitir esto en consecuencia. Verifique que SSH sin contraseña esté configurado correctamente. En el nodo ClusterControl, ejecute el comando SSH remoto y asegúrese de obtener una respuesta correcta sin solicitar la contraseña:

(cc)$ ssh 192.168.50.101 "hostname"
aws1
(cc)$ ssh 192.168.50.102 "hostname"
gcp2

Ahora podemos implementar nuestra replicación de MariaDB. Abra un navegador web y vaya a la interfaz de usuario de ClusterControl en http://public_ip_of_CC/clustercontrol, cree un inicio de sesión de usuario superadministrador. Vaya a Implementar -> Replicación de MySQL y especifique lo siguiente:

Luego, elija "MariaDB" como proveedor con la versión 10.4. Especifique también la contraseña raíz de MariaDB. En la sección "Definir topología", especifique la dirección IP de Wireguard (wg0) de los nodos MariaDB, similar a la siguiente captura de pantalla:

Haga clic en Implementar y espere hasta que se complete la implementación. Una vez hecho esto, debería ver lo siguiente:

Nuestra configuración de replicación de MariaDB ahora se ejecuta en tres ubicaciones diferentes (oficina, AWS y GCP), conectadas con un túnel VPN seguro entre nodos.