PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL Multi-DC:Configurando um nó de espera em uma localização geográfica diferente por meio de uma VPN

Anteriormente, escrevemos sobre Como configurar um cluster de banco de dados distribuído geograficamente usando a replicação MySQL. Desta vez, é sobre o PostgreSQL. Configurar um cluster geo-distribuído para PostgreSQL não é um conceito novo e a topologia é bastante comum.

Para obter alta disponibilidade, organizações e empresas estão dispersando seus nós de banco de dados para que, quando um evento catastrófico ocorrer em uma região específica (que afeta seu data center), você tenha seus nós de espera disponíveis para failover.

Esta é uma prática muito comum (usando esse tipo de topologia) como parte dos planos de Continuidade de Negócios e Recuperação de Desastres de sua organização. Este tipo de topologia elimina a existência de um único ponto de falha (SPOF). Um requisito comum, especialmente se você tiver um RPO baixo e um tempo de atividade mais alto (se possível, em 99,999999999%).

Neste blog, farei uma implementação simples de como fazer isso usando o ClusterControl. ClusterControl é um software de gerenciamento e automação sem agente para clusters de banco de dados. Ele ajuda a implantar, monitorar, gerenciar e dimensionar seu servidor/cluster de banco de dados diretamente da interface de usuário do ClusterControl.

A configuração arquitetônica desejada

O objetivo aqui é implantar com eficiência em um ambiente seguro. Para fazer isso, é importante que você precise colocar sua conexão estabelecida entre o uso de VPN e seria mais seguro se você também configurasse seus nós de banco de dados por meio de uma conexão TLS/SSL. Para esta configuração em nosso blog, simplesmente implantamos um nó em uma VPN e mostramos a você como você pode fazer essa abordagem facilmente. Veja abaixo o diagrama da configuração de destino:

Para elaborar a configuração, a rede local deve se comunicar pelo público cloud usando um túnel VPN e ambas as redes devem ter um gateway VPN para que ambas possam se comunicar ou estabelecer uma conexão. O ClusterControl exige que você supervisione todos os nós que precisam ser registrados, pois coletará informações sobre seus nós para métricas de dados. Além disso, requer que seu nó de gravador ativo local também possa alcançar o nó de espera no outro domínio, que é para este blog, hospedado no Google Cloud Platform (GCP).

Configurando seu OpenVPN

A configuração do OpenVPN é muito complicada para ambos os domínios de rede. A essência disso é que, deve ter a seguinte consideração:

  • Os nós do seu local poderão estabelecer uma conexão com os nós de domínio de nuvem pública de destino
  • Os nós do seu local podem ter acesso à Internet para baixar pacotes que precisam ser configurados. A menos que você tenha todos os repositórios armazenados localmente que são necessários, este pode não ser o caso
  • Os nós do seu domínio de nuvem pública poderão estabelecer uma conexão com os nós locais
  • Os nós de seu domínio de nuvem pública podem ter acesso à Internet para fazer download de pacotes que precisam ser configurados. A menos que você tenha todos os repositórios armazenados localmente que são necessários, este pode não ser o caso

Instalação e configuração do OpenVPN

Primeiro passo

Instale o pacote openvpn (e os pacotes easy-rsa para distribuições Ubuntu/Debian)

$ sudo apt-get install openvpn easy-rsa

Para SO baseado em CentOS/RHEL,

$ sudo yum install openvpn wget

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

Passo Dois

Gere seus certificados, como certificados de autoridade de certificação (CA), servidor e cliente.

Para Ubuntu/Debian, você pode fazer as seguintes ações:

$ /usr/bin/make-cadir CA

Mudar para o diretório CA

$ cd CA

Neste ponto, é provável que você edite o arquivo vars de acordo com suas necessidades, por exemplo,

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"

Em seguida, execute o script vars para definir as variáveis ​​de ambiente necessárias

[ ~/CA ]$ source ./vars

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

Executar uma limpeza

[ ~/CA ]$ ./clean-all

Em seguida, crie os certificados para sua CA, servidor e cliente.

[ ~/CA ]$ ./build-ca

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

 $ ./build-dh 2048

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

Por último, gere uma chave Perfect Forward Secrecy.

