RHEL9でPostgreSQLのインストールと論理レプリケーションの構築

はじめに

説明

RHEL9でPostgreSQLのインストールと論理レプリケーションを構築します。

構築所要時間

1時間前後となります。

慣れている方は30分程度です。

SELinuxの無効化とFWの無効化

SELinuxの無効化はRHEL8以前と異なりますのでこちらの記事を参考にしてください。

一旦FWを無効化します。

必要に応じてsudo systemctl stop firewalldを設定して下さい。

$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld

PostgreSQLをインストール

RHEL9のレポジトリの設定に成功していれば以下のようにリストが表示されます。
パッケージ名にバージョン番号が記載されていないので
listコマンドで調べた所13であることがわかります。
今回はRHEL9のパッケージからインストールを行います。

公式のPostgreSQLにて既にRHEL9のレポジトリが提供されております。
RHEL9のApplication Streams Life Cycleが公開された後、どちらを選択するか検討下さい。
公式のPostgreSQLインストールは下記の手順を参考に両サーバにインストールします
https://yum.postgresql.org/

$ sudo dnf search postgresql
サブスクリプション管理リポジトリーを更新しています。
メタデータの期限切れの最終確認: 0:06:43 時間前の 2022年03月23日 14時32分59秒 に実施しました。
========================= 名前 & 概要 一致: postgresql =========================
postgresql.x86_64 : PostgreSQL client programs
pcp-pmda-postgresql.x86_64 : Performance Co-Pilot (PCP) metrics for PostgreSQL
postgresql-contrib.x86_64 : Extension modules distributed with PostgreSQL
postgresql-jdbc.noarch : JDBC driver for PostgreSQL
postgresql-odbc.x86_64 : PostgreSQL ODBC driver
postgresql-plperl.x86_64 : The Perl procedural language for PostgreSQL
postgresql-plpython3.x86_64 : The Python3 procedural language for PostgreSQL
postgresql-pltcl.x86_64 : The Tcl procedural language for PostgreSQL
postgresql-private-libs.x86_64 : The shared libraries required only for this
                               : build of PostgreSQL server
postgresql-server.x86_64 : The programs needed to create and run a PostgreSQL
                         : server
postgresql-upgrade.x86_64 : Support for upgrading from the previous major
                          : release of PostgreSQL
qt5-qtbase-postgresql.x86_64 : PostgreSQL driver for Qt5's SQL classes
qt5-qtbase-postgresql.i686 : PostgreSQL driver for Qt5's SQL classes
============================ 概要 一致: postgresql =============================
apr-util-pgsql.x86_64 : APR utility library PostgreSQL DBD driver
libpgtypes.x86_64 : Map PostgreSQL database types to C equivalents
libpgtypes.i686 : Map PostgreSQL database types to C equivalents
libpq.x86_64 : PostgreSQL client library
libpq.i686 : PostgreSQL client library
libpq-devel.i686 : Development files for building PostgreSQL client tools
libpq-devel.x86_64 : Development files for building PostgreSQL client tools
perl-DBD-Pg.x86_64 : A PostgreSQL interface for Perl
pg_repack.x86_64 : Reorganize tables in PostgreSQL databases without any locks
pgaudit.x86_64 : PostgreSQL Audit Extension
php-pgsql.x86_64 : A PostgreSQL database module for PHP
postfix-pgsql.x86_64 : Postfix PostgreSQL map support
postgres-decoderbufs.x86_64 : PostgreSQL Protocol Buffers logical decoder plugin
python3-psycopg2.x86_64 : A PostgreSQL database adapter for Python 3
rubygem-pg.x86_64 : A Ruby interface to the PostgreSQL RDBMS

$ dnf list postgresql.x86_64
利用可能なパッケージ
postgresql.x86_64        13.5-1.el9        rhel-9-for-x86_64-appstream-beta-rpms

$ sudo dnf -y install postgresql-server

PostgreSQLを構築

PostgreSQLをインストールし、初期化と起動を行います。

$ sudo  postgresql-setup --initdb
 * Initializing database in '/var/lib/pgsql/data'
 * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log


$ sudo systemctl start postgresql

pg_hba.confはこうなっております。

$ sudo cat /var/lib/pgsql/data/pg_hba.conf
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            ident
host    replication     all             ::1/128                 ident

論理レプリケーションの構築(起動まで)

全サーバに論理レプリケーション用の設定をします。

$ sudo vi /var/lib/pgsql/data/postgresql.conf
---
wal_level = logical
listen_addresses = '*'
password_encryption = scram-sha-256  #レプリケーションには本来不要
---

pg_hbaを設定します。

環境に合わせて設定を変更して下さい。

