実動用の構築:Webアプリケーション—バックアップ

前書き

アプリケーションのさまざまなコンポーネントの回復計画を思いついたら、それをサポートするために必要なバックアップシステムをセットアップする必要があります。 このチュートリアルでは、Baculaをバックアップソリューションとして使用することに焦点を当てます。 Baculaなどの本格的なバックアップシステムを使用する利点は、個々のファイルレベルでバックアップおよび復元するものを完全に制御できることであり、最適な方法に従ってバックアップおよび復元をスケジュールできることです。

Backup Diagram

DigitalOcean Droplet Backups(ドロップレット全体のスナップショットバックアップ)などのソリューションはセットアップが簡単で、毎週のバックアップのみが必要な場合は、ニーズに十分対応できる場合があります。 DigitalOceanバックアップを選択する場合は、必ずCreate Hot Backups of Your Databaseセクションに従ってデータベースのホットバックアップを設定してください。

チュートリアルのこの部分では、リカバリプランで以前に定義したアプリケーションセットアップ(db1、app1、app2、およびlb1)を構成するサーバーのrequired backupsの毎日のバックアップを維持するようにBaculaをセットアップします。基本的に、これはBaculaを使用してLAMPスタックのバックアップを作成する方法を示すチュートリアルです。 また、Percona XtraBackupを使用して、MySQLデータベースのホットバックアップを作成します。 最後に、rsyncを使用して、リモートデータセンターのサーバー上にバックアップのコピーを作成します。 これにより、セットアップに2つのサーバーbackupsremotebackups(別のデータセンターにあります)が追加されます。

始めましょう。

バックアップサーバーにBaculaをインストールする

次のチュートリアルに従って、backupsサーバーにBaculaをセットアップします:How To Install Bacula Server on Ubuntu 14.04

次に、このチュートリアルのOrganize Bacula Director Configuration (Server)セクションに従ってください:How To Back Up an Ubuntu 14.04 Server with Bacula。 (バックアップしたいサーバー上で)Baculaクライアントをセットアップするとき、Director Nameが必要になります。 Install and Configure Bacula Clientセクションに到達したら停止します。

設定するすべてのバックアップジョブにRemoteFileプールを使用することに注意してください。 とはいえ、先に進む前に設定の一部を変更することもできます。

各サーバーにBaculaクライアントをインストールする

このチュートリアルのInstall and Configure Bacula Clientセクション(How To Back Up an Ubuntu 14.04 Server with Bacula)に従って、バックアップする各サーバー(db1、app1、app2、およびlb1)にBaculaクライアントをインストールします。 Add FileSets (Server)セクションに到達したら停止します。

bacula-fd.confからFileDaemon Name(通常は「-fd」が付加されたホスト名)とDirector Password(Baculaサーバーが各クライアントに接続するために使用するパスワード)が必要になることに注意してください。 ■各サーバー上のファイル。

Baculaクライアントをバックアップサーバーに追加する

Baculaサーバーであるbackupsで、Baculaクライアントをインストールした各サーバーの/etc/bacula/conf.d/clients.confファイルにClient resourceを追加します。

clients.confファイルを開きます。

sudo vi /etc/bacula/conf.d/clients.conf

これは、データベースサーバーdb1のクライアントリソース定義の例です。 Nameの値は、クライアントサーバー上のFileDaemonリソースの名前と一致し、PasswordDirectorリソースのパスワードと一致する必要があることに注意してください。これらの値各Baculaクライアントサーバーの/etc/bacula/bacula-fd.confにあります。

clients.conf — Example Client resource definition

Client {
  Name = db1-fd
  Address = db1.nyc3.example.com
  FDPort = 9102
  Catalog = MyCatalog
  Password = "PDL47XPnjI0QzRpZVJKCDJ_xqlMOp4k46"          # password for Remote FileDaemon
  File Retention = 30 days            # 30 days
  Job Retention = 6 months            # six months
  AutoPrune = yes                     # Prune expired Jobs/Files
}

残りのBaculaクライアントサーバーのそれぞれに対して同様のクライアントリソースを作成します。 この例では、終了時に4つのクライアントリソース(db1-fdapp1-fdapp2-fd、およびlb1-fd)が存在するはずです。 これにより、backupsサーバー上のBacula Directorが、各サーバー上のBaculaクライアントに接続できるように構成されます。

保存して終了。

このセクションの詳細については、How To Back Up an Ubuntu Server with Bacula tutorialInstall and Configure Bacula Clientを参照してください。