$ openvpn --genkey --secret pfs.key

Se você estiver usando distribuições do tipo CentOS/RHEL, você pode fazer o seguinte:

$ 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

# Certifique-se de que suas chaves RSA estejam na permissão correta para fins de segurança

$ 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

Neste ponto, é provável que você edite o arquivo vars de acordo com suas necessidades, por exemplo,

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"

Em seguida, execute o script vars para definir as variáveis ​​de ambiente necessárias

$ source ./vars

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

Executar uma limpeza

$ ./clean-all

Em seguida, crie os certificados para sua CA, servidor e 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

Depois de ter tudo configurado, você deve levar em consideração onde estão suas chaves e certificados. Se você estiver usando systemd ou serviço no Linux para executar isso, poderá colocar seus certificados e chaves em /etc/openvpn. Provavelmente, você pode ter que executar o seguinte comando:

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

Etapa Três

Neste ponto, termino com a seguinte configuração de servidor e cliente. Veja meus arquivos de configuração de acordo,

Configuração do 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

A coisa mais importante que você precisa levar em consideração são as seguintes opções, conforme indicado a seguir.

client-to-client - Muito importante para que os nós na VPN possam fazer ping nos outros nós em diferentes domínios de rede. Digamos que o ClusterControl esteja localizado no local, ele pode executar ping nos nós no GCP.

push "route 192.168.30.0 255.255.255.0" - Eu envio as tabelas de roteamento para que os nós do GCP conectados à VPN possam fazer ping em meus nós no domínio local. No meu gateway de VPN do GCP, tenho as seguintes tabelas de roteamento como push "route 10.142.0.0 255.255.255.0"

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

#push "redirect-gateway" - Ambas as seções não são necessárias, pois preciso de conexão com a Internet para configurar meu repositório e pacotes dependentes na instalação.

push "dhcp-option DNS 8.8.8.8", 

push "dhcp-option DNS 8.8.4.4" -  Ambas as seções podem ser alteradas para o DNS desejado, se necessário. Isso é para o DNS desejado, especialmente quando você precisa de conexão com a Internet.

Configuração do 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

A coisa mais importante aqui é que você precisa ter certeza de seus principais caminhos e também substituir os parâmetros nesta seção,

remote 34.73.238.239  1194  

que pode ser o nome do host/endereço IP do gateway do servidor VPN ao qual se conectar.

Passo Quatro

Por último, configure o servidor proxy VPN para que os pacotes de rede sejam roteados para a interface de rede no servidor e permita que o kernel encaminhe o tráfego 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 uma instalação mais detalhada, sugiro que você dê uma olhada nestes posts para CentOS e no Ubuntu.

Estender pela nuvem com eficiência

Suponha que você tenha a seguinte topologia em seu domínio local,

e agora você deseja estender sua disponibilidade para outro datacenter, que é o GCP para este blogue. A implantação usando o ClusterControl é muito simples. Você pode fazer o seguinte procedimento indicado abaixo,

Primeiro passo

Criar um cluster escravo

Passo Dois

Escolha seu mestre para replicação,

Etapa Três

Configure o acesso ao seu ambiente de nuvem pública

Passo Quatro

Especifique o nome do host/IP do seu nó a ser estendido ao seu cluster de replicação PG,

Passo Cinco

Por último, monitore a atividade de trabalho como o ClusterControl reage a esse tipo de ação

O resultado mostrará a conexão entre seu datacenter local e estendido, que está neste blog, nosso nó de espera do PostgreSQL do GCP. Veja abaixo o resultado

Conclusão


Configurar um nó de espera de geolocalização não é difícil, mas o principal problema é o quão seguro isso será em seu projeto de arquitetura. O uso de uma VPN pode aliviar a principal preocupação do problema. Usar o OpenVPN é apenas uma maneira simples de implementar isso, mas para aplicativos transacionais pesados, é provável que as organizações invistam em serviços ou hardware de alto nível para lidar com essa configuração. Além disso, adicionar um TLS/SSL pode ser mais fácil do que fazer. Discutiremos isso sobre como você pode usar TLS/SSL com PostgreSQL em nossos próximos blogs.