OSS上のPHP - MySQLアプリケーションデータのバックアップ

このブログ記事では、**PHP - MySQL**アプリケーションのバックアップを取ること、バックアップをアリババクラウドのオブジェクトストレージサービスに保存することに焦点を当てています。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/backing-up-php-mysql-application-data-on-oss_595556)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

#序章
アプリケーションのバックアップは、システム管理者にとって最大の課題でした。クラウド技術の進化により、人々はシステムのスナップショットを使用してバックアップとして使用することができます。しかし、バックアッププロセスをより簡単にするために、いくつかの調整やツールを使用した他の多くの方法があります。

このブログ記事では、PHP - MySQLアプリケーションのバックアップを取ることに焦点を当て、OSS（アリババクラウド[オブジェクトストレージサービス](https://www.alibabacloud.com/ja/product/oss)）にバックアップを保存します。この記事では、バックアップの種類、オンラインとオフラインのバックアップ、バックアップストレージの種類など、バックアップの重要な側面をカバーしています。

#バックアップの種類
バックアップは主に3つのタイプに分かれています。Full、Differential とIncrementalです。

|Backup Type|	Backup|	Backup Time|	Storage Space|	Restore Time|
|:-----------|------|------|------|------:|
|Full Backup|	Full|	Slowest	|High|	Fast|
|Differential Backup|	All data since last full backup|	Medium	|Medium|	Fast|
|Incremental Backup|	only new/modified files / folders|	Fast	|Low|	Medium|

**Full backup**は、アプリケーションのすべてのファイルとフォルダ構造を取り、遅いと考えられています。Full backupは他の2種類のバックアップタイプと比較して、より多くのディスク容量を必要とします。ベストプラクティスとして、週に一度はアプリケーションの完全バックアップを取ることをお勧めします。

**Differential backup**は、最後の完全バックアップからの差分を取ります。Differential backupは迅速で、ストレージ容量も少なくて済むと考えられています。1日1回のDifferential backupを使用することをお勧めします。

**Incremental backup**は、最後のバックアップから変更されたファイルをバックアップします。これは、最もスペース効率の良いバックアップであり、迅速なバックアップタイプです。インクリメンタルバックアップは、サーバーのパフォーマンスに影響を与えることなく、1日に1回以上のバックアップを取ることができます。

他のタイプのバックアップには、Cold backup、Warm backup、Hot backupがあります。これらのタイプのバックアップは、主にアプリケーションよりもサーバーのために考えられています。

**Cold backup**はバックアップの一貫性を保証します。コールドバックアップの間、アプリケーションは使用されてはいけませんし、バックアップ期間中は読み書き操作は許可されていません。コールドバックアップの間、ほとんどの場合、サーバーはオフラインで、システム全体がバックアップされます。

**Warm backup**はサーバーがオンの時に適用することができますが、システムに変更を加えることはできません。

**Hot backups**はアプリケーションが使用中でも適用できますが、バックアッププロセス中にデータが変更された場合、データの整合性は保証されません。

上記の3つのタイプとは別に、バックアップは保存場所に基づいて分類することができます。バックアップがサーバーやシステムにローカルに保存されている場合はローカルバックアップ、リモートに保存されている場合はリモートバックアップと考えられます。災害復旧の観点からは、リモートバックアップを使用することをお勧めします。ローカルバックアップは、リモートバックアップと比較して、アプリケーションをより早く復旧させることができます。

#アプリケーションのバックアップにOSSを使用する
[オブジェクトストレージサービス（OSS）](https://www.alibabacloud.com/ja/product/oss)は、アリババクラウドが提供するセキュアなクラウドストレージサービスです。OSSを使用して、アプリケーションのバックアップを同じリージョンまたはリモートリージョンに安全に保存することができます。

ヒント:
- アプリケーションのバックアップサイズが合計で5GB未満の場合は、バックアップを保存するために無料のタイヤを利用することができます。
- データ転送料を節約するために内部IPアドレスを使用する
アリババクラウドOSSには、以下の3つのストレージクラスがあります。

1.  **Standard Storage:**Standard Storageは、データロックイン期間のないOSSに最適なオプションです。日々のアプリケーションのバックアップ - Incremental backupやDifferential backupは、Standard Storageクラスに保存することができます。

2.  **Infrequent Storage:**Infrequent Storageは、毎週のバックアップに使用することができます。このストレージクラスには、最低30日間のファイル保存が必要なロックイン期間があります。一度ファイルが保存されると、30日以内にファイルを変更するとペナルティが課せられ、ペナルティ料金が適用されることに注意してください。

ファイルが頻繁にアクセスを必要とする場合は、Standard Storageが最適です。

3. **Archive Storage:**その名前が意味するように、Archive Storageは、より長い期間のためのバックアップをアーカイブするために最適です。バックアップが60日以上保存する必要がある場合、これは最も安価なストレージの一つです。

以下の表は、バックアップタイプに基づいてストレージクラスを選択することができます。

|Backup Type	|Backup Class|	Suggested Frequency|
|:-----------|------------:|:------------:|
|Full Backup	|Infrequent / Archive|	Weekly|
|Differential Backup	|Standard	|Daily|
|Incremental Backup	|Standard	|Daily / Hourly|

#アプリケーションのバックアップを始める
上の2つのセクションでは、バックアップの種類とバックアップファイルを保存するストレージクラスについて説明しました。それでは、アプリケーションのバックアップを取り、適切なストレージクラスに保存してみましょう。

デモの目的では、Alibaba Cloud [Elastic Compute Service (ECS)](https://www.alibabacloud.com/ja/product/ecs)上でホストされているPHP - MySQLアプリケーションを使用しています。このセクションは3つのサブセクションに分かれています。

1、マニュアルアプリケーションのバックアップ
2、OSSの設定
3、アプリケーションの自動バックアップ

**1.  手動でアプリケーションをバックアップします。**

mysql データベースをバックアップするには、root ユーザーとして次のコマンドを実行することができます。

```
mysqldump <db_name> > backup_dbname.sql 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/3a3bc2d8-b2a7-d858-99a9-84c704a690dd.png)



root アクセスができない場合は、ユーザ名とパスワードを指定して以下のコマンドを実行します。

```
mysqldump -u <username> -p <dbname> > backup_dbname.sql 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/ddc0258a-8747-e439-4fff-c877b7bb1968.png)


tar コマンドを使って圧縮されたアプリケーションのバックアップを取ります。

```
tar -czf <archive_name> -C <path_to_remove> . 
```


上記のコマンドは、ウェブサイトのコードのtar圧縮アーカイブを作成します。Cパラメータは、圧縮されたフォルダから絶対パスを削除し、絶対パスを更新するのに役立ちます(root)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/9763b2d1-4ae4-ad9d-cc29-da2869a7e820.png)

上記のシナリオは、アプリケーションとデータベースのフルバックアップを取っています。MySQLデータベースのIncremental backupまたはDifferential backupを取るために、バイナリ方式を使用することができます。大きなデータベースの場合は、Incremental backupを使用することをお勧めします。

ファイルバックアップのために、次の設定でrsyncを実行します。

**1.  Daily Backup:**

```
rsync -av --delete <source_path> <daily_backup_destination_path> 
tar -cvjf daily_$(date +%Y%m%d).tar.bz2 <daily_backup_destination_path> 
```

**2.  Weekly Backup:**

```
  rsync -av --delete <daily_backup_destination_path>    <weekly_backup_destination_path>
 tar -cvjf weekly_$(date +%Y%m%d).tar.bz2 <weekly_backup_destination_path> 
```

**3.  Monthly Backup:**

```
tar -cvjf monthly_$(date +%Y%m%d).tar.bz2 <daily_backup_destination_path> 
```


#OSSの設定
バックアップの準備が整うと、それは安全なストレージのためにOSSに移動することができます。以下の手順は、ECS上でOSSを構成するのに役立ちます。

1、OS アーキテクチャに応じた [OSSutil ](https://www.alibabacloud.com/help/ja/doc-detail/50452.htm)の最新版を入手します。

2、 OSSUtil に実行可能な権限を与えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/6a51ccb5-5790-bd79-19e6-d06054e438aa.png)

3、Alibaba CloudコンソールのOSSセクションに移動して、Standardバケットを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/76175adb-4af6-16cb-4e9b-a56a730559ef.png)

