PostgreSQL 13 でロジカルレプリケーションを設定する手順

PostgreSQL 13 でロジカルレプリケーションを設定する手順

 

★悩み★
・PostgreSQLのロジカルレプリケーションとは何か?仕組みも知りたい。
・PostgreSQLのロジカルレプリケーションの仕組みを知りたい。
・PostgreSQL 13 でロジカルレプリケーションを設定する手順は?


こういった「悩み」に答えます。

 

★本記事の内容★
① PostgreSQLのロジカルレプリケーションの仕組みを解説
② PostgreSQL 13 のロジカルレプリケーションを設定する為の準備
③ PostgreSQL 13 のロジカルレプリケーションを設定する手順を解説



これからご紹介する「PostgreSQL 13 のロジカルレプリケーションを設定する手順」を実践したことで、筆者は1時間以内でPostgreSQL 13 でロジカルレプリケーションを設定できました。

記事の前半では「PostgreSQLのロジカルレプリケーションの仕組み」を解説します。記事の後半では「PostgreSQL 13 でロジカルレプリケーションを設定する手順」を紹介します。

この記事を読み終えることで、「PostgreSQLのロジカルレプリケーションの仕組み」を把握できるだけでなく、「PostgreSQL 13 でロジカルレプリケーションを設定できる」状態になります。
 

ちなみに、「PostgreSQLのストリーミングレプリケーションの仕組み」を知りたい方は、以下の記事をご覧ください。
 


 

 


 

PostgreSQLのロジカルレプリケーションの仕組みを解説

PostgreSQLのロジカルレプリケーションの仕組みを解説


「PostgreSQLのロジカルレプリケーションの仕組みを解説」に関してご紹介します。

★PostgreSQLのロジカルレプリケーションに関するご紹介事項★
・PostgreSQLのロジカルレプリケーションとは何か?をご紹介
・PostgreSQLのロジカルレプリケーションの仕組みをご紹介



以降で、上記「PostgreSQLのロジカルレプリケーションに関するご紹介事項」の各項目に関してご説明します。 
 

PostgreSQLのロジカルレプリケーションとは何か?

「PostgreSQLのロジカルレプリケーションとは何か?」に関してご紹介します。
 

PostgreSQLにおける「レプリケーション」とは、「データベースの複製(レプリカ)を作成すること」です。



PostgreSQLには、「レプリケーションを作成する」機能の1つとして、「ロジカルレプリケーション(別名:論理レプリケーション)」があります。PostgreSQLの「ロジカルレプリケーション」を使うことで、指定したテーブルをデータベース間で簡単に複製できます。(下図参照)
 

PostgreSQLのロジカルレプリケーションとは何か?



PostgreSQLの「ロジカルレプリケーション」の利用例は、以下となります。
 

★ロジカルレプリケーションの利用例★
・メジャーバージョンが異なるPostgreSQL間でのレプリケーションをしたい
・異なるOSのPostgreSQL間でのレプリケーションをしたい
・特定のテーブルのみをPostgreSQL間でレプリケーションをしたい

参照:ロジカルレプリケーションの利用用途(公式サイト)



以上が、「PostgreSQLのロジカルレプリケーションとは何か?」となります。
 

PostgreSQLのロジカルレプリケーションの仕組み

「PostgreSQLのロジカルレプリケーションの仕組み」に関して解説します。
 

PostgreSQLが「どのようにして、データを複製しているか」を説明しますね。



PostgreSQLのロジカルレプリケーションによるデータ複製は、WAL(Write Ahead Log)を「pgoutputプロセス」でデコードし、デーコードしたWALを「wal senderプロセス」と「bdworkerプロセス」で転送することで実現しています。(下図参照)
 

PostgreSQLのロジカルレプリケーションの仕組み



ちなみに、PostgreSQLのロジカルレプリケーションには、以下の制限事項があります。
 

★PostgreSQLのロジカルレプリケーションの制限事項★
・レプリケーションされないデータ操作がある
 → TRUNCATEに関するデータ操作
・レプリケーションされないデータがある
 → シーケンスのデータやビューなど

参照:ロジカルレプリケーションの制限事項(公式サイト)



上記制限事項に対するレプリケーションや「負荷分散や高可用性」を実現したい場合は、「ロジカルレプリケーション(論理レプリケーション)」ではなく、「ストリーミングレプリケーション」の利用を検討してください。
 

以上で、「PostgreSQLのロジカルレプリケーションの仕組み」は完了です。
 

「一部のテーブルをレプリケーションしたい」や「異なるPostgreSQLのバージョン間でデータを複製したい」場合、PostgreSQLのロジカルレプリケーションの利用を検討しましょう。


 

