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

AWSS3のPostgreSQLバックアップメソッドの機能

    Amazonは2006年の初めにS3をリリースし、PostgreSQLバックアップスクリプトがクラウドにデータをアップロードできるようにする最初のツールであるs3cmdは、わずか1年後に誕生しました。 2010年までに(私のGoogle検索スキルによると)それについてのBIブログを開きます。その場合、一部のPostgreSQLDBAは9年間にわたってAWSS3にデータをバックアップしていると言っても過言ではありません。しかし、どのように?そして、その間に何が変わったのでしょうか? s3cmdは、既知のPostgreSQLバックアップツールのコンテキストでまだ一部で参照されていますが、メソッドは変更されており、目的のリカバリ目標RTOおよびRPOを達成するために、ファイルシステムまたはPostgreSQLネイティブバックアップオプションのいずれかとの統合を改善できます。

    AmazonS3を選ぶ理由

    Amazon S3ドキュメント全体で指摘されているように(S3 FAQは非常に良い出発点です)、S3サービスを使用する利点は次のとおりです。

    • 99.999999999(11ナイン)の耐久性
    • 無制限のデータストレージ
    • 低コスト(BitTorrentと組み合わせるとさらに低くなります)
    • 無料のインバウンドネットワークトラフィック
    • 課金対象のアウトバウンドネットワークトラフィックのみ

    AWSS3CLIの落とし穴

    AWS S3 CLIツールキットは、S3ストレージとの間でデータを転送するために必要なすべてのツールを提供します。これらのツールを使用してみませんか?その答えは、オブジェクトストレージに関連する制限と制約を処理するための手段を含むAmazonS3実装の詳細にあります。

    • 保存されたオブジェクトあたり最大5TBのサイズ
    • PUTオブジェクトの最大サイズ5GB
    • 100MBを超えるオブジェクトにはマルチパートアップロードをお勧めします
    • S3パフォーマンスチャートに従って適切なストレージクラスを選択してください
    • S3ライフサイクルを活用する
    • S3データ整合性モデル

    例として、aws s3 cpヘルプページを参照してください:

    -expected-size(string)この引数は、ストリームの予想サイズをバイト単位で指定します。この引数は、ストリームがs3にアップロードされており、サイズが5GBより大きい場合にのみ必要であることに注意してください。これらの条件下でこの引数を含めないと、アップロードのパーツが多すぎるためにアップロードが失敗する可能性があります。

    これらの落とし穴を回避するには、専用のPostgreSQLおよびS3バックアップツールが達成しようとしているS3エコシステムに関する深い知識が必要です。

    AmazonS3をサポートするPostgreSQLネイティブバックアップツール

    S3統合は、PostgreSQLのネイティブバックアップ機能を実装する有名なバックアップツールのいくつかによって提供されます。

    BarmanS3

    BarmanS3は、BarmanHookScriptsとして実装されています。上記の推奨事項と制限に対処することなく、AWSCLIに依存しています。セットアップが簡単なため、小規模なインストールに適しています。開発はやや行き詰まっており、最終更新は約1年前であり、この製品は、すでに環境でBarmanを使用しているユーザーに最適です。

    S3ダンプ

    S3dumpsはアクティブなプロジェクトであり、AmazonのPythonライブラリBoto3を使用して実装されています。インストールはpipを介して簡単に実行されます。 Amazon S3 Python SDKに依存していますが、multi。*partやstorage。*classなどの正規表現キーワードのソースコードを検索しても、multipart転送などの高度なS3機能は見つかりません。

    pgBackRest

    pgBackRestは、リポジトリオプションとしてS3を実装します。これは、よく知られているPostgreSQLバックアップツールの1つであり、並列バックアップと復元、暗号化、テーブルスペースのサポートなど、機能が豊富なバックアップオプションのセットを提供します。これは主にCコードであり、私たちが求めている速度とスループットを提供しますが、AWS S3 APIとのやり取りに関しては、S3ストレージ機能の実装に必要な追加作業が犠牲になります。最近のバージョンでは、S3マルチパートアップロードが実装されています。

    WAL-G

    2年前に発表されたWAL-Gは積極的に維持されています。この堅実なPostgreSQLバックアップツールはストレージクラスを実装しますが、マルチパートアップロードは実装しません(コードでCreateMultipartUploadを検索しても、発生は見つかりませんでした)。

    PGHoard

    pghoardは約3年前にリリースされました。これは、S3マルチパート転送をサポートするパフォーマンスと機能が豊富なPostgreSQLバックアップツールです。ストレージクラスやオブジェクトライフサイクル管理など、他のS3機能は提供していません。

    ローカルファイルシステムとしてのS3

    ローカルファイルシステムとしてS3ストレージにアクセスできることは、PostgreSQLネイティブバックアップツールを使用する可能性を開くため、非常に望ましい機能です。

    Linux環境の場合、AmazonはNFSとiSCSIの2つのオプションを提供します。 AWSStorageGatewayを利用しています。

    NFS

    ローカルにマウントされたNFS共有は、AWS StorageGatewayFileサービスによって提供されます。リンクに従って、ファイルゲートウェイを作成する必要があります。

    ホストプラットフォームの選択画面で、Amazon EC2を選択し、[インスタンスの起動]ボタンをクリックしますインスタンスを作成するためのEC2ウィザードを開始します。

    では、このシステム管理者の好奇心から、ウィザードが使用するAMIを調べてみましょう。これにより、AWSの内部要素のいくつかについて興味深い視点が得られます。 ami-0bab9d6dffb52fef5と呼ばれる画像IDを使用して、詳細を見てみましょう。

    上記のように、AMI名はaws-thinstallerです。 「thinstaller」?インターネット検索により、ThinstallerはMicrosoft製品用のIBM Lenovoソフトウェア構成管理ツールであり、この2008年のブログで最初に参照され、その後、このLenovoフォーラムの投稿とこの学区のサービス要求で参照されていることがわかりました。私のWindowsシステム管理者の仕事は3年前に終わったので、私はそれを知る方法がありませんでした。このAMIはThinstaller製品で構築されたので、さらに混乱させるために、AMIオペレーティングシステムは「その他のLinux」としてリストされており、管理者としてシステムにSSH接続することで確認できます。

    ウィザードの落とし穴:EC2ファイアウォールのセットアップ手順にもかかわらず、ストレージゲートウェイに接続するときにブラウザがタイムアウトしていました。ポート80の許可は、ポート要件で文書化されています。ウィザードは、必要なすべてのポートを一覧表示するか、文書にリンクする必要があると主張できますが、クラウドの精神では、答えはCloudFormationなどのツールで「自動化」されます。

    >

    ウィザードでは、xlargeサイズのインスタンスから開始することも提案されています。

    >

    ストレージゲートウェイの準備ができたら、[作成]をクリックしてNFS共有を構成しますゲートウェイメニューのファイル共有ボタン:

    NFS共有の準備ができたら、指示に従ってファイルシステムをマウントします。

    上のスクリーンショットでは、mountコマンドがインスタンスのプライベートIPを参照していることに注意してください。住所。パブリックホストからマウントするには、上記のEC2インスタンスの詳細に示されているようにインスタンスのパブリックアドレスを使用するだけです。

    ファイル共有の作成時にS3バケットが存在しない場合、ウィザードはブロックされませんが、S3バケットが作成されたら、インスタンスを再起動する必要があります。それ以外の場合は、マウントコマンド失敗:

    [[email protected] ~]# mount -t nfs -o nolock,hard 34.207.216.29:/s9s-postgresql-backup /mnt
    
    mount.nfs: mounting 34.207.216.29:/s9s-postgresql-backup failed, reason given by server: No such file or directory
    共有が利用可能になったことを確認します:

    [[email protected] ~]# df -h /mnt
    
    Filesystem                            Size Used Avail Use% Mounted on
    
    34.207.216.29:/s9s-postgresql-backup  8.0E 0 8.0E 0% /mnt

    では、簡単なテストを実行しましょう:

    [email protected][local]:54311 postgres# \l+ test
    
                                                    List of databases
    
    Name |  Owner | Encoding |   Collate | Ctype | Access privileges |  Size | Tablespace | Description
    
    ------+----------+----------+-------------+-------------+-------------------+---------+------------+-------------
    
    test | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                   | 2763 MB | pg_default |
    
    (1 row)
    
    [[email protected] ~]# date ; time pg_dump -d test | gzip -c >/mnt/test.pg_dump.gz ; date
    
    Sun 27 Oct 2019 06:06:24 PM PDT
    
    
    
    real    0m29.807s
    
    user    0m15.909s
    
    sys     0m2.040s
    
    Sun 27 Oct 2019 06:06:54 PM PDT

    S3バケットの最終更新タイムスタンプは約1分後です。これは、前述のように、AmazonS3データ整合性モデルと関係があります。

    より徹底的なテストがあります:

    ~ $ for q in {0..20} ; do touch /mnt/touched-at-$(date +%Y%m%d%H%M%S) ;
    
    sleep 1 ; done
    
    
    
    ~ $ aws s3 ls s3://s9s-postgresql-backup | nl
    
        1      2019-10-27 19:50:40          0 touched-at-20191027194957
    
        2      2019-10-27 19:50:40          0 touched-at-20191027194958
    
        3      2019-10-27 19:50:40          0 touched-at-20191027195000
    
        4      2019-10-27 19:50:40          0 touched-at-20191027195001
    
        5      2019-10-27 19:50:40          0 touched-at-20191027195002
    
        6      2019-10-27 19:50:40          0 touched-at-20191027195004
    
        7      2019-10-27 19:50:40          0 touched-at-20191027195005
    
        8      2019-10-27 19:50:40          0 touched-at-20191027195007
    
        9      2019-10-27 19:50:40          0 touched-at-20191027195008
    
       10      2019-10-27 19:51:10          0 touched-at-20191027195009
    
       11      2019-10-27 19:51:10          0 touched-at-20191027195011
    
       12      2019-10-27 19:51:10          0 touched-at-20191027195012
    
       13      2019-10-27 19:51:10          0 touched-at-20191027195013
    
       14      2019-10-27 19:51:10          0 touched-at-20191027195014
    
       15      2019-10-27 19:51:10          0 touched-at-20191027195016
    
       16      2019-10-27 19:51:10          0 touched-at-20191027195017
    
       17      2019-10-27 19:51:10          0 touched-at-20191027195018
    
       18      2019-10-27 19:51:10          0 touched-at-20191027195020
    
       19      2019-10-27 19:51:10          0 touched-at-20191027195021
    
       20      2019-10-27 19:51:10          0 touched-at-20191027195022
    
       21      2019-10-27 19:51:10          0 touched-at-20191027195024

    言及する価値のある別の問題:さまざまな構成で遊んだ後、ゲートウェイと共有を作成および破棄した後、ファイルゲートウェイをアクティブ化しようとしたときに、内部エラーが発生しました:

    コマンドラインに詳細が表示されますが、問題は示されていません。

    ~$ curl -sv "http://107.22.30.30/?gatewayType=FILE_S3&activationRegion=us-east-1"
    
    *   Trying 107.22.30.30:80...
    
    * TCP_NODELAY set
    
    * Connected to 107.22.30.30 (107.22.30.30) port 80 (#0)
    
    > GET /?gatewayType=FILE_S3&activationRegion=us-east-1 HTTP/1.1
    
    > Host: 107.22.30.30
    
    > User-Agent: curl/7.65.3
    
    > Accept: */*
    
    >
    
    * Mark bundle as not supporting multiuse
    
    < HTTP/1.1 500 Internal Server Error
    
    < Date: Mon, 28 Oct 2019 06:33:30 GMT
    
    < Content-type: text/html
    
    < Content-length: 14
    
    <
    
    * Connection #0 to host 107.22.30.30 left intact
    
    Internal Error~ $

    このフォーラムの投稿は、私の問題が、作成したVPCエンドポイントに関係している可能性があることを指摘しています。私の修正は、さまざまなiSCSI試行錯誤の実行中にセットアップしたVPCエンドポイントを削除することでした。

    S3は保存データを暗号化しますが、NFSワイヤトラフィックはプレーンテキストです。つまり、tcpdumpパケットダンプは次のとおりです。

    23:47:12.225273 IP 192.168.0.11.936 > 107.22.30.30.2049: Flags [P.], seq 2665:3377, ack 2929, win 501, options [nop,nop,TS val 1899459538 ecr 38013066], length 712: NFS request xid 3511704119 708 getattr fh 0,2/53
    
    [email protected]@.......k.......        ...c..............
    
    q7s..D.......PZ7...........................4........omiday.can.local...................................................5.......]...........!....................C...
    
    ..............&...........]....................# inittab is no longer used.
    
    #
    
    # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
    
    #
    
    # Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
    
    #
    
    # systemd uses 'targets' instead of runlevels. By default, there are two main targets:
    
    #
    
    # multi-user.target: analogous to runlevel 3
    
    # graphical.target: analogous to runlevel 5
    
    #
    
    # To view current default target, run:
    
    # systemctl get-default
    
    #
    
    # To set a default target, run:
    
    # systemctl set-default TARGET.target
    
    .....   .........0..
    
    23:47:12.331592 IP 107.22.30.30.2049 > 192.168.0.11.936: Flags [P.], seq 2929:3109, ack 3377, win 514, options [nop,nop,TS val 38013174 ecr 1899459538], length 180: NFS reply xid 3511704119 reply ok 176 getattr NON 4 ids 0/33554432 sz -2138196387

    このIEEドラフトが承認されるまで、AWSの外部から接続するための唯一の安全なオプションは、VPNトンネルを使用することです。これによりセットアップが複雑になり、オンプレミスのNFSオプションは、後で説明するFUSEベースのツールよりも魅力的ではなくなります。

    iSCSI

    このオプションは、AWS StorageGatewayVolumeサービスによって提供されます。サービスが構成されたら、LinuxiSCSIクライアントのセットアップセクションに進みます。

    NFSよりもiSCSIを使用する利点は、Amazonクラウドのネイティブバックアップ、クローン作成、およびスナップショットサービスを利用できることにあります。詳細とステップバイステップの手順については、AWSバックアップ、ボリュームクローン作成、EBSスナップショットへのリンクをたどってください

    多くの利点がありますが、多くのユーザーを失望させる可能性のある重要な制限があります。パブリックIPアドレスを介してゲートウェイにアクセスすることはできません。したがって、NFSオプションと同様に、この要件によりセットアップが複雑になります。

    明確な制限があり、このセットアップを完了できないと確信していましたが、それでも、それがどのように行われるかを感じたいと思いました。ウィザードはAWSMarketplaceの設定画面にリダイレクトします。

    マーケットプレイスウィザードはセカンダリディスクを作成しますが、サイズであるため、ホストのセットアップ手順に示されているように、必要な2つのボリュームを追加する必要があります。ストレージ要件が満たされていない場合、ウィザードはローカルディスク構成画面でブロックします:

    Amazonマーケットプレイスの設定画面をご覧ください:

    SSH経由でアクセスできるテキストインターフェイスがあります(ユーザーsguserとしてログイン)これは、基本的なネットワークトラブルシューティングツールと、WebGUIでは実行できないその他の構成オプションを提供します。

    ~ $ ssh [email protected]
    
    Warning: Permanently added 'ec2-3-231-96-109.compute-1.amazonaws.com,3.231.96.109' (ECDSA) to the list of known hosts.
    
    'screen.xterm-256color': unknown terminal type.
    
    
    
    
          AWS Storage Gateway Configuration
    
    
    
          #######################################################################
    
          ##  Currently connected network adapters:
    
          ##
    
          ##  eth0: 172.31.1.185
    
          #######################################################################
    
    
    
          1: SOCKS Proxy Configuration
    
          2: Test Network Connectivity
    
          3: Gateway Console
    
          4: View System Resource Check (0 Errors)
    
    
    
          0: Stop AWS Storage Gateway
    
    
    
          Press "x" to exit session
    
    
    
          Enter command:

    その他の重要なポイント:

    • NFSセットアップとは異なり、ボリュームゲートウェイのFAQセクションに記載されているようにS3ストレージに直接アクセスすることはできません。
    • AWSのドキュメントでは、接続のパフォーマンスとセキュリティを向上させるために、iSCSI設定をカスタマイズする必要があります。
    ヒューズ

    このカテゴリでは、PostgreSQLバックアップツールと比較してより完全なS3互換性を提供し、Amazon Storage Gatewayとは対照的に、オンプレミスホストからのデータ転送を可能にするFUSEベースのツールをリストしました。追加の設定なしでAmazonS3に。このような設定により、PostgreSQLバックアップツールが並列pg_dumpなどの機能を利用するために使用できるローカルファイルシステムとしてS3ストレージを提供できます。

    s3fs-fuse

    s3fs-fuseはAmazonS3SDKツールキットでサポートされている言語であるC++で記述されているため、マルチパートアップロード、キャッシング、S3ストレージクラス、サーバーなどの高度なS3機能の実装に最適です。サイド暗号化、およびリージョン選択。また、POSIXとの互換性も高くなっています。

    アプリケーションは私のFedora30に含まれているため、インストールが簡単です。

    テストするには:

    ~/mnt/s9s $ time pg_dump -d test | gzip -c >test.pg_dump-$(date +%Y%m%d-%H%M%S).gz
    
    real    0m35.761s
    
    user    0m16.122s
    
    sys     0m2.228s
    
    ~/mnt/s9s $ aws s3 ls s3://s9s-postgresql-backup
    
    2019-10-28 03:16:03   79110010 test.pg_dump-20191028-031535.gz

    NFSオプションでAmazonStorageGatewayを使用するよりも速度がやや遅いことに注意してください。 POSIX互換性の高いファイルシステムを提供することで、パフォーマンスの低下を補います。

    S3QL

    S3QLは、ストレージクラスやサーバー側の暗号化などのS3機能を提供します。多くの機能は徹底的なS3QLドキュメントに記載されていますが、マルチパートアップロードを探している場合は、どこにも言及されていません。これは、S3QLが重複排除機能を提供するために独自のファイル分割アルゴリズムを実装しているためです。すべてのファイルは10MBのブロックに分割されます。

    Red Hatベースのシステムへのインストールは簡単です。yumを介して必要なRPM依存関係をインストールします:

    sqlite-devel-3.7.17-8.14.amzn1.x86_64
    
    fuse-devel-2.9.4-1.18.amzn1.x86_64
    
    fuse-2.9.4-1.18.amzn1.x86_64
    
    system-rpm-config-9.0.3-42.28.amzn1.noarch
    
    python36-devel-3.6.8-1.14.amzn1.x86_64
    
    kernel-headers-4.14.146-93.123.amzn1.x86_64
    
    glibc-headers-2.17-260.175.amzn1.x86_64
    
    glibc-devel-2.17-260.175.amzn1.x86_64
    
    gcc-4.8.5-1.22.amzn1.noarch
    
    gcc48-4.8.5-28.142.amzn1.x86_64
    
    mpfr-3.1.1-4.14.amzn1.x86_64
    
    libmpc-1.0.1-3.3.amzn1.x86_64
    
    libgomp-6.4.1-1.45.amzn1.x86_64
    
    libgcc48-4.8.5-28.142.amzn1.x86_64
    
    cpp48-4.8.5-28.142.amzn1.x86_64
    
    python36-pip-9.0.3-1.26.amzn1.noarch
    
    python36-libs-3.6.8-1.14.amzn1.x86_64
    
    python36-3.6.8-1.14.amzn1.x86_64
    
    python36-setuptools-36.2.7-1.33.amzn1.noarch

    次に、pip3を使用してPythonの依存関係をインストールします:

    pip-3.6 install setuptools cryptography defusedxml apsw dugong pytest requests llfuse==1.3.6

    このツールの注目すべき特徴は、S3バケットの上に作成されたS3QLファイルシステムです。

    グーフィー

    goofysは、パフォーマンスがPOSIX準拠よりも優れている場合のオプションです。目標はs3fs-fuseの反対です。速度への焦点は、分布モデルにも反映されています。 Linuxの場合、ビルド済みのバイナリがあります。ダウンロードしたら実行:

    ~/temp/goofys $ ./goofys s9s-postgresql-backup ~/mnt/s9s/

    そしてバックアップ:

    ~/mnt/s9s $ time pg_dump -d test | gzip -c >test.pg_dump-$(date +%Y%m%d-%H%M%S).gz
    
    
    
    real    0m27.427s
    
    user    0m15.962s
    
    sys     0m2.169s
    
    
    
    ~/mnt/s9s $ aws s3 ls s3://s9s-postgresql-backup
    
    2019-10-28 04:29:05   79110010 test.pg_dump-20191028-042902.gz

    S3でのオブジェクト作成時間は、ファイルのタイムスタンプからわずか3秒離れていることに注意してください。

    ObjectFS

    ObjectFSは、約6か月前まで維持されていたようです。マルチパートアップロードをチェックすると、実装されていないことがわかります。著者の研究論文から、システムはまだ開発中であることがわかりました。この論文は2019年にリリースされたので、言及する価値があると思いました。

    S3クライアント

    前述のように、AWS S3 CLIを使用するには、オブジェクトストレージ全般、特にAmazonS3に固有のいくつかの側面を考慮する必要があります。唯一の要件がS3ストレージとの間でデータを転送する機能である場合は、AmazonS3の推奨事項に厳密に従うツールでその作業を実行できます。

    s3cmdは、時の試練に耐えたツールの1つです。この2010年のOpenBIブログでは、S3がブロックの新しい子供だったときに、それについて説明しています。

    注目すべき機能:

    • サーバー側の暗号化
    • 自動マルチパートアップロード
    • 帯域幅調整

    詳細については、S3cmd:FAQおよびナレッジベースにアクセスしてください。

    結論

    PostgreSQLクラスターをAmazonS3にバックアップするために使用できるオプションは、データ転送方法と、AmazonS3戦略との整合性が異なります。

    AWS Storage Gatewayは、AmazonのS3オブジェクトストレージを補完しますが、このサービスを最大限に活用するために必要な追加の知識に加えて、複雑さが増します。たとえば、正しい数のディスクを選択するには慎重な計画が必要であり、運用コストを最小限に抑えるには、AmazonのS3関連のコストを十分に把握する必要があります。

    Amazon S3だけでなく、あらゆるクラウドストレージに適用できますが、データをパブリッククラウドに保存するという決定には、セキュリティ上の影響があります。 Amazon S3は、保存データと転送中のデータの暗号化を提供します。ゼロ知識の保証や知識の証明はありません。データを完全に制御したい組織は、クライアント側の暗号化を実装し、AWSインフラストラクチャの外部に暗号化キーを保存する必要があります。

    S3をローカルファイルシステムにマッピングするための商用の代替手段については、ObjectiveFSまたはNetAppの製品をチェックする価値があります。

    最後に、多くのオープンソースアプリケーションによって提供される基盤の上に構築するか、ゼロから開始することによって、独自のバックアップツールを開発しようとしている組織は、Cephプロジェクトによって利用可能になったS3互換性テストの使用を検討する必要があります。


    1. どのSqlDbTypeがvarBinary(max)にマップされますか?

    2. PostgreSQL列fooは存在しません。fooは値です。

    3. 私のお気に入りのPostgreSQL拡張機能-パート2-

    4. PostgreSQLデータソースをWildFly9.0に追加するにはどうすればよいですか?