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における「レプリケーション」とは、「データベースの複製(レプリカ)を作成すること」です。



PostgreSQLには、「レプリケーションを作成する」機能の1つとして、「ストリーミングレプリケーション」があります。PostgreSQLの「ストリーミングレプリケーション」を使うことで、簡単にデータベース間でデータの複製ができます。(下図参照)
 



PostgreSQLの「ストリーミングレプリケーション」を使うことで、以下の利点があります。
 

★ストリーミングレプリケーションの利点★
・高可用性 によるシステム稼働率の向上
 → データベースの冗長化ができる。
・参照負荷分散による処理性能の向上
 → 参照系のクエリ(SQL)を複数のサーバに分散できる。
・リアルタイムにデータを複製
 → 複製元と複製先のデータベースを同じ状態に維持できる。



以上が、「PostgreSQLのストリーミングレプリケーションとは何か?」となります。
 

PostgreSQLのストリーミングレプリケーションの仕組み

「PostgreSQLのストリーミングレプリケーションの仕組み」に関して解説します。
 

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



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



以上が、「PostgreSQLのストリーミングレプリケーションの仕組み」となります。
 

「高可用性」「参照系の負荷分散」「データの複製」を実現したい場合、PostgreSQLのストリーミングレプリケーションの利用を検討しましょう。


 

PostgreSQL 13 のストリーミングレプリケーションを構築する為の準備


「PostgreSQL 13 のストリーミングレプリケーションを構築する為の準備」に関してご紹介します。
 

★PostgreSQL 13 のストリーミングレプリケーションを構築する為の準備★
手順1:PostgreSQL 13 をインストール
手順2:PostgreSQL 13 の動作確認



上記の流れで、「PostgreSQL 13 のストリーミングレプリケーションを構築する為の準備」ができます。また、ストリーミングレプリケーションを使うために、以下のPostgreSQL環境を構築します。(下図参照)
 


 

上記の各手順は、以下の日時と環境で動作確認済みです。
動作確認済み日時: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 のストリーミングレプリケーションを構築する流れ★
手順1:複製元のPostgreSQLの設定ファイルを編集
手順2:複製先のPostgreSQLでベースバックアップを取得
手順3:複製先のPostgreSQLの設定ファイルを編集
手順4:複製先のPostgreSQLを起動
手順5:ストリーミングレプリケーションが設定されたことを確認
手順6:複製元のPostgreSQLにデータを登録
手順7:複製先のPostgreSQLにデータが登録されたことを確認



上記の流れで、「PostgreSQL 13 のストリーミングレプリケーションを構築」できます。また、上記手順で以下の「PostgreSQLのストリーミングレプリケーション」環境を構築できます。(下図参照)
 


 

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



以降で、上記「PostgreSQL 13 のストリーミングレプリケーションを構築する流れ」の各手順に関してご説明します。
 

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

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

ストリーミングレプリケーション環境を構築するために、複製元のPostgreSQLを設定しましょう。



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

↓↓ listen_addressesの設定値を変更(今回は、*を指定) ↓↓
listen_addresses = '*'		# what IP address(es) to listen on;

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

↓↓ synchronous_commit(同期レベル)の設定値をon(複製先でWALの書き込みが終わってから応答)に設定 ↓↓
synchronous_commit = on		# synchronization level;

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

↓↓ synchronous_standby_names(複製先の一覧)の設定値を変更(今回は、*を指定) ↓↓
synchronous_standby_names = '*'	# standby servers that provide sync rep



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

↓↓ 複製先のIPアドレスとユーザー名を追記 ↓↓
host    replication     postgres        192.168.10.160/32  trust



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

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



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



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

手順2:複製先のPostgreSQLでベースバックアップを取得

「手順2:複製先のPostgreSQLでベースバックアップを取得」に関してご説明します。
 

複製元のPostgreSQLのデータベースを複製先のPostgreSQLにコピーしましょう。



