sql >> Base de Datos >  >> RDS >> PostgreSQL

Multi-DC PostgreSQL:configuración de un nodo en espera en una ubicación geográfica diferente a través de una VPN

Anteriormente, escribimos sobre la configuración de un clúster de base de datos distribuida geográficamente mediante la replicación de MySQL. Esta vez, se trata de PostgreSQL. Configurar un clúster distribuido geográficamente para PostgreSQL no es un concepto nuevo y la topología es bastante común.

Para lograr una alta disponibilidad, las organizaciones y las empresas están dispersando sus nodos de base de datos para que cuando ocurra un evento catastrófico en una región específica (que afecte su centro de datos) tenga sus nodos en espera disponibles para la conmutación por error.

Esta es una práctica muy común (usar este tipo de topología) como parte de los planes de Continuidad comercial y Recuperación ante desastres de su organización. Este tipo de topología elimina tener un único punto de falla (SPOF). Un requisito común, especialmente si tiene un RPO bajo y un tiempo de actividad más alto (si es posible en 99.999999999%).

En este blog, tomaré una implementación simple sobre cómo hacer esto usando ClusterControl. ClusterControl es un software de gestión y automatización sin agentes para clústeres de bases de datos. Ayuda a implementar, monitorear, administrar y escalar su servidor/clúster de base de datos directamente desde la interfaz de usuario de ClusterControl.

La configuración arquitectónica deseada

El resultado objetivo aquí es implementar de manera eficiente en un entorno seguro. Para hacer esto, es importante que coloque su conexión establecida entre el uso de VPN y sería más seguro si también configura los nodos de su base de datos a través de una conexión TLS/SSL. Para esta configuración en nuestro blog, simplemente implementamos un nodo sobre una VPN y le mostramos cómo puede hacer este enfoque fácilmente. Vea a continuación el diagrama de la configuración del objetivo:

Para elaborar la configuración, la red local se comunicará a través del público nube utilizando un túnel VPN y ambas redes tendrán una puerta de enlace VPN para que ambas puedan comunicarse o establecer una conexión. ClusterControl requiere que supervise todos los nodos que deben registrarse, ya que recopilará información sobre sus nodos para las métricas de datos. Aparte de eso, requiere que su nodo de escritor activo local también pueda llegar al nodo en espera en el otro dominio, que es para este blog, alojado en Google Cloud Platform (GCP).

Configuración de su OpenVPN

La configuración de OpenVPN es muy complicada para ambos dominios de red. La esencia de esto es que debe tener la siguiente consideración:

  • Los nodos de su entorno local podrán establecer una conexión con los nodos de dominio de la nube pública de destino
  • Los nodos de su entorno local pueden tener acceso a Internet para descargar paquetes necesarios para la configuración. A menos que tenga todos los repositorios almacenados localmente que se requieren, este puede no ser el caso
  • Los nodos de su dominio de nube pública podrán establecer una conexión con los nodos locales
  • Los nodos de su dominio de nube pública pueden tener acceso a Internet para descargar paquetes necesarios para la configuración. A menos que tenga todos los repositorios almacenados localmente que se requieren, este puede no ser el caso

Instalación y configuración de OpenVPN

Paso uno

Instalar el paquete openvpn (y paquetes easy-rsa para distribuciones Ubuntu/Debian)

$ sudo apt-get install openvpn easy-rsa

Para sistemas operativos basados ​​en CentOS/RHEL, 

$ sudo yum install openvpn wget

$ wget -O /tmp/easyrsa https://github.com/OpenVPN/easy-rsa-old/archive/2.3.3.tar.gz

Paso Dos

Genera tus certificados, como certificados de autoridad de certificación (CA), servidor y cliente.

Para Ubuntu/Debian, puede realizar las siguientes acciones:

$ /usr/bin/make-cadir CA

Cambiar al directorio CA

$ cd CA

En este punto, es probable que edite el archivo vars de acuerdo con sus necesidades, por ejemplo,