$ sudo vi /var/lib/pgsql/data/pg_hba.conf
---
local   all             replica                                 scram-sha-256
host    all             replica         192.168.0.0/16          scram-sha-256
host    all             replica         172.16.0.0/12           scram-sha-256
host    all             replica         10.0.0.0/8              scram-sha-256
---

PostgreSQLを再起動します。

$ sudo systemctl restart postgresql

論理レプリケーションの構築(コマンド投入)

パブリケーション(マスター)のPostgreSQLにログインします。
また、パラメータを確認します。

$ sudo su - postgres
$ psql
psql (13.5)
"help"でヘルプを表示します。

postgres# show wal_level;
postgres# show max_wal_senders;
postgres# show max_replication_slots;
postgres# show synchronous_commit;
postgres# show password_encryption;

サブスクリプション(スレーブ)のPostgreSQLにログインします。
また、パラメータを確認します。

$ sudo su - postgres
$ psql
psql (13.5)
"help"でヘルプを表示します。

postgres# show max_replication_slots;
postgres# show max_logical_replication_workers;
postgres# show max_worker_processes;

パブリケーション(マスター)の設定とテーブルを作成します。

postgres=# CREATE ROLE replica WITH ENCRYPTED PASSWORD 'password' LOGIN REPLICATION SUPERUSER;
CREATE ROLE
postgres=# create table japan ( id serial primary key, pref text, city text );
CREATE TABLE
postgres=# CREATE PUBLICATION "logical_pub" FOR TABLE japan;
CREATE PUBLICATION
postgres=# \dRp
                                                 パブリケーション一覧
    名前     |  所有者  | 全テーブル | Insert文 | Update文 | Delete文 | Truncate文 | 最上位パーティションテーブル経由
-------------+----------+------------+----------+----------+----------+------------+----------------------------------
 logical_pub | postgres | f          | t        | t        | t        | t          | f
(1 行)
postgres=# select * from pg_publication_tables;
   pubname   | schemaname | tablename
-------------+------------+-----------
 logical_pub | public     | japan
(1 行)
postgres=# INSERT INTO japan
  ( pref , city )
VALUES
  ( '東京都', '八王子市' ),
  ( '東京都', '立川市' ),
  ( '東京都', '武蔵野市' ),
  ( '東京都', '三鷹市' ),
  ( '東京都', '青梅市' ),
  ( '東京都', '府中市' ),
  ( '東京都', '昭島市' ),
  ( '東京都', '調布市' ),
  ( '東京都', '小金井市' ),
  ( '東京都', '小平市' ),
  ( '東京都', '日野市' ),
  ( '東京都', '東村山市' ),
  ( '東京都', '国分寺市' ),
  ( '東京都', '国立市' ),
  ( '東京都', '福生市' ),
  ( '東京都', '狛江市' ),
  ( '東京都', '東大和市' ),
  ( '東京都', '清瀬市' ),
  ( '東京都', '東久留米市' ),
  ( '東京都', '武蔵村山市' ),
  ( '東京都', '多摩市' ),
  ( '東京都', '稲城市' ),
  ( '東京都', '羽村市' ),
  ( '東京都', 'あきる野市' ),
  ( '東京都', '西東京都市' );
INSERT 0 25

パプリケーション(スレーブ)の設定を作成します。
logical_sub1の部分は重複できないので番号をずらして下さい。
pg_subscriptionでパスワードが表示されますがドキュメントに説明があります
https://www.postgresql.jp/document/10/html/catalog-pg-subscription.html

(残りのサーバの2台にて)
postgres=# CREATE SUBSCRIPTION "logical_sub1" CONNECTION 'hostaddr=192.168.0.159 port=5432 user=replica password=password dbname=postgres' publication "logical_pub";
NOTICE:  発行サーバでレプリケーションスロット"logical_sub1"を作成しました
CREATE SUBSCRIPTION
postgres=# SELECT * FROM pg_subscription;    
  oid  | subdbid |   subname    | subowner | subenabled |                                   subconninfo                                   | subslotname  | subsynccommit |
subpublications
-------+---------+--------------+----------+------------+---------------------------------------------------------------------------------+--------------+---------------+-
----------------
 16401 |   13447 | logical_sub1 |       10 | t          | hostaddr=192.168.0.159 port=5432 user=replica password=password dbname=postgres | logical_sub1 | off           |
{logical_pub}
(1 行)

パプリケーション(スレーブ)にコピーされていることを確認します。
/
postgres=# 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 行)

あとがき

今回はPostgreSQLのインストールと論理レプリケーションについて記載しました。

次回はRedisのクラスタを構築します。


ここまでお読みいただき、ありがとうございました!