OCI Database with PostgreSQLのフェイルオーバ時の挙動確認

この記事は OCIjp Advent Calendar 2024の 4日目の記事です。

# はじめに

OCIで昨年リリースされた OCI Database with PostgreSQL はPostgreSQL互換の DBaaS となります。
代表的な特徴としては、フルマネージドであることや OCIデータベース最適化ストレージ を持つことで性能や拡張性・運用性に優れた DBaaS となっています。

特徴など細かい点は次の資料を参照下さい。
- [OCI Database with PostgreSQL 概要](https://speakerdeck.com/oracle4engineer/oci-db-with-postgresql-overview)
- [PostgreSQLを使用したOCIデータベースの概要](https://docs.oracle.com/ja-jp/iaas/Content/postgresql/overview.htm)
- [第一原則: クラウド向けに PostgreSQL を最適化](https://blogs.oracle.com/oracle4engineer/post/postgresql-first-principle)

# OCI Database with PostgreSQLの高可用性

OCI Database with PostgreSQLでは Database Optimized Storage(以下、DbOS) という OCI の Regional Block Storage 上で動作するストレージを基盤として動作します。DbOS 自体は全ての AD[^1]/FD[^2] にレプリケートされるため、すべてのコンピュートは同じデータを参照することが可能となり、コンピュートもしくは AD/FD 単位での障害が発生しても別のレプリカが昇格することで迅速にサービス回復を行うことが可能です。

[^1]: Availability Domain: OCIのデータセンター単位の区切り、AWS における AZ
[^2]: Fault Domain: OCIのデータセンター内における 電源などが別になっている区切り、VMを別の FD に配置することで電源障害などで同時に影響を受けることを防ぐ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/d1f31f96-f937-9aa2-ba03-0e7c9a9fab09.png)
（出典：[Database Optimized StorageによるOCI独自の分離ストレージ・アーキテクチャ](https://www.oracle.com/jp/cloud/postgresql/)）

# フェイルオーバ時の挙動確認

マルチノード(プライマリ＋リードレプリカ)の PostgreSQL をデプロイし、クライアントからプライマリノードに対してSQLを実行し、プライマリノードを再起動[^3]させることでリードレプリカをプライマリに昇格させます。
その際にクライアントからのSQL実行がどのようになるか、確認してみます。

[^3]: コンソールからの手動フェイルオーバは実施ができないが、OCICLIからフェイルオーバを実施することは可能(出典：[Runs a failover operation](https://docs.oracle.com/en-us/iaas/tools/oci-cli/3.50.2/oci_cli_docs/cmdref/psql/db-system/failover.html))。

#### ① OCI Database with PostgreSQLのデプロイ

OCIコンソール上でPostgreSQLを作成します。流れは次のような形です。
- OCIコンソール→ データベース → PostgreSQL

詳細な手順は次のblogなどを参照ください。
- [【OCI】OCIが提供しているManagedのPostgreSQLを使ってみる](https://qiita.com/atwits/items/ed1419936f900b0a3cfd)

ノード数は 「**２**」以上で設定してください(後で追加も可能です)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/0cc80f23-6d73-7f92-0802-a34ae13dafef.png)

2ノードのデータベースをデプロイすると次のようにタイプが「プライマリ」と「レプリカ」の2つのノードが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/793acb9c-fcbd-f391-8ff1-ae3cfca88e9e.png)



#### ② プライマリへSQL実行

デプロイしたデータベースのプライマリエンドポイント（10.0.2.6）に対して、1秒毎にデータインサートを行います。毎秒 id がインクリメントされ、current_datetime が dt 列に挿入します。

```SQL:データインサート
                version                 |   pg_postmaster_start_time
----------------------------------------+-------------------------------
 PostgreSQL 14.11 OCI Optimized, 64-bit | 2024-11-23 02:32:18.484738+00
(1 row)

 id |             dt
----+----------------------------
  2 | 2024-11-23 02:34:31.209775
(1 row)

Sat Nov 23 02:34:31 GMT 2024
                version                 |   pg_postmaster_start_time
----------------------------------------+-------------------------------
 PostgreSQL 14.11 OCI Optimized, 64-bit | 2024-11-23 02:32:18.484738+00
(1 row)

 id |             dt
----+----------------------------
  3 | 2024-11-23 02:34:32.243124
(1 row)

Sat Nov 23 02:34:32 GMT 2024
                version                 |   pg_postmaster_start_time
----------------------------------------+-------------------------------
 PostgreSQL 14.11 OCI Optimized, 64-bit | 2024-11-23 02:32:18.484738+00
(1 row)

 id |             dt
----+----------------------------
  4 | 2024-11-23 02:34:33.277039
(1 row)

Sat Nov 23 02:34:33 GMT 2024

 :
 :
```

イメージとしては次図のような状態です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/72bbe1a7-aed9-e3f1-6020-3818c701ed84.png)


#### ③ フェイルオーバ実行

プライマリノードのケバブメニュー(縦3点リーダ)をクリックし、再起動を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/fabf499d-7beb-fd36-dab1-bc4256dda513.png)

停止タイプを「標準」か「ノード再起動」を選択することができます。「標準」は PostgreSQL プロセスの再起動になり、数秒での実行が可能です。
今回はノード再起動を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/cb8962fb-c92a-a54d-507c-1629a60b30a5.png)

再起動を実施すると、コンソール上でステータスが「UPDATING」になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/4078a515-257f-19eb-7ea9-abb2fb8e1583.png)


