PostgreSQL · 2 min read · Nov 30, 2025

Ubuntu 16.04でのPostgreSQL 9.6のマスター-スレーブレプリケーションの設定方法

PostgreSQLまたはPostgresは、15年以上のアクティブな開発を持つオープンソースのオブジェクトリレーショナルデータベース管理システム(ORDBMS)です。強力なデータベースサーバーであり、高い負荷を処理できます。PostgreSQLはLinux、Unix、BSD、Windowsサーバーで使用できます。

マスター/スレーブデータベースレプリケーションは、1つのサーバー(マスター)のデータベースから別のサーバー(スレーブ)のデータベースにデータをコピー(同期)するプロセスです。このプロセスの主な利点は、データベースを複数のマシンに分散させることで、マスターサーバーに問題が発生した場合でも、同じデータを持つバックアップマシンがリクエストを中断することなく処理できることです。

PostgreSQLは、データベースをレプリケートするためのいくつかの方法を提供しています。バックアップ目的や高可用性データベースサーバーを提供するために使用できます。このチュートリアルでは、Ubuntu 16.04サーバーにPostgreSQL 9.6のマスター-スレーブレプリケーションをインストールおよび構成する方法を示します。ホットスタンバイモードを使用し、PostgreSQLを深く学ぶための非常に良い出発点です。

私たちが行うこと:

  1. PostgreSQL 9.6をインストールします。
  2. UFWファイアウォールを構成します。
  3. マスターサーバーを構成します。
  4. スレーブサーバーを構成します。
  5. マスターからスレーブにPostgreSQLデータをコピーします。
  6. テストします。

前提条件:

  • 1つのUbuntu 16.04サーバー - マスター - 読み取りおよび書き込みを許可 - IP: 10.0.15.10
  • 1つのUbuntu 16.04サーバー - スレーブ - 読み取りのみ - IP: 10.0.15.11
  • ルート権限

ステップ1 - PostgreSQL 9.6をインストール

このチュートリアルでは、PostgreSQL 9.6の最新バージョンをインストールします。公式のUbuntuリポジトリではPostgreSQL 9.5のみが提供されているため、PostgreSQLリポジトリから直接最新バージョンをインストールする必要があります。

postgreSQL 9.6リポジトリをsources.list.dディレクトリに追加します。

echo 'deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main' | tee /etc/apt/sources.list.d/postgresql.list

そして、PostgreSQL署名キーをシステムにインポートします。

wget -q https://www.postgresql.org/media/keys/ACCC4CF8.asc -O - | sudo apt-key add -

次に、aptコマンドでシステムリポジトリを更新します。

apt-get update

次に、以下のaptコマンドでPosgreSQL 9.6パッケージをインストールします。

apt-get install -y postgresql-9.6 postgresql-contrib-9.6

インストールが完了したら、起動時に自動的に開始するように追加します。

systemctl enable postgresql

デフォルトでは、PostgreSQLはUbuntuのローカルホスト(127.0.0.1)IPアドレスでポート5432で実行されています。netstatコマンドで確認します。

netstat -plntu

Postgresが実行中か確認

PostgreSQL 9.6がシステムで実行されています。次のステップでは、postgresユーザーのパスワードを構成する必要があります。

ルートアカウントから、suコマンドでpostgresユーザーにログインし、postgresフロントエンドターミナルpsqlにアクセスします。

su - postgres  
psql

postgresユーザーのパスワードを変更し、以下のpostgresクエリで接続情報を確認してください。

\password postgres  
\conninfo

Postgresパスワードを変更

PostgreSQL 9.6がシステムにインストールされ、エラーなく実行されており、postgresユーザーのパスワードが更新されました。

ステップ2 - UFWファイアウォールを構成

UFWまたはUncomplicated Firewallは、Ubuntu上のiptablesベースのファイアウォールを管理するアプリケーションです。UFWはUbuntu Linuxのデフォルトのファイアウォール構成ツールであり、ファイアウォールを構成するためのユーザーフレンドリーな方法を提供します。

aptコマンドでメインのUbuntuリポジトリからufwをインストールできます。

apt-get install -y ufw

新しいサービスをUFWファイアウォールに追加します:以下のコマンドでSSHおよびPostgreSQLサービスを追加します。

ufw allow ssh  
ufw allow postgresql

UFWファイアウォールを有効にし、ステータスを確認します。

ufw enable  
ufw status

UFWファイアウォールをインストールして確認

UFWファイアウォールがインストールされ、PostgreSQLサービスが追加されました。

注意:

ステップ1とステップ2をマスターおよびスレーブサーバーで実行します。