PostgreSQL 13 のロジカルレプリケーションを設定する為の準備

PostgreSQL 13 のロジカルレプリケーションを設定する為の準備


「PostgreSQL 13 のロジカルレプリケーションを設定する為の準備」に関してご紹介します。

★PostgreSQL 13 のロジカルレプリケーションを設定する為の準備★
手順1:PostgreSQL 13 をインストール
手順2:PostgreSQL 13 の動作確認



上記の流れで、「PostgreSQL 13 のロジカルレプリケーションを設定する為の準備」ができます。また、ロジカルレプリケーションを設定するために、以下のPostgreSQL環境を構築します。(下図参照)
 

PostgreSQL 13 のロジカルレプリケーションを設定する為の準備


 

上記の各手順は、以下の日時と環境で動作確認済みです。
動作確認済み日時:2021年9月17日
動作確認済み環境:CentOS Linux release 7.7.1908 (Core)



以降で、上記「PostgreSQL 13 のロジカルレプリケーションを設定する為の準備」の各手順に関してご説明します。
 

手順1:PostgreSQL 13 をインストール

「手順1:PostgreSQL 13 をインストール」に関してご説明します。
 

ロジカルレプリケーション環境を設定するためにも、PostgreSQLをインストールしましょう。



「PostgreSQLのインストール手順」に関しては、以下の記事「5ステップでPostgreSQL13をインストールする方法」をご覧ください。
 


 

既にPostgreSQLをインストールされている方は、本手順を省略してください。


以上で、「手順1:PostgreSQL 13 をインストール」は完了です。
 

手順2:PostgreSQL 13 の動作確認

「手順2:PostgreSQL 13 の動作確認」に関してご説明します。
 

PostgreSQLが正常に動作するかを確認しましょう。



「PostgreSQLが起動できるか」を確認し、PostgreSQLが正常に動作することを確認してください。起動手順に関しては、以下の記事をご覧ください。
 



以上で、「手順2:PostgreSQL 13 の動作確認」は完了です。
 

上記の流れで、PostgreSQL 13 のロジカルレプリケーションを設定する為の準備ができました。


 

PostgreSQL 13 のロジカルレプリケーションを設定する手順

PostgreSQL 13 のロジカルレプリケーションを設定する手順


「PostgreSQL 13 のロジカルレプリケーションを設定する手順」に関してご紹介します。

★PostgreSQL 13 のロジカルレプリケーションを設定する流れ★
手順1:複製元のPostgreSQLの設定ファイルを編集
手順2:複製元のPostgreSQLでロジカルレプリケーションの対象を定義
手順3:複製先のPostgreSQLで論理レプリケーション対象のスキーマを定義
手順4:複製先のPostgreSQLでロジカルレプリケーションの利用を宣言
手順5:ロジカルレプリケーションが設定されたことを確認
手順6:複製元のPostgreSQLにデータを登録
手順7:複製先のPostgreSQLにデータが登録されたことを確認



上記の流れで、「PostgreSQL 13 のロジカルレプリケーションを設定」できます。また、上記手順で以下の「PostgreSQLのロジカルレプリケーション」環境を構築できます。(下図参照)
 

PostgreSQL 13 のロジカルレプリケーションを設定する手順


 

上記の各手順は、以下の日時と環境で動作確認済みです。
動作確認済み日時:2021年9月17日
動作確認済み環境:CentOS Linux release 7.7.1908 (Core)



以降で、上記「PostgreSQL 13 のロジカルレプリケーションを設定する流れ」の各手順に関してご説明します。
 

手順1:複製元のPostgreSQLの設定ファイルを編集

「手順1:複製元のPostgreSQLの設定ファイルを編集」に関して解説します。
 

ロジカルレプリケーションを設定するために、複製元のPostgreSQLを設定しましょう。



PostgreSQLの設定ファイルの1つである「postgresql.conf」を編集しましょう。見直すべき設定値は、以下となります。

↓↓ wal_level(WALの出力レベル)の設定値をlogicalに設定 ↓↓
wal_level = logical			# minimal, replica, or logical

↓↓ max_wal_senders(wal senderに同時接続する最大数)の設定値を変更(今回は、10を指定) ↓↓
max_wal_senders = 10		# max number of walsender processes



設定を反映させるために、以下のコマンドでPostgreSQLを再起動してください。

[root@data-manager data]# systemctl restart postgresql-13.service 



最後に、「mymovie」テーブルを作成しておきましょう。作成手順に関しては、以下の記事「PostgreSQL 13でデータ登録と参照をする方法」をご覧ください。
 



