【OCI クラウド移行ガイド】RDS for PostgreSQLからOCI Computeへのレプリケーションを設定してみた～PostgreSQL編～

# OCIクラウド移行ガイドとは
オンプレミスやAWSなど、複数のプラットフォームからOracle Cloud Infrastructureへの移行プロジェクトに取り組んでいるクラウドエンジニア（@araidon,@kazunishi,@yama6）による、OCI移行手順をまとめたシリーズ記事です。
各回、サンプルワークロードから対象サービスを取り上げ、移行手順をガイドいたします。
まとめ記事は以下になります。

https://qiita.com/yama6/items/b197c0fe3ec75eb02637


# 移行したいサンプルワークロード
日々の業務でよく目にするサービスを中心に、サンプルワークロードとしてまとめてみました。このシリーズでは、主にAWSからの移行を取り上げます。
このワークロードは、ユーザがログインして、Web上で写真を共有するWebサービスをイメージしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2471135/5d657078-030c-a277-544e-eebe031c74cf.png)

# 移行検討するサービス：RDS for PostgreSQL
今回、移行検討対象とするのはAmazon RDS for PostgreSQLです。
移行先はOracle CloudのCompute(=IaaS)です。
残念ながら2023/10/27時点ではOracle Cloud上でPostgreSQLのPaaSがないためComputeとします。
IaaSでDBを動かすメリットとしては圧倒的なコスト削減が挙げられます。
PostgreSQLの利用コスト削減目的の方の一助になれば幸いです。


PostgreSQLの移行準備として今回はレプリケーション設定を実施してみます。
PostgreSQLのレプリケーションには、データベース全体を複製する ストリーミングレプリケーション（物理レプリケーション） と、テーブルやデータベースごとに複製する ロジカルレプリケーション（論理レプリケーション） があります。

今回はRDS for PostgreSQLとOCI Compute上のPostgreSQLのロジカルレプリケーションを試してみたいと思います。
パブリッシャー(=連携元DB)をRDS、サブスクライバー(=連携先DB)をPostgreSQL on Computeとして作業します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2471135/a42b7132-5a82-3bfd-7857-2530268b8a12.png)



## 作業の流れ
①RDS for PostgreSQLの構築
②OCI Compute上でのPostgreSQLの構築
③RDS for PostgreSQLとPostgreSQL on Computeのロジカルレプリケーション設定

## ①RDS for PostgreSQLの構築
ソース元となるRDS for PostgreSQLを構築します

事前にpostgreSQL15のカスタムパラメータグループを作成します
「rds.logical_replication：1」に変更します
「rds.force_ssl：0」に変更します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2471135/5e119f0a-72c5-1f7e-18b7-5441f8aafd66.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2471135/cfd33549-df8a-2b4e-5844-72e9c7e41ee9.png)

RDSの作成画面では以下に注意してインスタンス作成を実施します
エンジンバージョン：PostgreSQL15.3-R2
パブリックアクセス：あり
パラメータグループ(追加設定)：先ほど作成したカスタムパラメータグループを指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2471135/dc1a2912-b08e-8ad6-4a87-f44cdc2eeb76.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2471135/c71cbbf9-a1c6-bf83-1657-f11800fb04f8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2471135/2b2812f8-e440-49eb-a54a-f938b298a8ec.png)

## ②OCI Compute上でのPostgreSQLの構築
まずOracle Cloud Computeを作成します。

