こんにちは、S.yokoyamaです。
本記事は期間は過ぎてしまいましたが、Oracle Cloud Infrastructure Advent Calendar 2023 カレンダー3の Day25の記事として書いています。
近年、ビジネス継続性の確保がますます重要となっており、自然災害やサイバーセキュリティの脅威に対する準備が求められています。ディザスタリカバリ(DR)対策は、災害発生時にビジネスの継続性を確保するための重要な手法です。
この記事では、DR対策として東京リージョンで取得したダンプファイルを大阪リージョンのオブジェクトストレージへ保存する方法について紹介します。
オブジェクトストレージバケットの作成
ダンプファイルを保存するバケットの作成をします。
今回は、東京リージョンで作ったMDSのダンプファイルを大阪リージョンのオブジェクトストレージに保存するので、大阪リージョンにバックアップ用のバケットを作成します。
コンソールメニューから「ストレージ」→「バケット」を選択、「バケットの作成」から作成します。
MySQLクライアントのインストールと設定
以下のコマンドを実行しMySQLクライアントリポジトリを取得しインストールします。
今回は、OracleLinux8を使用しているのでOracleLinux8用のリポジトリをダウンロードしています。また、リポジトリのダウンロードは、MySQLの公式サイトからダウンロード出来ます。
sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el8-3.noarch.rpm
リポジトリのダウンロード完了後、以下のコマンドを実行してmysql-community-clientをインストールします。
dnf install --enablerepo=mysql80-community --disablerepo=ol8_appstream mysql-community-client
⚠Oracle Linux8 で使用されるデフォルトのリポジトリがAppStreamなので、mysql80-communityをインストールの際は一時的に無効にしてインストールを実施しています。
MySQLクライアントのインストールが完了したら、以下のコマンドでインストールが出来ているか確認します。
mysql --version
MySQLクライアントのインストールが完了したら、DBの接続情報の設定ファイルを作成します。
以下のコマンドで、後述するスクリプトで使用するDBの接続情報の設定ファイルを/home/opcに作成します。
vi .my.cnf
以下がフォーマットになっています、.my.cnfに入力し保存します。
[client]
user=XXXX
password="XXXX"
host="X.X.X.X"
MySQLクライアントの設定は以上です。
OCI CLI インストールと設定
以下のコマンドを実行してOCI CLI をインストールします。
sudo dnf install python36-oci-cli
こちらもインストールが完了したら確認の為以下のコマンドを実行します。
oci -v
OCI CLI の設定
以下のコマンドを実行してOCI CLIの初期設定を行います。事前準備として初期設定の際にテナンシのOCID、ユーザのOCIDが必要になりますので事前に準備して下さい。
oci setup config
ユーザのOCIDとテナンシのOCIDの記載場所について
ユーザのOCIDは、コンソール画面右上の「人のアイコン」→「ユーザ設定」をクリックします。
テナンシのOCIDはコンソール画面右上の「人のアイコン」→「テナンシ」をクリックします。
コマンドを実行すると対話形式で設定が始まりますので、必要に応じて設定をして下さい。
Enter a location for your config [/root/.oci/config]:
→設定ファイルの配置場所を入力デフォルト(/root/.oci/config)で問題なければ何も入力せずにEnter
Enter a user OCID:
→ユーザのOCIDを入力(ユーザのOCIDは「ユーザのOCIDとテナンシのOCIDの記載場所について」を参照)
Enter a tenancy OCID:
→テナンシのOCIDを入力(テナンシのOCIDは「ユーザのOCIDとテナンシのOCIDの記載場所について」を参照)
Enter a region by index or name
→使用するリージョンの番号か名前を入力
Do you want to generate a new API Signing RSA key pair? (If you decline you will be asked to supply the path to an existing key.) [Y/n]:
→新しいAPI署名RSAキーペアを生成するか(新しいAPI署名RSAキーペアを生成する場合はYを押してEnter、既存のキーを使用する場合はn)
Enter a directory for your keys to be created [/root/.oci]:
→認証用APIキーの生成先ディレクトリを入力。デフォルト(/root/.oci)で問題なければEnter
Enter a name for your key [oci_api_key]:
→認証用APIキーのファイル名を入力。デフォルト(oci_api_key)で問題なければEnter
Public key written to: /root/.oci/oci_api_key_public.pem
Enter a passphrase for your private key (empty for no passphrase):
→認証用APIキーの秘密鍵に設定するパスワードを入力(パスワードを設定しない場合はEnter)
APIキーの登録
/root/.ociに作成した[oci_api_key_public.pem]の中身をcatコマンドで確認し、OCIコンソール画面のAPIキーに追加します。
既存のキーを使用する場合は、登録した公開鍵とペアになる秘密鍵の配置先を指定します。
コピーしたAPIキーをOCIコンソール画面の「ユーザ設定」→左下にある「リソースの項目」→「APIキー」をクリックし「APIキーの追加」からAPIキーを追加します。
設定が完了すると、OCI CLI コマンドが使用可能となります。以下のコマンドから自分の使用しているオブジェクトストレージのネーム・スペース名が取得出来ます。
oci os ns get
設定は以上となります。
ダンプファイルを取得するスクリプト作成とcronの設定
以下のスクリプトは、MySQLのダンプファイルを取得しオブジェクトストレージにアップロードするスクリプトです。
今回は、以下のスクリプトをdump.shとして保存し設定をしていきます。
echoコマンドで記載しているものは、ログ出力をした時動作を確認する為に記載しています。
#!/bin/bash
echo "START:"$(date)
# 現在の日付を取得(例:20230810)
DATE=$(date '+%Y%m%d')
# MySQLデータベースのダンプファイルを取得してディレクトリに保存
DUMP_FILE="/home/opc/dump/dump_$DATE.sql"
mysqldump --defaults-extra-file=/home/opc/.my.cnf --set-gtid-purged=OFF test > "$DUMP_FILE"
# 直前に実行したコマンドの終了ステータスを取得
dump_status=$?
# ダンプファイルの取得が成功したかを判定
if [ $dump_status -eq 0 ]; then
echo "MDSのダンプファイルを取得してディレクトリに保存しました"
# OCI オブジェクトストレージにダンプファイルをアップロード
oci os object put -ns (実際に使用しているネームスペース名) -bn (ダンプファイルを保存したいバケット名) --file "$DUMP_FILE" --name "dump_$DATE.sql" --no-multipart
# 直前に実行したコマンドの終了ステータスを取得
upload_status=$?
# アップロードが成功したかを判定
if [ $upload_status -eq 0 ]; then
echo "ディレクトリに保存したダンプファイルをOCIオブジェクトストレージに保存しました"
# ファイルの削除
rm "$DUMP_FILE"
echo "ディレクトリ内のダンプファイルを削除しました"
else
echo "ダンプファイルのオブジェクトストレージへの保存に失敗しました。エラーコード:$upload_status"
fi
else
echo "ダンプファイルの取得に失敗しました。エラーコード:$dump_status"
fi
echo "END:"$(date)
作成したスクリプトを定期的に実行させる為、cronの設定をします。
以下のコマンドでcronを設定します。今回は、Logの確認をする為、毎日23時にスクリプトを実行し/tmp/daily_dump.logに実行結果を出力しています。
crontab -e
0 23 * * * /bin/bash /home/opc/dump.sh >> /tmp/daily_dump.log 2>&1
以上が、MySQLのダンプファイルを取得からオブジェクトストレージにアップロードする設定になります。
最後に、作成したスクリプトが動いているかログの確認の為、/tmp/daily_dump.logを確認します。オブジェクトストレージにもダンプファイルがアップロード出来ているかの確認もします。
まとめ
いかがでしたでしょうか。
今回は、ディザスタリカバリ(DR)対策として、別リージョンのオブジェクトストレージにダンプファイルを保存し、大規模な災害が発生した際でも別リージョンのオブジェクトストレージに定期的に保存してあるダンプファイルからシステムを復元出来るよう対策しました。
私が真っ先に転けてしまった点は、MySQLクライアントのソフトウェアのインストールに使うはずのリポジトリが適応されないでインストール出来なかったり、OCI CLIの初期設定時に入力ミスがありOCI CLIのコマンドを打っても「Error」しかレスポンスが来ないという点でした。
ディザスタリカバリ(DR)対策は、ビジネスの継続性を確保するために欠かせない要素です。適切な計画と実施を行い、災害時にもビジネスを安全に維持するための準備に備えることを推奨致します。
ここまで読んでいただきありがとうございました。