以上で、「手順1:複製元のPostgreSQLの設定ファイルを編集」は完了です。
 

手順2:複製元のPostgreSQLでロジカルレプリケーションの対象を定義

「手順2:複製元のPostgreSQLでロジカルレプリケーションの対象を定義」に関して解説します。
 

ロジカルレプリケーションで複製したい対象を定義しましょう。



複製元のPostgreSQLにおいて、ロジカルレプリケーションの対象を定義します。定義するために、以下のコマンドを順に実行してください。

[root@data-manager data]# su - postgres
-bash-4.2$ psql
postgres=# \c testdb
testdb=# CREATE PUBLICATION pub_a FOR TABLE mymovie;
CREATE PUBLICATION
testdb=# 



コマンド実行後、「CREATE PUBLICATION」が表示された場合、「正常に複製元のPostgreSQLでロジカルレプリケーションの対象を定義できた」と判断できます。
 

「CREATE PUBLICATION」のコマンドリファレンスに関しては、以下をご覧ください。
参照:CREATE PUBLICATIONのコマンドリファレンス(公式サイト)
 

以上で、「手順2:複製元のPostgreSQLでロジカルレプリケーションの対象を定義」は完了です。
 

手順3:複製先のPostgreSQLで論理レプリケーション対象のスキーマを定義

「手順3:複製先のPostgreSQLで論理レプリケーション対象のスキーマを定義」に関して解説します。
 

ロジカルレプリケーション(論理レプリケーション)を利用する場合、複製先にロジカルレプリケーションの対象となったスキーマの定義が必要です。



複製先にスキーマを作成するために、pg_dumpコマンドで複製元からスキーマ情報を取得しましょう。そのために、以下のコマンドを順に実行してください。コマンド内のIPアドレスの情報などは、自分用に書き換えてください。

[root@develop postgresql]# su - postgres
-bash-4.2$ /usr/pgsql-13/bin/pg_dump -h 192.168.10.161 -p 5432 --username=postgres --schema-only --table mymovie testdb > mymovie_schema.sql



コマンド実行後、「mymovie_schema.sql」が存在する場合、「正常にスキーマ情報を取得できた」と判断できます。
 

ちなみに、「pg_dump」に関する詳細を知りたい方は、以下の記事をご覧ください。
 



取得したスキーマ情報を複製先のPostgreSQLにインポートするために、以下のコマンドを順に実行してください。

[root@develop postgresql]# systemctl start postgresql-13.service
[root@develop postgresql]# su - postgres
-bash-4.2$ psql
postgres=# create database testdb;
CREATE DATABASE
postgres=# \q
-bash-4.2$ psql -U postgres -d testdb < mymovie_schema.sql
-bash-4.2$ echo $?
0



コマンド実行後、「0」が表示された場合、「正常に複製先のPostgreSQLにスキーマをインポートできた」と判断できます。
 

以上で、「手順3:複製先のPostgreSQLで論理レプリケーション対象のスキーマを定義」は完了です。
 

手順4:複製先のPostgreSQLでロジカルレプリケーションの利用を宣言

「手順4:複製先のPostgreSQLでロジカルレプリケーションの利用を宣言」に関して解説します。
 

複製先のPostgreSQLでロジカルレプリケーションの利用を宣言しましょう。



複製先のPostgreSQLでロジカルレプリケーションの利用を宣言するために、以下のコマンドを実行してください。コマンド内のホスト名の情報などは、自分用に書き換えてください。

[root@develop postgresql]# su - postgres
-bash-4.2$ psql
postgres=# \c testdb
testdb=# CREATE SUBSCRIPTION sub_a CONNECTION 'dbname=testdb host=data-manager' PUBLICATION pub_a;
NOTICE:  発行サーバでレプリケーションスロット"sub_a"を作成しました
CREATE SUBSCRIPTION
testdb=# 



コマンド実行後、「CREATE SUBSCRIPTION」が表示された場合、「正常に複製先のPostgreSQLでロジカルレプリケーションの利用を宣言できた」と判断できます。
 

「CREATE SUBSCRIPTION」の詳細に関しては、以下をご覧ください。
参照:CREATE SUBSCRIPTIONのコマンドリファレンス(公式サイト)
 

以上で、「手順4:複製先のPostgreSQLでロジカルレプリケーションの利用を宣言」は完了です。
 

手順5:ロジカルレプリケーションが設定されたことを確認

「手順5:ロジカルレプリケーションが設定されたことを確認」に関して解説します。
 

