以前は、MySQLレプリケーションを使用した地理分散データベースクラスターのセットアップについて説明しました。今回はPostgreSQLについてです。 PostgreSQL用に地理分散クラスターをセットアップすることは新しい概念ではなく、トポロジーは非常に一般的です。
高可用性を実現するために、組織や企業はデータベースノードを分散させており、特定の地域(データセンターに影響を与える)で壊滅的なイベントが発生した場合に、スタンバイノードをフェイルオーバーに使用できるようにしています。
これは、組織の事業継続および障害復旧計画の一部として(このタイプのトポロジを使用して)非常に一般的な方法です。このタイプのトポロジーは、単一障害点(SPOF)を持つことを排除します。特にRPOが低く、稼働時間が長い場合(可能であれば99.999999999%)の一般的な要件。
このブログでは、ClusterControlを使用してこれを行う方法について簡単な実装を行います。 ClusterControlは、データベースクラスター用のエージェントレスの管理および自動化ソフトウェアです。これは、ClusterControlユーザーインターフェイスから直接データベースサーバー/クラスターを展開、監視、管理、およびスケーリングするのに役立ちます。
ここでの目標の結果は、安全な環境に効率的に展開することです。これを行うには、VPNを使用する間に確立された接続を配置する必要があり、TLS/SSL接続を介してデータベースノードもセットアップする場合はより安全になることが重要です。ブログでのこの設定では、VPNを介してノードをデプロイし、このアプローチを簡単に実行する方法を紹介します。ターゲット設定の図については、以下を参照してください。
セットアップを詳しく説明するために、オンプレミスネットワークはパブリックを介して通信する必要がありますVPNトンネルを使用するクラウドとこれらのネットワークの両方にVPNゲートウェイが必要であるため、両方が通信または接続を確立できます。 ClusterControlでは、データメトリックのノードに関する情報を収集するため、登録する必要のあるすべてのノードを監視する必要があります。それとは別に、オンプレミスのアクティブライターノードがスタンバイノードに到達して、Google Cloud Platform(GCP)でホストされているこのブログ用の他のドメインに到達できる必要があります。
OpenVPNのセットアップは、両方のネットワークドメインにとって非常に注意が必要です。その要点は、次の考慮事項が必要であるということです。
- オンプレミスのノードは、ターゲットのパブリッククラウドドメインノードへの接続を確立できる必要があります
- オンプレミスのノードは、セットアップに必要なパッケージをダウンロードするためにインターネットにアクセスできます。必要なすべてのリポジトリをローカルに保存していない限り、これは当てはまりません。
- パブリッククラウドドメインのノードは、オンプレミスノードへの接続を確立できる必要があります
- パブリッククラウドドメインのノードは、セットアップに必要なパッケージをダウンロードするためにインターネットにアクセスできる可能性があります。必要なすべてのリポジトリをローカルに保存していない限り、これは当てはまりません。
OpenVPNのインストールと構成
openvpnパッケージ(およびUbuntu / Debianディストリビューション用のeasy-rsaパッケージ)をインストールします
$ sudo apt-get install openvpn easy-rsa
CentOS / RHELベースのOSの場合、
$ sudo yum install openvpn wget
$ wget -O /tmp/easyrsa https://github.com/OpenVPN/easy-rsa-old/archive/2.3.3.tar.gz
認証局(CA)、サーバー、クライアント証明書などの証明書を生成します。
Ubuntu / Debianの場合、次のアクションを実行できます:
$ /usr/bin/make-cadir CA
CAディレクトリに移動
$ cd CA
この時点で、必要に応じてvarsファイルを編集する可能性があります。例:
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"
次に、varsスクリプトを実行して、必要な環境変数を定義します
[ ~/CA ]$ source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /CA/keys
[ ~/CA ]$ ./clean-all
次に、CA、サーバー、およびクライアントの証明書を作成します。
[ ~/CA ]$ ./build-ca
[ ~/CA ]$ ./build-key-server server
$ ./build-dh 2048
[ ~/CA ]$ ./build-key client
最後に、PerfectForwardSecrecyキーを生成します。
$ openvpn --genkey --secret pfs.key
CentOS / RHELタイプのディストリビューションを使用している場合は、次の操作を実行できます。
$ 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
#RSAキーがセキュリティ上の理由から適切な権限を持っていることを確認してください
$ 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
この時点で、必要に応じてvarsファイルを編集する可能性があります。例:
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"
次に、varsスクリプトを実行して、必要な環境変数を定義します
$ source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /CA/keys
$ ./clean-all
次に、CA、サーバー、およびクライアントの証明書を作成します。
$ ./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
すべての設定が完了したら、キーと証明書が配置されている場所を考慮する必要があります。 Linuxでsystemdまたはserviceを使用してこれを実行している場合は、証明書とキーを/ etc/openvpnに配置できます。おそらく、次のコマンドを実行する必要があるかもしれません:
sudo cp dh2048.pem ca.crt server.crt server.key /etc/openvpn
この時点で、次のサーバーとクライアントの構成になります。それに応じて私の構成ファイルを参照してください
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
考慮する必要がある最も重要なことは、次のように次のオプションです。
client-to-client-VPN内のノードが、異なるネットワークドメイン内の他のノードにpingを実行できるようにするために非常に重要です。たとえば、ClusterControlはオンプレミスにあり、GCPのノードにpingを実行できます。
push "route 192.168.30.0 255.255.255.0"-VPNに接続されているGCPノードがオンプレミスドメインのノードにpingできるように、ルーティングテーブルをプッシュします。 GCP VPNゲートウェイには、push "route 10.142.0.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"-必要に応じて、これらのセクションを両方とも目的のDNSに変更できます。これは、特にインターネット接続が必要な場合に、目的のDNS用です。
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
ここで最も重要なことは、キーパスを確認し、このセクションのパラメーターを置き換える必要があることです。
remote 34.73.238.239 1194
最後に、プロキシVPNサーバーをセットアップして、ネットワークパケットをサーバーのネットワークインターフェイスにルーティングし、カーネルが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
より詳細なインストールについては、CentOSおよびUbuntuに関するこれらの投稿を参照することをお勧めします。
そして、別のデータセンターであるGCPに可用性を拡張したいと考えています。このブログのために。 ClusterControlを使用したデプロイは非常に簡単です。下記の手順を実行できます
最後に、ClusterControlがこのタイプのアクションにどのように反応するかをジョブアクティビティで監視します
結果には、オンプレミスと拡張データセンターの間のリンクが表示されます。このブログには、GCPPostgreSQLスタンバイノードがあります。結果については以下を参照してください
ジオロケーションスタンバイノードの設定は難しくありませんが、主な問題は、これがアーキテクチャ設計でどれほど安全かということです。 VPNを使用すると、問題の主な懸念を軽減できます。 OpenVPNの使用はこれを実装するための簡単な方法ですが、大量のトランザクションアプリケーションの場合、組織はこのセットアップを処理するために高級サービスまたはハードウェアに投資する可能性があります。また、TLS / SSLを追加することで、実行するよりも簡単になります。これについては、次のブログでPostgreSQLでTLS/SSLを使用する方法について説明します。