SAKURUG TECHBLOG

postgreSQLのストリーミングレプリケーションについて

timestampauthor-name
Keita

はじめに

こんにちは、SAKURUGのKeitaです。
今回は以前書いた記事、「Citusの推奨replica設定が変わった話」という記事で出たストリーミングレプリケーションについて解説していこうと思います。

本記事で話す内容

1.ストリーミングレプリケーションの特徴・概要について

2.ストリーミングレプリケーションの構築方法について

上記について解説していこうと思います。

1.ストリーミングレプリケーションの特徴・概要について

ストリーミングレプリケーションは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アーカイブ方式)に比べ、遅延を最小化できます。

2.ストリーミングレプリケーションの構築方法について

ここからは実際にストリーミングレプリケーションを用いたpostgresqlの構築方法を解説していきます。

2-1.Primaryの構築

まずはPrimaryの構築から行っていきます。

●データベースクラスタの作成

initdb -D /var/lib/pgsql/data

●postgresql.conf の設定

下記設定は接続を受け付けるサーバーの設定です。

デフォルトではローカルホストからの接続のみ受け付けるようになっています。

今回は全てのサーバーを対象としていますが実際に本番環境など、セキュリティが重要な環境では特定のサーバーのみを指定してください。

vi /var/lib/pgsql/data/postgresql.conf

listen_addresses = '*'

●pg_hba.conf の設定

こちらも接続するための設定なのですが、違うのは誰がどのように接続するのかを定義するものです。

左から接続プロトコル、接続タイプ、ユーザ名、接続元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の構築に移りましょう。

2-2.Standbyの構築

●ベースバックアップの取得

Primaryのデータベースをバックアップとして取得するコマンドです。

またこの際に-Rを使用することで、standby.signalというファイルが作成されますこれはこのデータベースがStandbyなのかを判断するために使用します。

pg_basebackup -h PrimaryのIP -D /var/lib/pgsql/data -U replica -R

●standby.signal ファイルの確認

ls -la /var/lib/pgsql/data/standby.signal

●postgresql.conf の設定確認・変更

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'

●PostgreSQL起動

最後にStandbyも起動して完了です。

pg_ctl -D /var/lib/pgsql/data -l /var/lib/pgsql/logfile start

2-3.動作確認

●Primaryサーバでデータ投入

-- テストテーブル作成

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

●Secondaryサーバでデータ確認

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になっていない気もしますが。)

▼高校生向けインターン実施中!

弊社では高校生向けにインターンを行っております!
現役エンジニア指導の下、一緒に働いてみませんか?

高校生インターン応募フォーム

▼カジュアル面談実施中!

カジュアル面談では、会社の雰囲気や仕事内容についてざっくばらんにお話ししています。
履歴書は不要、服装自由、原則オンラインです。興味を持っていただけた方は、
ぜひ以下からお申し込みください。

皆さんにお会いできることをサクラグメンバー一同、心より楽しみにしております!

カジュアル面談応募フォーム

記事をシェアする

ABOUT ME

author-image
Keita
準備中です