ロジカルレプリケーションの設定ができたことを確認しましょう。



ロジカルレプリケーションの設定ができたことを確認するために、複製元と複製先のPostgreSQLのログを確認してください。

↓↓ 複製元のPostgreSQLのログ確認 ↓↓
-bash-4.2$ tail -n 50 13/data/log/postgresql-Fri.log | grep "START_REPLICATION SLOT"
2021-09-10 13:06:25.884 JST [25005] 文:  START_REPLICATION SLOT "sub_a" LOGICAL 0/0 (proto_version '1', publication_names '"pub_a"')


↓↓ 複製先のPostgreSQLのログ確認 ↓↓
-bash-4.2$ tail -n 50 13/data/log/postgresql-Fri.log | grep "同期ワーカが終了しました"
2021-09-10 13:06:26.000 JST [13319] LOG:  サブスクリプション"sub_a"、テーブル"mymovie"に対する論理レプリケーションテーブル同期ワーカが終了しました



上記のログが出力されていた場合、「ロジカルレプリケーションを正しく設定できた」と判断できます。
 

以上で、「手順5:ロジカルレプリケーションが設定されたことを確認」は完了です。
 

手順6:複製元のPostgreSQLにデータを登録

「手順6:複製元のPostgreSQLにデータを登録」に関してご説明します。
 

ロジカルレプリケーションの動作を確認するために、複製元のPostgreSQLにデータを登録してみましょう。



複製元のPostgreSQLに対して、データを登録するために以下のコマンドを順に実行してください。

[root@data-manager data]# su - postgres
-bash-4.2$ psql
postgres=# \c testdb;
データベース"testdb"にユーザ"postgres"として接続しました。
testdb=# \t
「タプルのみ表示」は on です。
testdb=# \d
 public   | mymovie     | テーブル | postgres
 public   | seo_ranking | テーブル | postgres

testdb=# insert into mymovie values(2,'a');
INSERT 0 1
testdb=# insert into mymovie values(2,'c');
INSERT 0 1
testdb=# \q



コマンド実行後、「INSERT 0 1」が表示された場合、「正常に複製元のPostgreSQLにデータを登録できた」と判断できます。
 

以上で、「手順6:複製元のPostgreSQLにデータを登録」は完了です。
 

手順7:複製先のPostgreSQLにデータが登録されたことを確認

「手順7:複製先のPostgreSQLにデータが登録されたことを確認」に関してご説明します。
 

複製先のPostgreSQLにロジカルレプリケーション経由でデータが登録されたことを確認しましょう。



ロジカルレプリケーション経由で「データが複製先のPostgreSQLに登録された」ことを確認するために、以下のコマンドを実行してください。

[root@develop data]# su - postgres
-bash-4.2$ psql
postgres=# \c testdb
データベース "testdb" にユーザ"postgres"として接続しました。
testdb=# \d
              リレーションの一覧
 スキーマ |    名前     |    型    |  所有者  
----------+-------------+----------+----------
 public   | mymovie     | テーブル | postgres
 public   | seo_ranking | テーブル | postgres
(2 行)

testdb=# select * from mymovie;
 id | name 
----+------
  1 | a
  2 | b
  2 | b
  2 | b
  2 | b
  2 | b
  2 | b
  2 | b
  2 | c
  2 | c
  2 | a
  2 | c
(12 行)



上記コマンド実行後、「複製元で登録したデータが表示された」場合、「正常にロジカルレプリケーション経由でデータが複製された」と判断できます。
 

上記の流れで、PostgreSQL 13 のロジカルレプリケーションを設定できました。



ちなみに、「PostgreSQLのアーキテクチャを体系的に学びたい」や「その他のPostgreSQLのコマンドを知りたい」方は、以下の参考書がオススメです。


 

【まとめ】PostgreSQL 13 でロジカルレプリケーションを設定する手順

【まとめ】PostgreSQL 13 でロジカルレプリケーションを設定する手順


今回の記事を通して、「PostgreSQL 13 のストリーミングレプリケーションを構築する手順」をご紹介することで、以下の悩みを解消しました。
 

★悩み★
・PostgreSQLのロジカルレプリケーションとは何か?仕組みも知りたい。
・PostgreSQLのロジカルレプリケーションの仕組みを知りたい。
・PostgreSQL 13 でロジカルレプリケーションを設定する手順は?



「PostgreSQL 13 のロジカルレプリケーションを設定する手順は?」や「そもそもロジカルレプリケーションとは?」で悩んでいるあなたにこの記事が少しでも役に立てれば幸いです。
 

 


 

タイトルとURLをコピーしました