リージョンをまたいでトラフィックのフェイルオーバーを試してみた


# はじめに - DNS トラフィック管理

Oracle Cloud (OCI) のDNSに付随する機能に、トラフィック管理機能があります。トラフィック管理機能にはいくつかのステアリングポリシーの種類があり、様々なシーンで利用できそうです。

ステアリングポリシーの種類
![image-20201111112544622.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/fa38bef7-21a7-e780-054a-a47dd8a6e48a.png)
今回はステアリングポリシーの１つ、フェイルオーバーを試してみます。
# フェイルオーバー

フェイルオーバー・ポリシーでは、プライマリおよびセカンダリの順序優先(回答)を定義でき、OCIのヘルスチェックが、ポリシーのヘルス状態をチェックします。プライマリの回答が異常であると判断されると、トラフィックは自動的にセカンダリに渡されます。

通常(大阪のサーバーがヘルスチェックで正常時)はトラフィックは大阪のプライマリサーバーに送信されますが、ヘルスチェックによりプライマリサーバーが異常と判断された場合は、セカンダリのロンドンサーバーにトラッフィックが転送されるといったケースが想定されます。(下図)

![image-20201111114334765.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/8ee8b075-8de3-fdeb-68dc-678592a1233b.png)
# フェイルオーバーの検証

それでは上図のケースを例にして、フェイルオーバーの検証をしていきます。
## 準備

異なるリージョン（大阪リージョン、ロンドンリージョン）にそれぞれコンピュートインスタンスを立てて、Webアプリを稼働させます。
- osaka01 - 大阪リージョンのインスタンス
- london01 - ロンドンリージョンのインスタンス

![image-20201111121550077.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/0cb26ecf-a7e8-e5fe-bd35-4a4f30a6b746.png)

Webアプリはリクエストがあると、インスタンス名をブラウザに表示します。これにより、プライマリ／セカンダリのどちらにトラフィックが送信されたかを確認できます。

## 検証シナリオ

シンプルに次の２つの検証をおこないます。

1. ##### プライマリ（osaka01サーバー）がヘルスチェックで異常と判断された時に、トラフィックはセカンダリ（london01サーバー）にフェイルオーバーされるか？

2. ##### プライマリ（osaka01サーバー）が正常に復帰した時に、どのような動作になるか？



# フェイル―オーバー設定

左上のナビゲーションメニューから[ネットワーキング]-[トラフィック管理ステアリング・ポリシー]を選択し、[トラフィック管理ステアリング・ポリシーの作成]をクリックします。

![image-20201112100847380.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/5ef28bdb-8a2a-db21-c894-436ef57426fb.png)

## ポリシータイプ

トラフィック管理ステアリング・ポリシーの設定画面が表示されます。ポリシータイプから選択していきます。

![image-20201112102246278.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/14a1ff9c-7e5b-2531-caa0-d3e3472edd3e.png)

**[ポリシータイプ]**  **フェイルオーバー**を選択します。
**[ポリシー名]** 任意のポリシー名を入力します。
**[ポリシーTTL]** ステアリング・ポリシーからのレスポンスの存続時間。ここではデフォルトの60秒としてます。

## 回答プール
続いて、回答プールを設定します。

![image-20201112104226776.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/664eb16c-18ef-148f-afc6-8a2543118ea4.png)

回答プール１：
**[回答プール名]**  **osaka** とします。
回答：
**[名前]** **osaka-web** とします。
**[タイプ]**  DNSレコードタイプを選択。ここでは**Aレコード**としてます。
**[RDATA]**  レコードタイプに応じたデータを入力。**osaka01インスタンスのIPアドレス**を入力します。

同様に、
回答プール２：
**[回答プール名]**  **london** とします。
回答：
**[名前]** **london-web** とします。
**[タイプ]**  DNSレコードタイプを選択。ここでは**Aレコード**としてます。
**[RDATA]**  レコードタイプに応じたデータを入力。**london01インスタンスのIPアドレス**を入力します。

## プール優先度
先に定義したプールに対して、プール優先度でプライマリ、セカンダリを決めていきます。