PostgreSQLの「pg_basebackup」コマンド(通称、ベースバックアップ)を実行することで、複製元のデータベースを複製先にコピーできます。以下のようにして、複製先のPostgreSQLでベースバックアップを取得してください。

[root@develop data]# su - postgres
-bash-4.2$  pg_basebackup -R -D /var/lib/pgsql/13/data/ -h 192.168.10.161
-bash-4.2$ ls -l /var/lib/pgsql/13/data/
合計 524



コマンド実行後、指定したディレクトリ内にファイルなどが存在している場合、「正常にベースバックアップの取得ができた」と判断できます。
 

pg_basebackupのコマンドリファレンスが気になる方は、以下の公式サイトをごらんください。
pg_basebackupのコマンドリファレンス(公式サイト)



以上で、「手順2:複製先のPostgreSQLでベースバックアップを取得」は完了です。
 

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

「手順3:複製先のPostgreSQLの設定ファイルを編集」に関してご説明します。

ストリーミングレプリケーション環境を構築するために、複製先のPostgreSQLを設定しましょう。



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

↓↓ listen_addressesの設定値を変更(今回は、*を指定) ↓↓
listen_addresses = '*'		# what IP address(es) to listen on;

↓↓ hot_standby(参照可否)の設定値を変更(今回は、onを指定) ↓↓
hot_standby = on			# "off" disallows queries during recovery



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

手順4:複製先のPostgreSQLを起動

「手順4:複製先のPostgreSQLを起動」に関してご説明します。
 

複製先のPostgreSQLを起動しましょう。



複製先のPostgreSQLを起動するために、以下のコマンドを順に実行してください。

[root@develop 12]# systemctl start postgresql-13.service
[root@develop data]# systemctl status postgresql-13.service
● postgresql-13.service - PostgreSQL 13 database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql-13.service; disabled; vendor preset: disabled)
   Active: active (running) 



コマンド実行後、「Active: active (running)」が表示された場合、「正常に複製先のPostgreSQLを起動できた」と判断できます。
 

以上で、「手順4:複製先のPostgreSQLを起動」は完了です。

手順5:ストリーミングレプリケーションが設定されたことを確認

「手順5:ストリーミングレプリケーションが設定されたことを確認」に関してご説明します。
 

「複製先のPostgreSQL」と「複製元のPostgreSQL」でストリーミングレプリケーションが設定できているかを確認しましょう。



複製元のPostgreSQLに対して、以下のコマンドを実行してください。

[root@data-manager data]# su - postgres
-bash-4.2$ psql -c "select usename, application_name, client_addr, state, sync_priority, sync_state from pg_stat_replication;"
 usename  | application_name |  client_addr   |   state   | sync_priority | sync_state 
----------+------------------+----------------+-----------+---------------+------------
 postgres | develop          | 192.168.10.160 | streaming |             1 | sync
(1 行)



コマンド実行後、「streaming」が表示された場合、「正常にPostgreSQLのストリーミングレプリケーション環境が構築できた」と判断できます。
 

以上で、「手順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に対しては、データ登録系のクエリは実行できません。(実行結果は以下を参照)

testdb=# insert into mymovie values(1,'ccc');
ERROR:  リードオンリーのトランザクションでは INSERT を実行できません
testdb=# 



以上で、「手順7:複製先のPostgreSQLにデータが登録されたことを確認」は完了です。
 
 

上記の流れで、PostgreSQL 13 のストリーミングレプリケーションを構築できました。



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


 

【まとめ】PostgreSQL 13 のストリーミングレプリケーションを構築する手順


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

★悩み★
・PostgreSQLのストリーミングレプリケーションとは何か?
・PostgreSQLのストリーミングレプリケーションの仕組みを知りたい。
・PostgreSQL 13 のストリーミングレプリケーションを構築する手順は?



「PostgreSQL 13 のストリーミングレプリケーションを構築する手順は?」や「そもそもストリーミングレプリケーションとは?」で悩んでいるあなたにこの記事が少しでも役に立てれば幸いです。