4、 Alibaba Cloud ConsoleのResource Access ManagerセクションでProgrammatic Accessを持つユーザーを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/f75bfa9b-9bde-f90f-bbe1-4ea3318d0db8.png)


5、 ユーザーのAccessKeyとAccessSecretをダウンロードします。

6、 ユーザーに[AliyunOSSFullAccess](https://www.alibabacloud.com/help/ja/doc-detail/28652.htm)権限を与えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/4aaa1f06-0dbd-431f-11b6-9eda4781e52e.png)


7、 OSSUtil を /usr/sbin にコピーし、実行可能な権限を与えます。これにより、システム上のどこからでも OSSUtil コマンドを実行できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/7db9a7e5-76a9-1b85-c836-41f5f56ccb3b.png)


8、 OSSUtil を構成します。OSSUtil の設定には以下の情報が必要です。

```
<blockquote>a. Bucket URL:</blockquote>
<blockquote>b. Access Key:</blockquote>
<blockquote>c. Access Key Secret:</blockquote>
```

OSSUtil config コマンドは、ユーザーのルートパス上に .osutilconfig ファイルを生成し、必要に応じて簡単に再設定することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/661d077a-77ca-8943-df6e-76f351f75d1e.png)

9、 以下のコマンドで設定が正常に動作することを確認します。

