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を深く学ぶための非常に良い出発点です。
私たちが行うこと:
- PostgreSQL 9.6をインストールします。
- UFWファイアウォールを構成します。
- マスターサーバーを構成します。
- スレーブサーバーを構成します。
- マスターからスレーブにPostgreSQLデータをコピーします。
- テストします。
前提条件:
- 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
PostgreSQL 9.6がシステムで実行されています。次のステップでは、postgresユーザーのパスワードを構成する必要があります。
ルートアカウントから、suコマンドでpostgresユーザーにログインし、postgresフロントエンドターミナルpsqlにアクセスします。
su - postgres
psqlpostgresユーザーのパスワードを変更し、以下のpostgresクエリで接続情報を確認してください。
\password postgres
\conninfo
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 postgresqlUFWファイアウォールを有効にし、ステータスを確認します。
ufw enable
ufw status
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 postgresqlPostgreSQLはIPアドレス10.0.15.10で実行されています。netstatコマンドで確認します。
netstat -plntu
次に、レプリケーション用の新しいユーザーを作成します。’ replica ‘という名前の新しいユーザーをパスワード ‘ aqwe123@ ‘で作成します。ここで安全なパスワードを選択してください!postgresユーザーにログインし、postgresフロントエンドターミナルpsqlにアクセスします。
su - postgres
psql以下のpostgresクエリでパスワード ‘ aqwe123@ ‘を持つ新しい ‘ replica ‘ユーザーを作成します。
CREATE USER replica REPLICATION LOGIN ENCRYPTED PASSWORD 'aqwe123@';新しいユーザーを’ du ‘クエリで確認し、レプリケーション権限を持つreplicaユーザーが表示されます。
\du
マスターサーバーの構成が完了しました。
ステップ4 - スレーブサーバーを構成
スレーブサーバーのIPアドレスは10.0.15.11です。このサーバーはデータベースへの読み取り権限のみを持ちます。Postgresデータベースサーバーは、ローカルホストIPではなく、サーバーのIPアドレスで実行されます。
以下のsystemctlコマンドでスレーブサーバーのpostgresサービスを停止します。
systemctl stop postgresqlPostgres構成ディレクトリ ‘/etc/postgresql/9.6/main ‘に移動し、構成ファイル ‘postgresql.conf ‘を編集します。
cd /etc/postgresql/9.6/main/
vim postgresql.conflisten_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 - postgrespostgresデータディレクトリ ‘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
今、スレーブサーバーで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ユーザーにログインします。
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のインストールとマスター-スレーブレプリケーションの構成は成功しました。
参考
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。