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

AmazonAWSでのMySQLまたはMariaDBデータベースのコールドスタンバイの構築

    ほとんどの組織はデータを失うことを許せないため、最近では高可用性が必須です。ただし、高可用性には常に値札が付いています(これは大きく異なる可能性があります)。ほぼ即時のアクションを必要とするセットアップには、通常、本番セットアップを正確に反映する高価な環境が必要になります。ただし、他にも安価なオプションがあります。これらでは、ディザスタリカバリクラスタにすぐに切り替えることができない場合がありますが、それでもビジネス継続性は可能です(そして予算を浪費することはありません)。

    このタイプのセットアップの例は、「コールドスタンバイ」DR環境です。これにより、災害が発生した場合に外部の場所で新しい環境を起動しながら、経費を削減できます。このブログ投稿では、そのような設定を作成する方法を示します。

    初期設定 独自のデータセンターにかなり標準的なマスター/スレーブMySQLレプリケーションのセットアップがあると仮定しましょう。これは、仮想IP処理用のProxySQLおよびKeepalivedを使用した高可用性セットアップです。主なリスクは、データセンターが利用できなくなることです。これは小さなDCであり、BGPが配置されていない唯一のISPである可能性があります。そして、この状況では、データベースを元に戻すのに数時間かかる場合は、データベースを元に戻すことができる限り、問題ないと想定します。

    このクラスターを展開するために、無料でダウンロードできるClusterControlを使用しました。 DR環境では、EC2を使用します(ただし、他のクラウドプロバイダーでもかまいません)。

    課題

    対処しなければならない主な問題は、ディザスタリカバリ環境でデータベースを復元するための新しいデータをどのように確保する必要があるかということです。もちろん、理想的には、EC2でレプリケーションスレーブを稼働させます...しかし、その場合は料金を支払う必要があります。予算が厳しい場合は、バックアップでそれを回避することができます。最悪のシナリオでは、すべてのデータを回復することはできないため、これは完全なソリューションではありません。

    「最悪のシナリオ」とは、元のデータベースサーバーにアクセスできない状況を意味します。それらに到達できれば、データは失われていなかったでしょう。

    ソリューション

    ClusterControlを使用してバックアップスケジュールを設定し、データが失われる可能性を減らします。また、ClusterControl機能を使用してバックアップをクラウドにアップロードします。データセンターが利用できない場合は、選択したクラウドプロバイダーにアクセスできることを期待できます。

    ClusterControlでのバックアップスケジュールの設定

    まず、クラウドのクレデンシャルを使用してClusterControlを構成する必要があります。

    これは、左側のメニューの[統合]を使用して行うことができます。

    クラウドとしてAmazonWebServices、Google Cloud、またはMicrosoftAzureを選択できますClusterControlにバックアップをアップロードさせます。 ClusterControlがS3を使用してバックアップを保存するAWSを進めます。

    次に、キーIDとキーシークレットを渡し、デフォルトのリージョンを選択する必要がありますこの一連の資格情報の名前を選択します。

    これが完了すると、追加したばかりのクレデンシャルが次のように表示されます。 ClusterControl。

    次に、バックアップスケジュールの設定に進みます。

    ClusterControlを使用すると、バックアップをすぐに作成するか、スケジュールすることができます。 2番目のオプションを使用します。次のスケジュールを作成する必要があります:

    1. 1日に1回作成される完全バックアップ
    2. 10分ごとに作成される増分バックアップ。
    ここでの考え方は次のようになります。最悪のシナリオでは、トラフィックの10分だけが失われます。データセンターが外部から利用できなくなっても内部で機能する場合は、10分待って、最新の増分バックアップをラップトップにコピーし、電話のテザリングを使用して手動でDRデータベースに送信することでデータ損失を回避できます。 ISPの障害を回避するためのセルラー接続。しばらくの間、古いデータセンターからデータを取得できない場合、これは、DRデータベースに手動でマージする必要があるトランザクションの量を最小限に抑えることを目的としています。

    毎日午前2時に実行される完全バックアップから開始します。マスターを使用してバックアップを取得し、コントローラーの/ root /backups/ディレクトリに保存します。 「バックアップをクラウドにアップロード」オプションも有効にします。

    次に、デフォルト構成にいくつかの変更を加えます。自動的に選択されたフェイルオーバーホストを使用することにしました(マスターが使用できない場合、ClusterControlは使用可能な他のノードを使用します)。また、ネットワーク経由でバックアップを送信するため、暗号化を有効にしたかったのです。

    次に、資格情報を選択するか、既存のS3バケットを選択するか、必要に応じて新しいもの。

    基本的に、増分バックアップのプロセスを繰り返していますが、今回は10分ごとにバックアップを実行するための「詳細」ダイアログ。

    残りの設定も同様で、S3バケットを再利用することもできます。

    バックアップスケジュールは上記のようになります。手動で完全バックアップを開始する必要はありません。ClusterControlはスケジュールどおりに増分バックアップを実行し、使用可能な完全バックアップがないことを検出すると、増分バックアップではなく完全バックアップを実行します。

    このような設定により、外部システムのデータを10分の粒度で復元できると言っても過言ではありません。

    手動バックアップ復元

    ディザスタリカバリインスタンスでバックアップを復元する必要がある場合は、いくつかの手順を実行する必要があります。このプロセスを時々テストして、正しく機能し、実行に習熟していることを確認することを強くお勧めします。

    まず、ターゲットサーバーにAWSコマンドラインツールをインストールする必要があります:

    [email protected]:~# apt install python3-pip
    
    [email protected]:~# pip3 install awscli --upgrade --user

    次に、適切な資格情報を使用して構成する必要があります:

    [email protected]:~# ~/.local/bin/aws configure
    
    AWS Access Key ID [None]: yourkeyID
    
    AWS Secret Access Key [None]: yourkeySecret
    
    Default region name [None]: us-west-1
    
    Default output format [None]: json

    これで、S3バケット内のデータにアクセスできるかどうかをテストできます。

    [email protected]:~# ~/.local/bin/aws s3 ls s3://drbackup/
    
                               PRE BACKUP-1/
    
                               PRE BACKUP-2/
    
                               PRE BACKUP-3/
    
                               PRE BACKUP-4/
    
                               PRE BACKUP-5/
    
                               PRE BACKUP-6/
    
                               PRE BACKUP-7/

    次に、データをダウンロードする必要があります。バックアップ用のディレクトリを作成します。バックアップセット全体をダウンロードする必要があることを忘れないでください。完全バックアップから、適用する最後の増分バックアップまでです。

    [email protected]:~# mkdir backups
    
    [email protected]:~# cd backups/

    これで、2つのオプションがあります。バックアップを1つずつダウンロードすることもできます:

    [email protected]:~# ~/.local/bin/aws s3 cp s3://drbackup/BACKUP-1/ BACKUP-1 --recursive
    
    download: s3://drbackup/BACKUP-1/cmon_backup.metadata to BACKUP-1/cmon_backup.metadata
    
    Completed 30.4 MiB/36.2 MiB (4.9 MiB/s) with 1 file(s) remaining
    
    download: s3://drbackup/BACKUP-1/backup-full-2019-08-20_113009.xbstream.gz.aes256 to BACKUP-1/backup-full-2019-08-20_113009.xbstream.gz.aes256
    
    
    
    [email protected]:~# ~/.local/bin/aws s3 cp s3://drbackup/BACKUP-2/ BACKUP-2 --recursive
    
    download: s3://drbackup/BACKUP-2/cmon_backup.metadata to BACKUP-2/cmon_backup.metadata
    
    download: s3://drbackup/BACKUP-2/backup-incr-2019-08-20_114009.xbstream.gz.aes256 to BACKUP-2/backup-incr-2019-08-20_114009.xbstream.gz.aes256

    特にローテーションのスケジュールが厳しい場合は、バケットのすべてのコンテンツをサーバーにローカルにあるものと同期することもできます。

    [email protected]:~/backups# ~/.local/bin/aws s3 sync s3://drbackup/ .
    
    download: s3://drbackup/BACKUP-2/cmon_backup.metadata to BACKUP-2/cmon_backup.metadata
    
    download: s3://drbackup/BACKUP-4/cmon_backup.metadata to BACKUP-4/cmon_backup.metadata
    
    download: s3://drbackup/BACKUP-3/cmon_backup.metadata to BACKUP-3/cmon_backup.metadata
    
    download: s3://drbackup/BACKUP-6/cmon_backup.metadata to BACKUP-6/cmon_backup.metadata
    
    download: s3://drbackup/BACKUP-5/cmon_backup.metadata to BACKUP-5/cmon_backup.metadata
    
    download: s3://drbackup/BACKUP-7/cmon_backup.metadata to BACKUP-7/cmon_backup.metadata
    
    download: s3://drbackup/BACKUP-3/backup-incr-2019-08-20_115005.xbstream.gz.aes256 to BACKUP-3/backup-incr-2019-08-20_115005.xbstream.gz.aes256
    
    download: s3://drbackup/BACKUP-1/cmon_backup.metadata to BACKUP-1/cmon_backup.metadata
    
    download: s3://drbackup/BACKUP-2/backup-incr-2019-08-20_114009.xbstream.gz.aes256 to BACKUP-2/backup-incr-2019-08-20_114009.xbstream.gz.aes256
    
    download: s3://drbackup/BACKUP-7/backup-incr-2019-08-20_123008.xbstream.gz.aes256 to BACKUP-7/backup-incr-2019-08-20_123008.xbstream.gz.aes256
    
    download: s3://drbackup/BACKUP-6/backup-incr-2019-08-20_122008.xbstream.gz.aes256 to BACKUP-6/backup-incr-2019-08-20_122008.xbstream.gz.aes256
    
    download: s3://drbackup/BACKUP-5/backup-incr-2019-08-20_121007.xbstream.gz.aes256 to BACKUP-5/backup-incr-2019-08-20_121007.xbstream.gz.aes256
    
    download: s3://drbackup/BACKUP-4/backup-incr-2019-08-20_120007.xbstream.gz.aes256 to BACKUP-4/backup-incr-2019-08-20_120007.xbstream.gz.aes256
    
    download: s3://drbackup/BACKUP-1/backup-full-2019-08-20_113009.xbstream.gz.aes256 to BACKUP-1/backup-full-2019-08-20_113009.xbstream.gz.aes256

    ご存知のとおり、バックアップは暗号化されています。 ClusterControlに保存されている暗号化キーが必要です。コピーがメインのデータセンターの外の安全な場所に保管されていることを確認してください。到達できない場合、バックアップを復号化することはできません。キーはClusterControl構成にあります:

    [email protected]:~# grep backup_encryption_key /etc/cmon.d/cmon_1.cnf
    
    backup_encryption_key='aoxhIelVZr1dKv5zMbVPLxlLucuYpcVmSynaeIEeBnM='

    base64を使用してエンコードされているため、バックアップの復号化を開始する前に、まずデコードしてファイルに保存する必要があります。

    echo "aoxhIelVZr1dKv5zMbVPLxlLucuYpcVmSynaeIEeBnM =" | openssl enc-base64-d>パス

    これで、このファイルを再利用してバックアップを復号化できます。今のところ、1つの完全バックアップと2つの増分バックアップを実行するとします。

    mkdir 1
    
    mkdir 2
    
    mkdir 3
    
    cat BACKUP-1/backup-full-2019-08-20_113009.xbstream.gz.aes256 | openssl enc -d -aes-256-cbc -pass file:/root/backups/pass | zcat | xbstream -x -C /root/backups/1/
    
    cat BACKUP-2/backup-incr-2019-08-20_114009.xbstream.gz.aes256 | openssl enc -d -aes-256-cbc -pass file:/root/backups/pass | zcat | xbstream -x -C /root/backups/2/
    
    cat BACKUP-3/backup-incr-2019-08-20_115005.xbstream.gz.aes256 | openssl enc -d -aes-256-cbc -pass file:/root/backups/pass | zcat | xbstream -x -C /root/backups/3/

    データが復号化されたので、MySQLサーバーのセットアップに進む必要があります。理想的には、これは実稼働システムとまったく同じバージョンである必要があります。 MySQL用のPerconaServerを使用します:

    cd ~
    wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
    
    sudo dpkg -i percona-release_latest.generic_all.deb
    
    apt-get update
    
    apt-get install percona-server-5.7

    複雑なことは何もありません。通常のインストールだけです。準備ができたら、停止してデータディレクトリの内容を削除する必要があります。

    service mysql stop
    
    rm -rf /var/lib/mysql/*

    バックアップを復元するには、Xtrabackupが必要です。これはCCがバックアップを作成するために使用するツールです(少なくともPeronaとOracle MySQLの場合、MariaDBはMariaBackupを使用します)。このツールは、運用サーバーと同じバージョンでインストールすることが重要です。

    apt install percona-xtrabackup-24
    準備する必要があるのはこれだけです。これで、バックアップの復元を開始できます。増分バックアップでは、基本バックアップの上にそれらを準備して適用する必要があることに注意することが重要です。ベースバックアップも準備する必要があります。 xtrabackupがロールバックフェーズを実行しないようにするには、「-apply-log-only」オプションを指定してprepareを実行することが重要です。そうしないと、次の増分バックアップを適用できません。

    xtrabackup --prepare --apply-log-only --target-dir=/root/backups/1/
    
    xtrabackup --prepare --apply-log-only --target-dir=/root/backups/1/ --incremental-dir=/root/backups/2/
    
    xtrabackup --prepare --target-dir=/root/backups/1/ --incremental-dir=/root/backups/3/

    最後のコマンドで、xtrabackupが未完了のトランザクションのロールバックを実行できるようにしました。その後、増分バックアップを適用することはありません。次に、データディレクトリにバックアップを入力し、MySQLを起動して、すべてが期待どおりに機能するかどうかを確認します。

    [email protected]:~/backups# mv /root/backups/1/* /var/lib/mysql/
    
    [email protected]:~/backups# chown -R mysql.mysql /var/lib/mysql
    
    [email protected]:~/backups# service mysql start
    
    [email protected]:~/backups# mysql -ppass
    
    mysql: [Warning] Using a password on the command line interface can be insecure.
    
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    
    Your MySQL connection id is 6
    
    Server version: 5.7.26-29 Percona Server (GPL), Release '29', Revision '11ad961'
    
    
    
    Copyright (c) 2009-2019 Percona LLC and/or its affiliates
    
    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
    
    
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    
    affiliates. Other names may be trademarks of their respective
    
    owners.
    
    
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    
    
    mysql> show schemas;
    
    +--------------------+
    
    | Database           |
    
    +--------------------+
    
    | information_schema |
    
    | mysql              |
    
    | performance_schema |
    
    | proxydemo          |
    
    | sbtest             |
    
    | sys                |
    
    +--------------------+
    
    6 rows in set (0.00 sec)
    
    
    
    mysql> select count(*) from sbtest.sbtest1;
    
    +----------+
    
    | count(*) |
    
    +----------+
    
    |    10506 |
    
    +----------+
    
    1 row in set (0.01 sec)

    ご覧のとおり、すべてが良好です。 MySQLは正しく起動し、それにアクセスすることができました(そしてデータはそこにあります!)データベースを別の場所で正常に稼働状態に戻すことができました。必要な合計時間は、データのサイズに厳密に依存します。S3からデータをダウンロードし、復号化して解凍し、最後にバックアップを準備する必要がありました。それでも、これは非常に安価なオプションであり(S3データのみを支払う必要があります)、災害が発生した場合にビジネスを継続するためのオプションを提供します。


    1. MySqlは、日次、週次、月次、および年次でレコードまたはデータを取得します

    2. Mavenの依存関係としてPostgreSQLドライバーをどのように追加しますか?

    3. MySQL SIGN()関数–MySQLで数値が正か負かを調べる

    4. Android用JDBCとWebサービス