```
ossutil64 ls oss://<bucket-name> 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/3142c60a-0cc0-a019-0f17-a129a54cb28f.png)

#OSSへのバックアップとファイル送信の設定
サーバーがOSSバケットにファイルを送信するように設定されているので、最後のステップとして、ファイルをサーバーに送信するスクリプトと自動ジョブ（cronジョブ）を設定します。

1、構造の準備：最終的な構成は以下の通りで、「Compressed」という名前のフォルダで日次、週次、月次のフォルダ構造を準備します。Compressed フォルダには、OSS バケットと同期するファイルが格納されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/67a8c5c3-9601-9f1a-b7b8-9ebbaf8dd531.png)


バケットレベルでの設定は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/3b55c5aa-0fd0-1e9d-6665-3dd68c0ea250.png)

2、ライフサイクル設定 : 要件通りにデータを保持するためには、バケットにライフサイクル管理を適用する必要があります。ライフサイクル管理はバケットの基本設定からアクセスできます。以下のライフサイクル管理ルールがバケットに適用されます。

|Backup Type|	Backup Class	|Prefix|	Auto Deletion|
|:-----------|------|------|-----------:|
|Daily|	Standard|	Daily-	|30 Days|
|Weekly	|IA|	Weekly-	|60 Days|
|Monthly|	Archive|	Monthly-	|180 Days|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/e3cee286-09fe-6709-bf27-7b48c444c6de.png)


3、 スクリプトの準備 以下は、ウェブサイトのコードをクローンしてサーバーに送信するスクリプトです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/c5e80e51-112e-7af1-db04-f5f11b3085f2.png)

コードへのリンク：[https://gist.github.com/ankyit/0fda7907e3f884c4552762151914de33#file-aliyun-daily-file-backup-sh](https://gist.github.com/ankyit/0fda7907e3f884c4552762151914de33?spm=a2c65.11461447.0.0.53b6347bAu36cp#file-aliyun-daily-file-backup-sh)

このコードは、Webサイトのディレクトリからbackup/daily/codeフォルダにソースコードをクローンし、圧縮してOSSバケットに送ります。ファイルを送信すると同時に、--metaキーでストレージクラスをStandardに設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/86b36d61-1679-2374-64f7-06093b863473.png)



以下は、データベースのバックアップを取り、OSSに保存するためのスクリプトです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/55592e86-41f0-975e-a11f-db2b72e19e30.png)


スクリプトへのリンク : [https://gist.github.com/ankyit/0fda7907e3f884c4552762151914de33#file-aliyun-daily-db-backup-sh](https://gist.github.com/ankyit/0fda7907e3f884c4552762151914de33?spm=a2c65.11461447.0.0.53b6347bAu36cp#file-aliyun-daily-db-backup-sh)

同じように毎週および毎月のスクリプトを準備することができ、それに応じて oss-Storage-Class を設定することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/e776e405-1f08-61a5-5d60-6408bfa2467f.png)


Weekly backupスクリプトはここにあります: [https://gist.github.com/ankyit/0fda7907e3f884c4552762151914de33#file-aliyun-weekly-file-backup-sh](https://gist.github.com/ankyit/0fda7907e3f884c4552762151914de33?spm=a2c65.11461447.0.0.53b6347bAu36cp#file-aliyun-weekly-file-backup-sh)

Monthly backupスクリプトはここにあります: [https://gist.github.com/ankyit/0fda7907e3f884c4552762151914de33#file-aliyun-monthly-file-backup-sh](https://gist.github.com/ankyit/0fda7907e3f884c4552762151914de33?spm=a2c65.11461447.0.0.53b6347bAu36cp#file-aliyun-monthly-file-backup-sh)

4、 バックアップの自動化 :cronjobを設定することができます。ベストプラクティスとして、バックアップにはピーク時以外の時間帯を使用することをお勧めします。以下にサンプルスクリプトを示します。

daily backup場合:

```
0 0 * * * * /usr/bin/sh <daily-backup-script-path>.sh 
```

weekly backup:

```
0 0 0 * * 7 /usr/bin/sh <weekly-backup-script-path>.sh 
```

monthly backup:

```
0 0 1 * * /usr/bin/sh <monthly-backup-script-path>.sh 
```

このチュートリアルは、アプリケーションのリモートバックアップを設定するのに役立つと思います。ソリューションを実装している間に何か問題に遭遇した場合は、遠慮なく質問してください。

#著者について
[Ankit Mehta](https://mvp.alibabacloud.com/mvp/detail/155?spm=a2c65.11461447.0.0.53b6347bAu36cp)は、アリババクラウドMVPであり、アプリケーション開発からデプロイ、管理まで14年以上のIT経験を持つITプロフェッショナルです。現在は、アウェア株式会社でテクニカルスペシャリストとWordPressアプリケーション開発チームのリーダーとして働いています。Ankitは "Sharing is caring "を強く信じており、ミートアップをアレンジしたり、様々なブログプラットフォームで知識を共有したりすることで、オープンソースコミュニティを支援しています。

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*