データベースのホットバックアップを作成する

一貫性のある(つまり、 使用可能)アクティブデータベースのバックアップ、特別な注意が必要です。 MySQLでホットバックアップを作成する簡単で効果的な方法は、Percona XtraBackupを使用することです。

Percona XtraBackupをインストールする

データベースサーバーdb1で、次のチュートリアルに従ってPercona XtraBackupをインストールして構成します:How To Create Hot Backups of MySQL Databases with Percona XtraBackup on Ubuntu 14.04Perform Full Hot Backupセクションに到達したら停止します。

XtraBackupスクリプトを作成する

Percona XtraBackupはMySQLデータベースのホットバックアップを作成する準備ができており、最終的にBacula(またはDigitalOceanバックアップ)によってバックアップされますが、ホットバックアップは何らかの方法でスケジュールする必要があります。 最も簡単なソリューション、bashスクリプトとcronジョブをセットアップします。

/usr/local/binrun_extra_backup.shというbashスクリプトを作成します。

sudo vi /usr/local/bin/run_xtrabackup.sh

次のスクリプトを追加します。 XtraBackupのインストール時に設定したものでユーザーとパスワードを必ず置き換えてください。

/usr/local/bin/run_xtrabackup.sh

#!/bin/bash

# pre xtrabackup
chown -R mysql: /var/lib/mysql
find /var/lib/mysql -type d -exec chmod 770 "{}" \;

# delete existing full backup
rm -r /data/backups/full

# xtrabackup create backup
innobackupex --user=bkpuser  --password=bkppassword --no-timestamp /data/backups/full

# xtrabackup prepare backup
innobackupex --apply-log /data/backups/full

保存して終了。 このスクリプトを(スーパーユーザー権限で)実行すると、/data/backups/fullにある既存のXtraBackupバックアップが削除され、新しい完全バックアップが作成されます。 XtraBackupを使用したバックアップの作成の詳細については、XtraBackupチュートリアルのPerform Full Hot Backupセクションを参照してください。

スクリプトを実行可能にします。

sudo chmod +x /usr/local/bin/run_xtrabackup.sh

データベースを適切にバックアップするには、Baculaがデータベースサーバーをバックアップする前にXtraBackupスクリプトを実行(および完了)する必要があります。 良い解決策は、スクリプトを「バックアップ前スクリプト」として実行するようにBaculaバックアップジョブを構成することですが、単純にするためにcron jobを使用することを選択します。

cron構成ファイルを作成します(/etc/cron.d内のファイルはルートのcronタブに追加されます):

sudo vi /etc/cron.d/xtrabackup

次のcronジョブを追加します。

/etc/cron.d/xtrabackup

30 22    * * *   root    /usr/local/bin/run_xtrabackup.sh

これにより、スクリプトは毎日午後10時30分(22時30分)にrootとして実行されるようにスケジュールされます。 Baculaは現在、毎日午後11時5分にバックアップジョブを実行するようにスケジュールされているため、この時間を選択しました。この調整については後で説明します。 これにより、XtraBackupスクリプトが完了するまで35分かかります。

データベースのホットバックアップが設定されたので、Baculaのバックアップファイルセットを見てみましょう。

Baculaファイルセットを構成する

Baculaは、実行されるバックアップジョブに関連付けられたファイルセットで指定されたファイルのバックアップを作成します。 このセクションでは、リカバリプランで特定したrequired backupsを含むファイルセットの作成について説明します。 FileSetをBaculaに追加する方法の詳細については、BaculaチュートリアルのAdd FileSets (Server)セクションを参照してください。

backupsサーバーで、filesets.confファイルを開きます。

sudo vi /etc/bacula/conf.d/filesets.conf

データベースサーバーファイルセット

データベースサーバーの復旧計画に従って、データベースサーバーに必要なバックアップは次のとおりです。

  • MySQL database:バックアップコピーは、XtraBackupスクリプトによって/data/backups/fullで、毎日午後10時30分に作成されます。

  • /etc/mysqlにあるMySQL configuration:

XtraBackupスクリプト/usr/local/bin/run_xtrabackup.sh、および関連するcronファイルも含まれます。

必要なバックアップを念頭に置いて、この「MySQLデータベース」ファイルセットをBacula設定に追加します。

filesets.conf — MySQL Database

