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.