最新のyumリポジトリのインストール
[こちら](https://yum.postgresql.org/repopackages/)から利用OSに応じたURLを指定します
今回はOracleLinux8にしたのでREHL8系のものを利用します
```
sudo yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
```
デフォルトのPostgreSQLのモジュールを無効化
```
sudo yum -qy module disable postgresql
```
どのバージョンがインストールできるかの確認
今回は11-16までがインストールできることを確認
```
[root@postgresql-server opc]# yum search postgresql*-server
Last metadata expiration check: 0:00:41 ago on Wed 25 Oct 2023 06:50:47 AM GMT.
============================================== Name Matched: postgresql*-server ===============================================
postgresql11-server.x86_64 : The programs needed to create and run a PostgreSQL server
postgresql12-server.x86_64 : The programs needed to create and run a PostgreSQL server
postgresql13-server.x86_64 : The programs needed to create and run a PostgreSQL server
postgresql14-server.x86_64 : The programs needed to create and run a PostgreSQL server
postgresql15-server.x86_64 : The programs needed to create and run a PostgreSQL server
postgresql16-server.x86_64 : The programs needed to create and run a PostgreSQL server
```

PostgreSQLのインストール
今回はRDS for PostgreSQLに合わせるため15を選択します。
```
sudo yum install -y postgresql15-server
```
バージョン確認
```
[root@postgresql-server opc]# psql --version
psql (PostgreSQL) 15.4
```

PostgreSQLの初期設定
以下コマンドを実行すると登録パスワードを2回求められますので任意のものを入力します
```
sudo su - postgres -c '/usr/pgsql-15/bin/initdb -E UTF8 --locale=C -A scram-sha-256 -W'
```
systemdのサービスとして有効化
```
sudo systemctl enable postgresql-15.service
```
PostgreSQLの起動
```
sudo systemctl start postgresql-15.service
```
PostgreSQLへのアクセス確認
データベースクラスタ作成時に入力したパスワードを入力します
```
psql  --username=postgres
```

## ③RDS for PostgreSQLとPostgreSQL on Computeのロジカルレプリケーション設定
### ③-1 RDS for PostgreSQL(=パブリッシャー)の設定
OCI ComputeRDS for PostgreSQLにアクセスします
※この際、エラー等が出る際AWSのセキュリティグループや、OCIのセキュリティリストなどネットワーク疎通を確認してください
```
psql --host=endpoint --port=5432 --username=postgres
```
問題なくアクセスできれば検証用データベースを作成します
DBの作成：test_db
```
postgres=> CREATE DATABASE test_db;
CREATE DATABASE
```
作成したtest_dbにアクセス
```
postgres=> \c test_db
psql (15.4, server 15.3)
You are now connected to database "test_db" as user "postgres".
```
テーブル作成：test_table
```
test_db=> CREATE TABLE test_table (id char(4) not null, name text not null,  PRIMARY KEY(id));
CREATE TABLE
```
test_tableにレコード作成
```
test_db=> INSERT INTO test_table(id,name) VALUES (1,'hoge');
INSERT 0 1
```
テーブル確認
```
test_db=> SELECT * FROM test_table;
  id  | name
------+------
 1    | hoge
(1 row)
```

パブリケーションの作成
```
test_db=> CREATE PUBLICATION testpub FOR ALL TABLES;
CREATE PUBLICATION
```

### ③-2 PostgresSQL on Compute(=サブスクライバー)の設定
OCI Compute上のPostgreSQLにアクセス
```
psql -U postgres
```
DBの作成：test_db
```
CREATE DATABASE test_db;
```
test_dbにアクセス
```
\c test_db
```
テーブル作成：test_table
```
CREATE TABLE test_table (id char(4) not null, name text not null,  PRIMARY KEY(id));
```
サブスクリプションの作成
```
CREATE SUBSCRIPTION testsub CONNECTION 'host=＜RDS エンドポイント＞ port=5432 dbname=testdb user=postgres password=＜パスワード＞' PUBLICATION testpub;
```

テーブルの中身がパブリッシャーと同様になっていることを確認
```
postgres=# SELECT * FROM test_table;
  id  | name
------+------
 1    | hoge
(1 row)
```

③-3 レプリケーションの動作確認
レプリケーション設定後に再度、連携元であるRDSを更新して連携先であるPostgreSQL on Computeでも反映されているか確認します
RDSへアクセス
```
psql --host=endpoint --port=5432 --username=postgres
```
test_dbにアクセス
```
\c test_db
```
追加レコードをインサート
```
INSERT INTO test_table(id,name) VALUES (2,'fuga');
```
テーブル内容確認
```
SELECT * FROM test_table;	
	test_db=> SELECT * FROM test_table;
	  id  | name
	------+------
	 1    | hoge
	 2    | fuga
	(2 rows)
```
OCI Compute上のPostgreSQLにアクセス
```
psql -U postgres
```
test_dbにアクセス
```
\c test_db
```

RDSと同様のテーブル内容になっているか確認
問題なくレプリケーションされていることを確認
```
SELECT * FROM test_table;	
	test_db=> SELECT * FROM test_table;
	  id  | name
	------+------
	 1    | hoge
	 2    | fuga
	(2 rows)
```
※うまく動かない際は「/var/lib/pgsql/15/data/log」にログが吐かれているので確認してください

## 最後に
今回はRDS for PostgreSQLをパブリッシャー、PostgreSQL on Computeをサブスクライバーとしてロジカルレプリケーション設定を実施してみました。

現時点ではOracle Cloud側にPostgreSQLのPaaSがないため、IaaSを対象としましたが、「OCI Database for PostgreSQL」が2023年12月に一般提供が予定されているとのことです。

https://codezine.jp/article/detail/18407

一般提供され次第、いろいろ触ってみたいと思います。