★悩み★
・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 のストリーミングレプリケーションを構築する手順は?」や「そもそもストリーミングレプリケーションとは?」で悩んでいるあなたにこの記事が少しでも役に立てれば幸いです。