ステップ3 - PostgreSQLマスターサーバーを構成

マスターサーバーのIPアドレスは10.0.15.10で、postgresサービスはそのIPでデフォルトポートで実行されます。マスターサーバーはデータベースへの読み取りおよび書き込みの権限を持ち、スレーブサーバーへのストリーミングレプリケーションを実行します。

Postgres構成ディレクトリ ‘/etc/postgresql/9.6/main ‘に移動し、vimでpostgresql.confファイルを編集します。

cd /etc/postgresql/9.6/main/  
vim postgresql.conf

‘lisen_addresses’行のコメントを外し、値をマスターサーバーのIPアドレス ‘10.0.15.10 ‘に変更します。

listen_addresses = '10.0.15.10'

‘wal_level’行のコメントを外し、値を ‘hot_standby ‘に変更します。

wal_level = hot_standby

同期レベルにはローカル同期を使用します。コメントを外し、以下のように値を変更します。

synchronous_commit = local

アーカイブモードを有効にし、archive_commandオプションをコマンド ‘cp %p /var/lib/postgresql/9.6/main/archive/%f’に変更します。

archive_mode = on  
archive_command = 'cp %p /var/lib/postgresql/9.6/main/archive/%f'

‘レプリケーション’設定では、このチュートリアルでは2台のサーバー、マスターとスレーブのみを使用します。’ wal_sender ‘行のコメントを外し、値を2に変更し、’ wal_keep_segments ‘の値を10にします。

max_wal_senders = 2  
wal_keep_segments = 10

アプリケーション名については、’synchronous_standby_names’行のコメントを外し、値を名前 ‘pgslave001 ‘に変更します。

synchronous_standby_names = 'pgslave001'

ファイルを保存してエディタを終了します。

postgresql.confファイルではアーカイブモードが有効になっているため、新しいアーカイブ用のディレクトリを作成する必要があります。新しいアーカイブディレクトリを作成し、権限を変更し、postgresユーザーに所有権を変更します。

mkdir -p /var/lib/postgresql/9.6/main/archive/  
chmod 700 /var/lib/postgresql/9.6/main/archive/  
chown -R postgres:postgres /var/lib/postgresql/9.6/main/archive/

次に、認証構成のためにpg_hba.confファイルを編集します。

vim pg_hba.conf

以下の構成を行の最後に貼り付けます。

# ローカルホスト  
host    replication     replica          127.0.0.1/32            md5  
   
# PostgreSQLマスターIPアドレス  
host    replication     replica          10.0.15.10/32            md5  
   
# PostgreSQLスレーブIPアドレス  
host    replication     replica          10.0.15.11/32            md5

保存して終了し、PostgreSQLを再起動します。

systemctl restart postgresql

PostgreSQLはIPアドレス10.0.15.10で実行されています。netstatコマンドで確認します。

netstat -plntu

Postgresレプリケーションを構成

次に、レプリケーション用の新しいユーザーを作成します。’ replica ‘という名前の新しいユーザーをパスワード ‘ aqwe123@ ‘で作成します。ここで安全なパスワードを選択してください!postgresユーザーにログインし、postgresフロントエンドターミナルpsqlにアクセスします。

su - postgres  
psql

以下のpostgresクエリでパスワード ‘ aqwe123@ ‘を持つ新しい ‘ replica ‘ユーザーを作成します。

CREATE USER replica REPLICATION LOGIN ENCRYPTED PASSWORD 'aqwe123@';

新しいユーザーを’ du ‘クエリで確認し、レプリケーション権限を持つreplicaユーザーが表示されます。

\du

Postgresレプリケーションユーザーを作成

マスターサーバーの構成が完了しました。

ステップ4 - スレーブサーバーを構成

スレーブサーバーのIPアドレスは10.0.15.11です。このサーバーはデータベースへの読み取り権限のみを持ちます。Postgresデータベースサーバーは、ローカルホストIPではなく、サーバーのIPアドレスで実行されます。

以下のsystemctlコマンドでスレーブサーバーのpostgresサービスを停止します。

systemctl stop postgresql

Postgres構成ディレクトリ ‘/etc/postgresql/9.6/main ‘に移動し、構成ファイル ‘postgresql.conf ‘を編集します。

cd /etc/postgresql/9.6/main/  
vim postgresql.conf

listen_addresses行のコメントを外し、値をスレーブサーバーのIPアドレス10.0.15.11に置き換えます。

listen_addresses = '10.0.15.11'

‘wal_level’行のコメントを外し、値を ‘hot_standby ‘に変更します。

wal_level = hot_standby

