こんにちは、SAKURUGのKeitaです。
今回は以前書いた記事、「Citusの推奨replica設定が変わった話」という記事で出たストリーミングレプリケーションについて解説していこうと思います。
1.ストリーミングレプリケーションの特徴・概要について
2.ストリーミングレプリケーションの構築方法について
上記について解説していこうと思います。
ストリーミングレプリケーションはPostgreSQL 9.0から追加されたレプリケーション機能です。
ストリーミングレプリケーションはWrite‐Ahead Log(WAL)をリアルタイムにStandbyサーバーへ転送し、ほぼ瞬時にデータを同期する仕組みです。
これにより、高可用性の確保や読み取りの負荷分散などの実現が可能となっています。
基本的なイメージ図は以下になります。
図1
またストリーミングレプリケーションを用いてデータを同期しておくことで、もしPrimaryがダウンしてしまってもStanbyをPrimaryに昇格することで、
ダウンタイムを大幅に減らせるメリットがあります。
ただし注意が必要な点として、ストリーミングレプリケーション自体は自動フェイルオーバーを有していません。
つまりOSSなど外部のクラスタリングツールを用いるか、独自に作成する必要性があることには注意してください。
ストリーミングレプリケーションはPrimary・StanbyをWALストリームを用いてWALを連携することで実現しています。
●Primary
クライアントからの読み書きを受け付け、WALを生成・送信する役割を担うインスタンス。
●Standby
Primaryから受け取ったWALを再生し、データを追従する。読み取り専用クエリの処理先としても利用可能なインスタンス。
●WALストリーム
TCPソケットを介してWALレコードをリアルタイムに送信する。WALファイル丸ごとの転送(WALアーカイブ方式)に比べ、遅延を最小化できます。
ここからは実際にストリーミングレプリケーションを用いたpostgresqlの構築方法を解説していきます。
まずはPrimaryの構築から行っていきます。
initdb -D /var/lib/pgsql/data
下記設定は接続を受け付けるサーバーの設定です。
デフォルトではローカルホストからの接続のみ受け付けるようになっています。
今回は全てのサーバーを対象としていますが実際に本番環境など、セキュリティが重要な環境では特定のサーバーのみを指定してください。
vi /var/lib/pgsql/data/postgresql.conf
listen_addresses = '*'
こちらも接続するための設定なのですが、違うのは誰がどのように接続するのかを定義するものです。
左から接続プロトコル、接続タイプ、ユーザ名、接続元IPアドレス、認証方法となっています。
今回の場合だと下記になります。
TCP/IP接続、レプリケーション接続、replicaユーザ、IP、認証無し
TCP/IP接続、すべての方法、すべてのユーザ、IP、認証無し
今回は検証用なのでtrustとしていますが、本番環境などセキュリティ対策必須の環境では必ずscram-sha-256などを利用してください。
vi /var/lib/pgsql/data/pg_hba.conf
# レプリケーション用接続許可
host replication replica IP/32 trust
host all all IP/24 trust
まずはユーザ作成するためにpostgresqlの起動が必要なので起動します。
pg_ctl -D /var/lib/pgsql/data start
次にユーザの作成を行います。
ここでは先ほどpg_hba.confにて設定したユーザ名のユーザを作成してください。
psql
CREATE USER replica WITH REPLICATION ENCRYPTED PASSWORD 'replica_password';
これでPrimary側の必要設定は完了です、次にStandbyの構築に移りましょう。
Primaryのデータベースをバックアップとして取得するコマンドです。
またこの際に-Rを使用することで、standby.signalというファイルが作成されますこれはこのデータベースがStandbyなのかを判断するために使用します。
pg_basebackup -h PrimaryのIP -D /var/lib/pgsql/data -U replica -R
ls -la /var/lib/pgsql/data/standby.signal
vi /var/lib/pgsql/data/postgresql.conf
以下内容であることを確認してください。
listen_addresses = '*'
port = 5432
hot_standby = on
primary_conninfo = 'host=PrimaryのIP port=5432 user=replica application_name=standby1'
最後にStandbyも起動して完了です。
pg_ctl -D /var/lib/pgsql/data -l /var/lib/pgsql/logfile start
-- テストテーブル作成
CREATE TABLE test_table (
id SERIAL PRIMARY KEY,
name VARCHAR(50),
created_at TIMESTAMP DEFAULT NOW()
);
-- データ挿入
INSERT INTO test_table (name) VALUES ('test1'), ('test2'), ('test3');
SELECT * FROM test_table;
以下内容が確認できるはずです。
-- id | name | created_at
-- ----+-------+----------------------------
-- 1 | test1 | 2025-09-02 15:30:45.123456
-- 2 | test2 | 2025-09-02 15:30:45.123456
-- 3 | test3 | 2025-09-02 15:30:45.123456
SELECT * FROM test_table;
以下内容が確認できるはずです。
-- id | name | created_at
-- ----+-------+----------------------------
-- 1 | test1 | 2025-09-02 15:30:45.123456
-- 2 | test2 | 2025-09-02 15:30:45.123456
-- 3 | test3 | 2025-09-02 15:30:45.123456
以上です。
今回は珍しく構築方法などを解説してみましたがいかがでしたか?
今回は最低限の設定方法などを開設したので実際に構築する際にはこれをベースに必須の設定などを参照しながら構築してみてください。
またportを変更すれば同一サーバーでも行うことは可能です。(それだとHAになっていない気もしますが。)
カジュアル面談では、会社の雰囲気や仕事内容についてざっくばらんにお話ししています。
履歴書は不要、服装自由、原則オンラインです。興味を持っていただけた方は、
ぜひ以下からお申し込みください。
皆さんにお会いできることをサクラグメンバー一同、心より楽しみにしております!
カジュアル面談応募フォーム