FileSet {
  Name = "MySQL Database"
  Include {
    Options {
      signature = MD5
      compression = GZIP
    }
    File = /data/backups
    File = /etc/mysql/my.cnf
    File = /usr/local/bin/run_xtrabackup.sh
    File = /etc/cron.d/xtrabackup
  }
  Exclude {
    File = /data/backups/exclude
  }
}

それでは、アプリケーションサーバーのFileSetに移りましょう。

アプリケーションサーバーのファイルセット

アプリケーションサーバーの復旧計画に従って、アプリケーションサーバーに必要なバックアップには次のものが含まれます。

  • この例では、/var/www/htmlにあるApplication Files:

必要なバックアップを念頭に置いて、この「Apache DocumentRoot」FileSetをBacula構成に追加します。

filesets.conf — Apache DocumentRoot

FileSet {
  Name = "Apache DocumentRoot"
  Include {
    Options {
      signature = MD5
      compression = GZIP
    }
    File = /var/www/html
  }
  Exclude {
    File = /var/www/html/exclude
  }
}

Apacheポート構成ファイルも含めることができますが、これは簡単に交換できます。

次に、ロードバランサーサーバーのFileSetに進みます。

ロードバランサーサーバーFileSet

ロードバランサーサーバーの復旧計画に従って、ロードバランサーサーバーに必要なバックアップは次のとおりです。

  • この例では、/root/certsにあるSSL Certificate (PEM) and related files:

  • /etc/haproxyにあるHAProxy configuration file:

必要なバックアップを念頭に置いて、この「Apache DocumentRoot」FileSetをBacula構成に追加します。

filesets.conf — SSL Certs and HAProxy Config

FileSet {
  Name = "SSL Certs and HAProxy Config"
  Include {
    Options {
      signature = MD5
      compression = GZIP
    }
    File = /root/certs
    File = /etc/haproxy
  }
  Exclude {
    File = /root/exclude
  }
}

保存して終了。

これで、ファイルセットが構成されました。 これらのファイルセットを使用するBaculaバックアップジョブの作成に移りましょう。

Baculaのバックアップジョブを作成する

サーバーのバックアップを実行および作成するBaculaバックアップジョブを作成します。

/etc/bacula/conf.djobs.confファイルを作成します。

sudo vi /etc/bacula/conf.d/jobs.conf

データベースサーバーバックアップジョブ

データベースサーバーのバックアップジョブでは、「Backup db1」という名前の新しいジョブを作成します。 ここで重要なことは、正しいClient(db1-fd)とFileSet(MySQLデータベース)を指定することです。

jobs.conf — Backup db1

Job {
  Name = "Backup db1"
  JobDefs = "DefaultJob"
  Client = db1-fd
  Pool = RemoteFile
  FileSet="MySQL Database"
}

次に、アプリケーションサーバーのバックアップジョブを設定します。

アプリケーションサーバーのバックアップジョブ

アプリケーションサーバーの場合、「Backup app1」および「Backup app2」という2つのバックアップジョブを作成します。 ここで重要なのは、正しいClients(app1-fdおよびapp2-fd)とFileSet(Apache DocumentRoot)を指定することです。

App1ジョブ:

jobs.conf — Backup app1

Job {
  Name = "Backup app1"
  JobDefs = "DefaultJob"
  Client = app1-fd
  Pool = RemoteFile
  FileSet="Apache DocumentRoot"
}

App2ジョブ:

jobs.conf — Backup app2

Job {
  Name = "Backup app2"
  JobDefs = "DefaultJob"
  Client = app2-fd
  Pool = RemoteFile
  FileSet="Apache DocumentRoot"
}

次に、ロードバランサーサーバーのバックアップジョブを設定します。

ロードバランサーサーバーのバックアップジョブ

ロードバランサーサーバーのバックアップジョブでは、「Backup lb1」という名前の新しいジョブを作成します。 ここで重要なことは、正しいClient(lb1-fd)とFileSet(SSL証明書とHAProxy構成)を指定することです。

jobs.conf — Backup lb1

Job {
  Name = "Backup lb1"
  JobDefs = "DefaultJob"
  Client = lb1-fd
  Pool = RemoteFile
  FileSet="SSL Certs and HAProxy Config"
}

保存して終了。

これで、バックアップジョブが構成されました。 最後のステップは、Bacula Directorを再起動することです。

Bacula Directorを再起動します

backupsサーバーで、Bacula Directorを再起動して、すべての変更を有効にします。

sudo service bacula-director restart

