はじめに
説明
Cloud Native PostgreSQL(CNP)とはEDB社の提供しているPostgreSQLのKubernates Operatorになります。
Kubernates Operatorを初耳の方も多いと思いますが、一言で申しますとクラスタ管理・構築ツールになります。
今回は1.50から加わったpg_basebackupを使ってVMからベースバックアップを取得し、CNPを構築させる方法を記載します
構築所要時間
30~60分程度を想定しております。
前提
CNPの構築や操作は最低限の記載となりますので、詳しくは初回の記事を参考にして下さい。
VMにPostgreSQLを構築
インストール
VMにPostgreSQLインストールします。
RHEL系は下記より手順を入手すると楽です。
$ dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
$ dnf -qy module disable postgresql
$ dnf install -y postgresql13-server
環境構築
リストア用のRoleを作成します。
$ sudo su - postgres
$ psql
psql# CREATE ROLE streaming_replica LOGIN REPLICATION PASSWORD 'password';
テスト用のテーブルを作成し、データを入れます。CNPに合わせてappユーザにしてます。
psql# CREATE ROLE app LOGIN REPLICATION CREATEDB PASSWORD 'password';
psql# create database app;
psql# \q
$ exit
$ psql -U app -h 127.0.0.1
app# create table japan ( id serial primary key, pref text, city text );
app# INSERT INTO japan
( pref , city )
VALUES
( '東京都', '八王子市' ),
( '東京都', '立川市' ),
( '東京都', '武蔵野市' ),
( '東京都', '三鷹市' ),
( '東京都', '青梅市' ),
( '東京都', '府中市' ),
( '東京都', '昭島市' ),
( '東京都', '調布市' ),
( '東京都', '小金井市' ),
( '東京都', '小平市' ),
( '東京都', '日野市' ),
( '東京都', '東村山市' ),
( '東京都', '国分寺市' ),
( '東京都', '国立市' ),
( '東京都', '福生市' ),
( '東京都', '狛江市' ),
( '東京都', '東大和市' ),
( '東京都', '清瀬市' ),
( '東京都', '東久留米市' ),
( '東京都', '武蔵村山市' ),
( '東京都', '多摩市' ),
( '東京都', '稲城市' ),
( '東京都', '羽村市' ),
( '東京都', 'あきる野市' ),
( '東京都', '西東京都市' );
app# \q
接続用にpg_hbaファイルを編集します。md5が標準の場合などは都度変更されて下さい。
$ echo host replication all all scram-sha-256 >> /var/lib/pgsql/13/data/pg_hba.conf
$ echo host all app all scram-sha-256 >> /var/lib/pgsql/13/data/pg_hba.conf
$ cat /var/lib/pgsql/13/data/pg_hba.conf
設定ファイルを編集、確認します。
$ vi /var/lib/pgsql/13/data/postgresql.conf
listen_addresses = '*'
wal_level = replica
$ exit
PostgreSQLの設定を反映し、
接続のIPと待受ポートを確認します。
$ sudo systemctl restart postgresql-13
$ ip a
$ ss -natp
CNPを構築
CNPをインストール
ここからはk8s側の操作になります。
下記を参考にインストールを行います。
$ kubectl apply -f \
https://get.enterprisedb.io/cnp/postgresql-operator-1.7.1.yaml
接続ユーザのパスワードを設定します。
$ kubectl create secret generic source-db-replica-user \
--from-literal=password=password
レプリケーションによる複製作成
ストリーミングレプリケーションによるコピー用のyamlを設定します。
{“level”:”info”,”ts”:1629194105.9210694,”msg”:”DB not available, will retry”,”err”:”pq: SSL is not enabled on the server”}
というエラーが発生する場合後日記載するSSL設定で接続するかsslmode: disableを有効にして下さい。
$ cat clone.yaml
apiVersion: postgresql.k8s.enterprisedb.io/v1
kind: Cluster
metadata:
# 起動するクラスタ名
name: cluster-restore
spec:
instances: 2
primaryUpdateStrategy: unsupervised
bootstrap:
pg_basebackup:
# externalClusters:と同じ名前であれば自由
source: cluster
storage:
size: 5Gi
externalClusters:
- name: cluster
connectionParameters:
host: 接続先IPないしはホスト名
user: 接続ユーザ名
#sslmode: disable
password:
# 1つ前の手順で設定したsecret名
name: source-db-replica-user
key: password
#sslKey:
#name: cluster-example-replication
#key: tls.key
#sslCert:
#name: cluster-example-replication
#key: tls.crt
設定を反映し、Podが遷移するのを確認します。
エラーの場合はkubectl logs cluster-restore-1-pgbasebackup-9s9kx
のように確認していきます。
$ kubectl apply -f clone.yaml
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
cluster-restore-1-pgbasebackup-9s9kx 0/1 Init:0/1 0 10s
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
cluster-restore-1 0/1 Init:0/1 0 1s
cluster-restore-1-pgbasebackup-9s9kx 0/1 Completed 0 43s
無事、通常の起動と同じになれば完了です。
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
cluster-restore-1 1/1 Running 0 30m
cluster-restore-2 1/1 Running 0 29m
動作確認
DBが複製されていることを確認します。
$ kubectl exec -it cluster-restore-1 -- /bin/bash
$ psql
postgres=# \c app
app=# \dt
List of relations
Schema | Name | Type | Owner
--------+-------+-------+-------
public | japan | table | app
(1 row)
app=# select * from japan;
id | pref | city
----+-----------+-----------------
1 | 東京都 | 八王子市
2 | 東京都 | 立川市
3 | 東京都 | 武蔵野市
4 | 東京都 | 三鷹市
5 | 東京都 | 青梅市
6 | 東京都 | 府中市
7 | 東京都 | 昭島市
8 | 東京都 | 調布市
9 | 東京都 | 小金井市
10 | 東京都 | 小平市
11 | 東京都 | 日野市
12 | 東京都 | 東村山市
13 | 東京都 | 国分寺市
14 | 東京都 | 国立市
15 | 東京都 | 福生市
16 | 東京都 | 狛江市
17 | 東京都 | 東大和市
18 | 東京都 | 清瀬市
19 | 東京都 | 東久留米市
20 | 東京都 | 武蔵村山市
21 | 東京都 | 多摩市
22 | 東京都 | 稲城市
23 | 東京都 | 羽村市
24 | 東京都 | あきる野市
25 | 東京都 | 西東京都市
(25 rows)
あとがき
CNPはPodでPostgreSQLの設定を変更しても戻ってしまうため
pg_basebackupの方法が提供されているのはうれいしいですね。
次回の内容は証明書を使った複製を行います。
ここまでお読みいただき、ありがとうございました!