#### ④ フェイルオーバ発生

ステータスが「UPDATING」となって数秒後には次のようにノードのタイプの「プライマリ」と「レプリカ」が切り替わり、フェイルオーバが発生していることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/7a44b141-955d-0b22-d331-ed20cc10295d.png)

イメージとしては次図になります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/c811c3c8-6669-b0ec-19ab-f728df481eba.png)


また、フェイルオーバによって id 52 のインサートが失敗し、フェイルオーバ完了後にインサートが実行されていることが確認できます。
エラーが発生している時間帯は**大体15秒弱**ですね。

```SQL:フェイルオーバ
                version                 |   pg_postmaster_start_time
----------------------------------------+-------------------------------
 PostgreSQL 14.11 OCI Optimized, 64-bit | 2024-11-23 02:32:18.484738+00
(1 row)

 id |             dt
----+----------------------------
 51 | 2024-11-23 02:35:21.900767
(1 row)

Sat Nov 23 02:35:21 GMT 2024
                version                 |   pg_postmaster_start_time
----------------------------------------+-------------------------------
 PostgreSQL 14.11 OCI Optimized, 64-bit | 2024-11-23 02:32:18.484738+00
(1 row)

SSL SYSCALL error: EOF detected
connection to server was lost
Sat Nov 23 02:35:22 GMT 2024
psql: could not connect to server: Connection refused
        Is the server running on host "10.0.2.6" and accepting
        TCP/IP connections on port 5432?
Sat Nov 23 02:35:23 GMT 2024
psql: could not connect to server: Connection refused
        Is the server running on host "10.0.2.6" and accepting
        TCP/IP connections on port 5432?
Sat Nov 23 02:35:24 GMT 2024
psql: could not connect to server: Connection refused
        Is the server running on host "10.0.2.6" and accepting
        TCP/IP connections on port 5432?
Sat Nov 23 02:35:25 GMT 2024
psql: could not connect to server: Connection refused
        Is the server running on host "10.0.2.6" and accepting
        TCP/IP connections on port 5432?
Sat Nov 23 02:35:26 GMT 2024
psql: could not connect to server: Connection refused
        Is the server running on host "10.0.2.6" and accepting
        TCP/IP connections on port 5432?
Sat Nov 23 02:35:28 GMT 2024
psql: could not connect to server: Connection refused
        Is the server running on host "10.0.2.6" and accepting
        TCP/IP connections on port 5432?
Sat Nov 23 02:35:29 GMT 2024
psql: could not connect to server: Connection refused
        Is the server running on host "10.0.2.6" and accepting
        TCP/IP connections on port 5432?
Sat Nov 23 02:35:30 GMT 2024
psql: could not connect to server: Connection refused
        Is the server running on host "10.0.2.6" and accepting
        TCP/IP connections on port 5432?
Sat Nov 23 02:35:31 GMT 2024
psql: could not connect to server: Connection refused
        Is the server running on host "10.0.2.6" and accepting
        TCP/IP connections on port 5432?
Sat Nov 23 02:35:32 GMT 2024
psql: could not connect to server: Connection refused
        Is the server running on host "10.0.2.6" and accepting
        TCP/IP connections on port 5432?
Sat Nov 23 02:35:33 GMT 2024
psql: could not connect to server: Connection refused
        Is the server running on host "10.0.2.6" and accepting
        TCP/IP connections on port 5432?
Sat Nov 23 02:35:34 GMT 2024
                version                 |   pg_postmaster_start_time
----------------------------------------+-------------------------------
 PostgreSQL 14.11 OCI Optimized, 64-bit | 2024-11-23 02:35:32.676362+00
(1 row)

 id |             dt
----+----------------------------
 52 | 2024-11-23 02:35:35.124922
(1 row)

Sat Nov 23 02:35:35 GMT 2024
                version                 |   pg_postmaster_start_time
----------------------------------------+-------------------------------
 PostgreSQL 14.11 OCI Optimized, 64-bit | 2024-11-23 02:35:32.676362+00
(1 row)

 id |             dt
----+----------------------------
 53 | 2024-11-23 02:35:36.164655
(1 row)

Sat Nov 23 02:35:36 GMT 2024
```

# まとめ

資料上は約2分程度の RTO となっているので、それに比べるとだいぶ速いフェイルオーバ時間になりますね。
Tokyoリージョンは同一の AD 内部でのフェイルオーバとなるので別 AD のフェイルオーバに比べたら速い、という事はあるかもしれません。