![image-20201112105928170.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/7f35b8c7-0c75-63df-a9d7-a1592724efed.png)

osaka プールを優先度１（プライマリ）、london プールを優先度2（セカンダリ） で設定しました。

## ヘルスチェック
ヘルスチェックを設定します。
![image-20201112110845016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/6e702918-0d54-cd28-56e1-a61b568047fe.png)

**新規追加** を選択し、
**[ヘルスチェック名]** **DemoHealthCheck** とします。
**[間隔]**  デフォルトの**30秒**のまま。
**[プロトコル]**  デフォルトの**HTTP**のまま。  

## アタッチ済みドメイン

![image-20201112111356109.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/8289c6c3-61c4-4cb3-1938-d4e7509de8d6.png)

**[サブドメイン]** **app** とします。
**[コンパートメント]**  ご自身のコンパートメントを入力します。
**[ゾーン]**  DNSゾーンを選択します。ゾーンはあらかじめ登録しておく必要があります。
**この設定により、app.cocotaro.com へのリクエストは、プール優先度に応じて処理されます。**

最後に、**ポリシーの作成** をクリックします。
![image-20201112112900195.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/853b78f4-d97a-be34-50ac-8c5a9d8f8ea0.png)

ポリシーが作成されると、
**回答プールの優先度、各サーバーのヘルス・ステータスなどが表示されます。osaka, london サーバーは共に正常動作しています。**

# 動作確認
## 1. osakaのサーバーが異常時に、トラフィックはlondonのサーバーへフェイルオーバーされるか？
### 1) 初期状態
ポリシー作成の直後は、osaka, london サーバー共に正常動作でした。
アタッチ済みドメインで定義した app.cocotaro.com でリクエストしてみます。プライマリのosaka サーバーで処理されてます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/76ecf5f1-42ed-f70f-8d43-27c6543725a0.png" width=60%>

### 2) osakaサーバーのWebアプリを停止
osaka サーバーのWebアプリを停止します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/13b0aa19-0a32-87f4-09fe-6198ded40689.png" width=70%>

しばらくしてヘルス・ステータスを確認します。osaka サーバーのヘルス・ステータスが**異常**に更新されています。
![image-20201112133531226.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/5a4ce2c3-8cd6-c2e6-aa79-3e12dd7e2fdc.png)

### 3) londonサーバーへのフェイルオーバ確認
 app.cocotato.com でリクエストしてみます。london サーバーへフェイルオーバーされることが確認できました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/514ff231-3053-4d58-c931-4038b8e93b0a.png" width=60%>

## 2. osakaのサーバーが正常に戻った時、トラフィックはosakaのサーバーへ戻るか？

### 1) osakaサーバーのWebアプリを再起動
osaka サーバーのWebアプリを再起動します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/f0d53e3c-37a5-97ae-298b-062fa57764e4.png" width=70%>

### 2) ヘルス・ステータス
しばらくしてヘルス・ステータスを確認します。osaka サーバーのヘルス・ステータスが**正常**に戻りました。

![image-20201112134432098.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/7e5066ca-3630-8b0e-a717-7dc3ef11e656.png)

### 3) osakaサーバーへのフェイルオーバー確認
osaka サーバーが復活して、通常の優先度の処理に戻りました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/873925cd-1d80-bf29-b1f8-bb923013f081.png" width=50%>

## まとめ

今回は、OCIの大阪リージョンとロンドンリージョン間でのフェイルオーバーを試してみました。国内の場合だと、東京リージョンと大阪リージョン間でもフェイルオーバーできるので、通常利用システム異常時のスタンバイ対策や、システムのサービスレベルの向上に役立てることが期待できそうです。



# 参考URL

[Getting Started with Traffic Management](https://blogs.oracle.com/cloud-infrastructure/getting-started-with-traffic-management)

[[Oracle Cloud] Traffic Management Steering Policies を使って、地球規模のフェールオーバーをやってみた](https://qiita.com/sugimount/items/88297113a7f3be5d5269)

[Traffic Management Steering Policiesサービスの概要](https://docs.oracle.com/cd/E97706_01/Content/TrafficManagement/Concepts/overview.htm)