Amazon RDS for Db2: マルチAZによる高可用性(HA)構成の手動フェイルオーバー

Amazon RDS for Db2ではMulti-AZによる高可用性(HA)構成が可能です。
当記事ではMulti-AZによる高可用性(HA)構成のAmazon RDS for Db2を手動でフェイルオーバーする方法について説明します。
尚、Db2だからといって特別なことはなく、他のRDSと方法は同じです。


参考: Amazon Relational Database Service ユーザーガイド
- [DB インスタンスの再起動](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_RebootInstance.html)
- [Amazon RDS のフェイルオーバープロセス](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Concepts.MultiAZSingleStandby.html#Concepts.MultiAZ.Failover)



# 1. 前提
当然ながらマルチAZによる高可用性(HA)構成のAmazon RDS for Db2に対して実施します。

GUIで作成する場合は、作成時に
`可用性と耐久性` というセクションで
`スタンバイインスタンスを作成する (本稼働環境向けに推奨)`
というオプションを選択して作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/6884e1c8-2833-4843-1894-326d9dae2256.png)


一旦`スタンバイインスタンスを作成しないでください`で作成してしまっても、`マルチAZ配置への変換`が可能です。ただし、「DB インスタンスは、マルチ AZ DB インスタンスデプロイへの変換中および変換後に、パフォーマンスに大きな影響を受ける可能性があります。本稼働DBインスタンスではこの変換はお勧めしません。」との警告が出てきますので、本稼働DBインスタンスでは本当に問題ないか確認するようにしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/151a47eb-6894-d9c6-970a-fd335b091e8d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/29edefa1-ccf8-6ec8-a5e4-2c4df07f59b1.png)

### 補足: シングル構成に戻すこと可能
尚、「DB インスタンスを変更」でシングルに戻すことも可能でした。データベースの概要画面あるいは一覧画面でDBを選択し「変更」をクリックすると、作成時と同じUIが出てきます。新規作成時と同じく`可用性と耐久性` というセクションで、`スタンバイインスタンスを作成しないでください`というオプションに選択を変更すればよいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/a5e7d202-f17a-5fc8-de1a-9eb929019810.png)
（中略）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/fb28823b-0527-dce4-84b7-57ba82b2c3b6.png)


# 2. 前提の確認: マルチAZによる高可用性(HA)構成
まずはプライマリーインスタンスのAZを確認:
「RDS > データベース　」で表示されるデータベース一覧の「リージョーンとAZ」列がプライマリーインスタンスのAZです。
下の`ha-db-01`の場合は細かく言うとリージョンが`ap-northeast-1`でAZが`c`となりますが、通常は`ap-northeast-1c`がAZ名として使われています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/a14e2471-f850-b367-817b-31f31de84350.png)

DB識別子をクリックしてスタンバイ・インスタンスを確認します。
DB識別子をクリックし概要を表示後、「設定」タブをクリックして設定を表示します。
`マルチAZ`が`あり`になっていればマルチAZによる高可用性(HA)構成になっています。
`セカンダリゾーン`のAZ名がスタンバイ・インスタンスのAZ名です。
この場合は`ap-northeast-1d`となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/ba8fd333-fc28-27af-fd28-b5b5e9161590.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/76a9aea6-d990-c770-e017-807728509ef2.png)


# 3. 手動フェイルオーバー手順
では上記で確認した`ha-db-01`を手動で　フェイルオーバーしてみます。

フェイルオーバー前にプライマリーインスタンスのIPアドレスを確認してみます。
インスタンスのホスト名(=エンドポイントのホスト名)は概要画面の「接続とセキュリティ」タブの`エンドポイント`です。
（下記はhostコマンドをMacから実行しています)
```shell
~:$ host ha-db-01.xxxxxxxx.ap-northeast-1.rds.amazonaws.com
```
実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/d0ffd336-83cf-368b-64a2-736463d2596c.png)

IPは`**.**.**.122`であることがわかります(最後以外は**に変更　）

<br>

また[AWS CLI](https://docs.aws.amazon.com/ja_jp/cli/)でAvailabilityZone, MultiAZ, SecondaryAvailabilityZoneの情報を取得してみます：\<DB識別子\>には自分のDB識別子をセットしてください。

```shell
aws rds describe-db-instances --db-instance-identifier <DB識別子> --query 'DBInstances[].{AvailabilityZone:AvailabilityZone, MultiAZ:MultiAZ, SecondaryAvailabilityZone:SecondaryAvailabilityZone}' --output table
```
実行例：\<DB識別子\>は`ha-db-01`

```
~:$ aws rds describe-db-instances --db-instance-identifier ha-db-01 --query 'DBInstances[].{AvailabilityZone:AvailabilityZone, MultiAZ:MultiAZ, SecondaryAvailabilityZone:SecondaryAvailabilityZone}' --output table
--------------------------------------------------------------
|                     DescribeDBInstances                    |
+-------------------+----------+-----------------------------+
| AvailabilityZone  | MultiAZ  |  SecondaryAvailabilityZone  |
+-------------------+----------+-----------------------------+
|  ap-northeast-1c  |  True    |  ap-northeast-1d            |
+-------------------+----------+-----------------------------+
~:$
```
AvailabilityZoneは` ap-northeast-1c `, MultiAZは`True`, SecondaryAvailabilityZoneは`ap-northeast-1d` となっています。

### 3-1. 「アクション」メニューから「再起動」をクリック
概要画面または「RDS > データベース　」で表示されるデータベース一覧からフェイルオーバーしたいDBを選択して、 「アクション」メニューから「再起動」をクリックします
概要画面から:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/2868dd57-17de-e380-4f2a-9fbd2b7bfe8a.png)

「RDS > データベース　」から:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/8b4c4323-e87f-516b-02d3-37b4ecfc4e5a.png)