export KEY_COUNTRY="SE"

export KEY_PROVINCE="SMD"

export KEY_CITY="Kalmar"

export KEY_ORG="Severalnines"

export KEY_EMAIL="[email protected]"

export KEY_CN="S9s"

export KEY_NAME="server"

export KEY_OU="Support Unit"

Luego ejecute el script vars para definir las variables env requeridas

[ ~/CA ]$ source ./vars

NOTE: If you run ./clean-all, I will be doing a rm -rf on /CA/keys

Ejecutar una limpieza

[ ~/CA ]$ ./clean-all

Luego cree los certificados para su CA, servidor y cliente.

[ ~/CA ]$ ./build-ca

[ ~/CA ]$ ./build-key-server server

 $ ./build-dh 2048

[ ~/CA ]$ ./build-key client

Por último, genere una clave Perfect Forward Secrecy.

$ openvpn --genkey --secret pfs.key

Si está utilizando distribuciones de tipo CentOS/RHEL, puede hacer lo siguiente:

$ tar xfz /tmp/easyrsa

$ sudo mkdir /etc/openvpn/easy-rsa

$ sudo cp -rf easy-rsa-old-2.3.3/easy-rsa/2.0/* /etc/openvpn/easy-rsa

# Asegúrese de que sus claves RSA tengan el permiso correcto por motivos de seguridad

$ sudo chown vagrant /etc/openvpn/easy-rsa/

$ sudo cp /usr/share/doc/openvpn-2.4.4/sample/sample-config-files/server.conf /etc/openvpn

$ sudo mkdir /etc/openvpn/easy-rsa/keys

$ sudo nano /etc/openvpn/easy-rsa/vars

$ cd /etc/openvpn/easy-rsa

En este punto, es probable que edite el archivo vars de acuerdo con sus necesidades, por ejemplo,

export KEY_COUNTRY="SE"

export KEY_PROVINCE="SMD"

export KEY_CITY="Kalmar"

export KEY_ORG="Severalnines"

export KEY_EMAIL="[email protected]"

export KEY_CN="S9s"

export KEY_NAME="server"

export KEY_OU="Support Unit"

Luego ejecute el script vars para definir las variables env requeridas

$ source ./vars

NOTE: If you run ./clean-all, I will be doing a rm -rf on /CA/keys

Ejecutar una limpieza

$ ./clean-all

Luego cree los certificados para su CA, servidor y cliente.

$ ./build-ca

$ ./build-key-server server

$ ./build-dh 2048

$ cd /etc/openvpn/easy-rsa

$ ./build-key client

$ cp /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf

Una vez que haya realizado toda la configuración, debe tener en cuenta dónde se encuentran sus claves y certificados. Si está utilizando systemd o service en Linux para ejecutar esto, puede colocar sus certificados y claves en /etc/openvpn. Es posible que deba ejecutar el siguiente comando:

sudo cp dh2048.pem ca.crt server.crt server.key /etc/openvpn

Paso tres

En este punto, termino con la siguiente configuración de servidor y cliente. Ver mis archivos de configuración en consecuencia,

Configuración del servidor OpenVPN

$ cat /etc/openvpn/server-ovpn.conf 

port 1194

proto udp

dev tun

ca /etc/openvpn/keys/ca.crt

cert /etc/openvpn/keys/server.crt

key /etc/openvpn/keys/server.key # This file should be kept secret

dh /etc/openvpn/keys/dh2048.pem

cipher AES-256-CBC

auth SHA512

server 10.8.0.0 255.255.255.0

client-to-client

topology subnet

push "route 192.168.30.0 255.255.255.0"

#push "redirect-gateway def1 bypass-dhcp"

#push "redirect-gateway"

push "dhcp-option DNS 8.8.8.8"

push "dhcp-option DNS 8.8.4.4"

ifconfig-pool-persist ipp.txt

keepalive 10 120

comp-lzo

persist-key

persist-tun

#status openvpn-status.log

#log-append  openvpn.log

verb 3

tls-server

tls-auth /etc/openvpn/keys/pfs.key

Lo más importante que debe tener en cuenta son las siguientes opciones, como se indica a continuación.

cliente a cliente:muy importante para que los nodos en la VPN puedan hacer ping a los otros nodos en diferentes dominios de red. Digamos, ClusterControl está ubicado en las instalaciones, puede hacer ping a los nodos en GCP.

push "route 192.168.30.0 255.255.255.0":envío las tablas de enrutamiento para que los nodos de GCP conectados a VPN puedan hacer ping a mis nodos en el dominio local. En mi puerta de enlace VPN de GCP, tengo las siguientes tablas de enrutamiento como push "ruta 10.142.0.0 255.255.255.0"

#push "redirect-gateway def1 bypass-dhcp" ,

#push "redirect-gateway":ambas secciones no son necesarias, ya que necesito conexión a Internet para configurar mi repositorio y los paquetes dependientes durante la instalación.

push "dhcp-option DNS 8.8.8.8", 

pulsar "dhcp-option DNS 8.8.4.4":ambas secciones se pueden cambiar a su DNS deseado si es necesario. Esto es para su DNS deseado, especialmente cuando necesita conexión a Internet.

Configuración de cliente OpenVPN

$ cat openvpn/client-vpn.ovpn 

client

dev tun

proto udp

remote 34.73.238.239  1194  

ca ca.crt

cert client.crt

key client.key

tls-version-min 1.2

tls-cipher TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256:TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256:TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256

cipher AES-256-CBC

auth SHA512

resolv-retry infinite

auth-retry none

nobind

persist-key

persist-tun

ns-cert-type server

comp-lzo

verb 3

tls-client

tls-auth pfs.key

Lo más importante aquí es que debe estar seguro de las rutas clave y también reemplazar los parámetros en esta sección,

remote 34.73.238.239  1194  

que puede ser el nombre de host/dirección IP de la puerta de enlace de su servidor VPN para conectarse.

Cuarto Paso

Por último, configure el servidor proxy VPN para enrutar los paquetes de red a la interfaz de red en el servidor y permitir que el núcleo reenvíe el tráfico IPV4

sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

sudo echo 1 > /proc/sys/net/ipv4/ip_forward

Para una instalación más detallada, le sugiero que consulte estas publicaciones para CentOS y en Ubuntu.

Extenderse sobre la nube de manera eficiente

Suponga que tiene la siguiente topología en su dominio local,

y ahora desea extender su disponibilidad a otro centro de datos, que es GCP para este blog La implementación con ClusterControl es muy sencilla. Puede realizar el siguiente procedimiento que se indica a continuación,

Paso uno

Crear un clúster esclavo

Paso Dos

Elija su maestro para la replicación,

Paso tres

Configure el acceso a su entorno de nube pública

Cuarto Paso

Especifique el nombre de host/IP de su nodo para que se extienda a su clúster de replicación de PG,

Paso cinco

Por último, controle la actividad del trabajo. ¿Cómo reacciona ClusterControl ante este tipo de acción?

El resultado le mostrará el vínculo entre su centro de datos local y su centro de datos extendido, que se encuentra en este blog, nuestro nodo en espera de GCP PostgreSQL. Vea a continuación el resultado

Conclusión

Configurar un nodo de reserva de ubicación geográfica no es difícil, pero el problema principal es qué tan seguro será esto en su diseño arquitectónico. El uso de una VPN puede aliviar la principal preocupación del problema. El uso de OpenVPN es solo una forma simple de implementar esto, pero para aplicaciones transaccionales pesadas, es probable que las organizaciones inviertan en servicios o hardware de mayor escala para lidiar con esta configuración. Además, agregar un TLS/SSL puede ser más fácil que hacerlo. Discutiremos esto sobre cómo puede usar TLS/SSL con PostgreSQL en nuestros próximos blogs.