sql >> データベース >  >> RDS >> PostgreSQL

マルチDCPostgreSQL:VPNを介して別の地理的場所にスタンバイノードを設定する

    以前は、MySQLレプリケーションを使用した地理分散データベースクラスターのセットアップについて説明しました。今回はPostgreSQLについてです。 PostgreSQL用に地理分散クラスターをセットアップすることは新しい概念ではなく、トポロジーは非常に一般的です。

    高可用性を実現するために、組織や企業はデータベースノードを分散させており、特定の地域(データセンターに影響を与える)で壊滅的なイベントが発生した場合に、スタンバイノードをフェイルオーバーに使用できるようにしています。

    これは、組織の事業継続および障害復旧計画の一部として(このタイプのトポロジを使用して)非常に一般的な方法です。このタイプのトポロジーは、単一障害点(SPOF)を持つことを排除します。特にRPOが低く、稼働時間が長い場合(可能であれば99.999999999%)の一般的な要件。

    このブログでは、ClusterControlを使用してこれを行う方法について簡単な実装を行います。 ClusterControlは、データベースクラスター用のエージェントレスの管理および自動化ソフトウェアです。これは、ClusterControlユーザーインターフェイスから直接データベースサーバー/クラスターを展開、監視、管理、およびスケーリングするのに役立ちます。

    必要なアーキテクチャの設定

    ここでの目標の結果は、安全な環境に効率的に展開することです。これを行うには、VPNを使用する間に確立された接続を配置する必要があり、TLS/SSL接続を介してデータベースノードもセットアップする場合はより安全になることが重要です。ブログでのこの設定では、VPNを介してノードをデプロイし、このアプローチを簡単に実行する方法を紹介します。ターゲット設定の図については、以下を参照してください。

    セットアップを詳しく説明するために、オンプレミスネットワークはパブリックを介して通信する必要がありますVPNトンネルを使用するクラウドとこれらのネットワークの両方にVPNゲートウェイが必要であるため、両方が通信または接続を確立できます。 ClusterControlでは、データメトリックのノードに関する情報を収集するため、登録する必要のあるすべてのノードを監視する必要があります。それとは別に、オンプレミスのアクティブライターノードがスタンバイノードに到達して、Google Cloud Platform(GCP)でホストされているこのブログ用の他のドメインに到達できる必要があります。

    OpenVPNのセットアップ

    OpenVPNのセットアップは、両方のネットワークドメインにとって非常に注意が必要です。その要点は、次の考慮事項が必要であるということです。

    • オンプレミスのノードは、ターゲットのパブリッククラウドドメインノードへの接続を確立できる必要があります
    • オンプレミスのノードは、セットアップに必要なパッケージをダウンロードするためにインターネットにアクセスできます。必要なすべてのリポジトリをローカルに保存していない限り、これは当てはまりません。
    • パブリッククラウドドメインのノードは、オンプレミスノードへの接続を確立できる必要があります
    • パブリッククラウドドメインのノードは、セットアップに必要なパッケージをダウンロードするためにインターネットにアクセスできる可能性があります。必要なすべてのリポジトリをローカルに保存していない限り、これは当てはまりません。

    OpenVPNのインストールと構成

    ステップ1

    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
    ステップ2

    認証局(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
    ステップ3

    この時点で、次のサーバーとクライアントの構成になります。それに応じて私の構成ファイルを参照してください

    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サーバーゲートウェイのホスト名/IPアドレスにすることができます。

    ステップ4

    最後に、プロキシ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を使用したデプロイは非常に簡単です。下記の手順を実行できます

    ステップ1 スレーブクラスターを作成する

    ステップ2 レプリケーションするマスターを選択してください

    ステップ3 パブリッククラウド環境へのアクセスを設定する

    ステップ4 PGレプリケーションクラスターに拡張するノードのホスト名/IPを指定します

    ステップ5

    最後に、ClusterControlがこのタイプのアクションにどのように反応するかをジョブアクティビティで監視します

    結果には、オンプレミスと拡張データセンターの間のリンクが表示されます。このブログには、GCPPostgreSQLスタンバイノードがあります。結果については以下を参照してください

    結論

    ジオロケーションスタンバイノードの設定は難しくありませんが、主な問題は、これがアーキテクチャ設計でどれほど安全かということです。 VPNを使用すると、問題の主な懸念を軽減できます。 OpenVPNの使用はこれを実装するための簡単な方法ですが、大量のトランザクションアプリケーションの場合、組織はこのセットアップを処理するために高級サービスまたはハードウェアに投資する可能性があります。また、TLS / SSLを追加することで、実行するよりも簡単になります。これについては、次のブログでPostgreSQLでTLS/SSLを使用する方法について説明します。


    1. デルブーミ

    2. MySQLのVALUESステートメント

    3. OracleAnalytic関数-ウィンドウ句のリセット

    4. SQL Serverで「datetime2」を「datetimeoffset」に変換します(T-SQLの例)