### 3-2. 「DB インスタンスを再起動」画面で「フェイルオーバーで再起動しますか?」にチェックを入れ、「確認」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/56be6466-6f0e-b170-6c06-b112f948b101.png)

DB一覧の画面に戻り、ステータスが「再起動中」になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/4f24054c-8c21-f74f-a411-0cd556b6efa6.png)

ステータスが「利用可能」になるまで待ちます。この時は1〜2分で利用可能になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/d1546adc-502c-bee9-3e13-d19481f4a93a.png)
ただ「リージョーンとAZ」列が反映されるのはもう少し時間がかかるようで、直後は`ap-northeast-1c`のままでした。

本当に変更されたか、確認してみましょう。

# 4. 確認
### 4-1.　ログで確認
DB一覧の画面でDB識別子をクリックして概要を表示します。
「ログとイベント」タブをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/c8bbe5db-64fb-8a6f-fb55-ad5f8d8616f7.png)

「最近のイベント」セクションでフェイルオーバー系のイベントが確認できます。
`Multi-AZ instance failover completed` と表示されており、フェイルオーバーが完了したことが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/1cf6c0f8-fc48-88ad-968a-94017e8133a5.png)

### 4-2.　「設定」で確認
**しばらくすると**DB一覧画面や概要・設定画面に反映されてきます。(直後は更新されていません。少々時間がかかります)
「設定」タブをクリックします。
概要の`「リージョーンとAZ`と「設定」の`セカンダリゾーン`が最初と入れ替わっているのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/e3832ef1-3afc-3c52-b4b1-a397251f52c7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/89bde0e8-d58e-0a7d-a213-b7ddd41dc27f.png)

### 4-3.　IPで確認
IPアドレスも確認してみます。フェイルオーバー前に確認した時と同じコマンドを実行します。
インスタンスのホスト名(=エンドポイントのホスト名)は概要画面の「接続とセキュリティ」タブの`エンドポイント`です。フェイルオーバーしてもエンドポイントのホスト名は変更されません。
（下記はhostコマンドをMacから実行しています)
```shell
~:$ host ha-db-01.xxxxxxxx.ap-northeast-1.rds.amazonaws.com
```
実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/22cc03be-f0ac-0735-5460-c0a4f89c19c2.png)




IPは`**.**.**.71`であることがわかります(最後以外は**に変更）
フェイルオーバー前の`**.**.**.122`から同じエンドポイントでも変更になっていることがわかります。

フェイルオーバーしてもエンドポイントのホスト名は変更されないのも確認できました。フェイルオーバー後もエンドポイントのホスト名を使用しての接続であれば、変更なしで使えます。



### 4-4.　AWS CLIで確認
AWS CLIでも確認してみます：\<DB識別子\>には自分のDB識別子をセットしてください。

```shell
aws rds describe-db-instances --db-instance-identifier <DB識別子> --query 'DBInstances[].{AvailabilityZone:AvailabilityZone, MultiAZ:MultiAZ, SecondaryAvailabilityZone:SecondaryAvailabilityZone}' --output table
```
実行例：\<DB識別子\>は`ha-db-01`

```
~:$ aws rds describe-db-instances --db-instance-identifier ha-db-01 --query 'DBInstances[].{AvailabilityZone:AvailabilityZone, MultiAZ:MultiAZ, SecondaryAvailabilityZone:SecondaryAvailabilityZone}' --output table
--------------------------------------------------------------
|                     DescribeDBInstances                    |
+-------------------+----------+-----------------------------+
| AvailabilityZone  | MultiAZ  |  SecondaryAvailabilityZone  |
+-------------------+----------+-----------------------------+
|  ap-northeast-1d  |  True    |  ap-northeast-1c            |
+-------------------+----------+-----------------------------+
~:$
```
AvailabilityZoneは` ap-northeast-1d `, MultiAZは`True`, SecondaryAvailabilityZoneは`ap-northeast-1c` となっています。
(注意：　GUIへの反映と反映タイミングは同じようです)


無事フェイルオーバーされたようです！


以上です。