この時点で、クライアント接続とバックアップジョブをテストする必要があります。これらは両方ともHow To Back Up a Server with Bacula tutorialでカバーされています。 このチュートリアルでは、Baculaのバックアップを復元する方法も説明しています。 MySQLデータベースを復元するには、Percona XtraBackupチュートリアルのPerform Backup Restorationの手順に従う必要があることに注意してください。

バックアップスケジュールの確認

Baculaのバックアップスケジュールは、Bacula Directorの構成(/etc/bacula/bacula-dir.conf)を変更することで調整できます。 作成したすべてのバックアップジョブは、次のように定義される「WeeklyCycle」スケジュールを使用する「DefaultJob」JobDefを使用します。

  • 月の第1日曜日の午後11時5分に完全バックアップ

  • 他のすべての日曜日の午後11:05の差分バックアップ

  • 月曜日から土曜日の午後11時5分に、他の日に増分バックアップ

これを確認するには、Baculaコンソールを使用してDirectorのステータスを確認します。 スケジュールされたすべてのジョブを出力するはずです:

Director Status — Scheduled JobsScheduled Jobs:
Level          Type     Pri  Scheduled          Name               Volume
===================================================================================
Incremental    Backup    10  20-May-15 23:05    BackupLocalFiles   MyVolume
Incremental    Backup    10  20-May-15 23:05    Backup lb1         Remote-0002
Incremental    Backup    10  20-May-15 23:05    Backup app2        Remote-0002
Incremental    Backup    10  20-May-15 23:05    Backup app1        Remote-0002
Incremental    Backup    10  20-May-15 23:05    Backup db1         Remote-0002

バックアップジョブのスケジュールを自由に追加または調整してください。 Percona XtraBackupスクリプトが実行されるのと同時に(10:30 pm)発生するように、アプリケーションサーバーのスケジュールを変更することは理にかなっています。 これにより、アプリケーションとデータベースのバックアップが互いに矛盾しなくなります。

リモートバックアップのセットアップ

これで、Baculaバックアップのコピーを保存するリモートサーバーをセットアップする準備が整いました。 このリモートサーバーは、本番データセンターで災害が発生した場合でも重要なバックアップのコピーを保持できるように、地理的に離れた地域に配置する必要があります。 この例では、remotebackupsサーバーにDigitalOceanのサンフランシスコ(SFO1)リージョンを使用します。

公開SSHキー、rsync、およびcronを使用して、backupsサーバーからremotebackupsサーバーにバックアップを送信する簡単な方法を説明します。

remotebackupsサーバーでは、rsyncログインに使用されるcreate a user

次に、backupsサーバーで、rootとしてパスワードなしのSSHキーペアを生成します。 作成したremotebackupsユーザーに公開鍵をインストールします。 これについては、How To Set Up SSH Keysのチュートリアルで説明しています。

backupsサーバーで、Baculaバックアップデータ(/bacula/backup)をremotebackupsサーバーのどこかにコピーするrsyncコマンドを記述します。 Rsyncの使用法はHow To Use Rsync tutorialでカバーされています。 コマンドはおそらく次のようになります。

rsync -az /bacula/backup remoteuser@remotebackups_public_hostname_or_IP:/path/to/remote/backup

コマンドを/usr/local/bin/rsync_backups.shなどのスクリプトに追加し、実行可能にします。

最後に、Baculaのバックアップジョブが通常完了した後、ルートとしてrsync_backups.shスクリプトを実行するcronジョブを設定する必要があります。 これはHow To Schedule Routine Tasks With Cron tutorialでカバーされています。

これらすべてを設定したら、翌日、remotebackupsサーバーにバックアップのコピーがあることを確認します。

その他の考慮事項

バックアップのディスク要件については話しませんでした。 バックアップが使用しているディスク容量を確認し、ニーズとリソースに基づいてセットアップとバックアップのスケジュールを修正する必要があります。

アプリケーションサーバーのバックアップを作成することに加えて、セットアップに追加された他のサーバーのバックアップをセットアップすることをお勧めします。 たとえば、Baculaを設定して、監視サーバーと集中ログサーバーを立ち上げて実行した後にバックアップを作成する必要があります。

結論

これで、運用アプリケーションサーバーの毎日のバックアップとそれらのバックアップのリモートコピーが必要になります。 ファイルを復元できることを確認し、データを復元する手順を回復計画に追加してください。

次のチュートリアルに進んで、運用サーバー設定の監視の設定を開始します:Building for Production: Web Applications — Monitoring

Related