同期レベルについては、synchronous_commit行のコメントを外し、以下のように値を変更します。

synchronous_commit = local

レプリケーション設定については、max_wal_senders行のコメントを外し、値を ‘2 ‘に置き換えます。2台のサーバーを使用するためです。そして、wal_keep_segmentsの値を ‘10 ‘に変更します。

max_wal_senders = 2  
wal_keep_segments = 10

アプリケーション名のために、synchronous_standby_names行のコメントを外し、値を名前 ‘pgslave001 ‘に変更します。

synchronous_standby_names = 'pgslave001'

スレーブサーバーのためにhot_standbyを有効にするために、以下の行のコメントを外し、値を ‘on ‘に変更します。

hot_standby = on

ファイルを保存してエディタを終了します。

ステップ5 - マスターからスレーブにPostgreSQLデータをコピー

次に、スレーブサーバーのpostgresメインディレクトリをマスターサーバーのメインデータディレクトリで置き換えたいと思います。

スレーブサーバーにログインし、postgresユーザーにアクセスします。

su - postgres

postgresデータディレクトリ ‘main ‘に移動し、ディレクトリ名を変更してバックアップします。

cd 9.6/  
mv main main-bekup

新しい ‘main ‘ディレクトリを’ postgres ‘ユーザーとして作成し、main-bekupディレクトリと同じ権限を持つことを確認します。

mkdir main/  
chmod 700 main/

次に、pg_basebackupコマンドを使用して、マスターサーバーからスレーブサーバーにメインディレクトリをコピーします。レプリカユーザーを使用してこのデータコピーを実行します。

pg_basebackup -h 10.0.15.10 -U replica -D /var/lib/postgresql/9.6/main -P --xlog  
Password:

データ転送が完了したら、メインデータディレクトリに移動し、新しいrecovery.confファイルを作成します。

cd /var/lib/postgresql/9.6/main/  
vim recovery.conf

以下の構成を貼り付けます。

standby_mode = 'on'  
primary_conninfo = 'host=10.0.15.10 port=5432 user=replica password=aqwe123@ application_name=pgslave001'  
restore_command = 'cp /var/lib/postgresql/9.6/main/archive/%f %p'  
trigger_file = '/tmp/postgresql.trigger.5432'

保存して終了し、chmodでファイルの権限を600に変更します。

chmod 600 recovery.conf

Postgresスレーブサーバーの設定

今、スレーブサーバーでPostgreSQL 9.6を起動し、netstatでpostgresサービスがIPアドレス10.0.15.11で実行されていることを確認します。

systemctl start postgresql  
netstat -plntu

データ転送とスレーブサーバーの構成が完了しました。

ステップ6 - テスト

テストのために、PostgreSQL 9.6のレプリケーションステータスを確認し、マスターサーバーで新しいテーブルを作成し、スレーブサーバーからすべてのデータを確認します。

マスターサーバーにログインし、postgresユーザーにログインします。

su - postgres

以下のpsqlコマンドを実行してレプリケーションステータスを確認します。

psql -c "select application_name, state, sync_priority, sync_state from pg_stat_replication;"  
psql -x -c "select * from pg_stat_replication;"

以下のような結果が得られます。

Postgresレプリケーションステータスを確認

次に、マスターサーバーから新しいテーブルを作成してみます。マスターサーバーのpostgresユーザーにログインします。

su - postgres  
psql

そして、以下のpostgresクエリを実行して、’ replica_test ‘という名前の新しいテーブルを作成し、データを挿入します。

CREATE TABLE replica_test (hakase varchar(100));  
INSERT INTO replica_test VALUES ('howtoforge.com');  
INSERT INTO replica_test VALUES ('This is from Master');  
INSERT INTO replica_test VALUES ('pg replication by hakase-labs');

テストデータを追加

次に、スレーブサーバーのpostgresユーザーにログインし、psqlターミナルにアクセスします。

su - postgres  
psql

以下のpostgresクエリで’ replica_test ‘テーブルのデータを確認します。

select * from replica_test;

そして、マスターと同じデータが得られます。これはマスターサーバーからスレーブサーバーにレプリケートされたものです。

データレプリケーションを確認

追加テスト:

以下のクエリでスレーブサーバーに書き込むテストを行います。

INSERT INTO replica_test VALUES ('this is SLAVE');

そして、スレーブサーバーで’ Cannot execute INSERT ‘クエリに関するエラーメッセージが表示されます。

Ubuntu 16.04 Xenial XerusでのPostgreSQL 9.6のインストールとマスター-スレーブレプリケーションの構成は成功しました。

参考

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。