同期セカンダリデータベースサーバーの設定¶
AdvancedServerJDBCコネクターは、表5-2に示されているように、 targetServerType 接続プロパティーの preferSyncSecondary オプションをサポートしています。
注釈
The targetServerType values slave, preferSlave, and
preferSyncSlave all provide the same corresponding set of functionality
as the secondary, preferSecondary, and preferSyncSecondary values;
the slave values have been deprecated. We advise you to use the
secondary values.
preferSyncSecondary オプションは、フェイルオーバー接続用の同期スタンバイサーバーを優先するため、非同期サーバーを無視します。
接続URLでのこの機能の仕様は、次の構文で示されます。
jdbc:edb://master:port,secondary_1:port_1,secondary_2:port_2,.../
database?targetServerType=preferSyncSecondary
パラメータ
master:port
マスターデータベースサーバーに割り当てられたIPアドレスまたは名前の後にポート番号が続きます。 master が名前の場合、Javaプログラムを実行しているホスト上の /etc/hosts ファイルでIPアドレスとともに指定する必要があります。注: マスターデータベースサーバーは、リスト内の任意の場所で指定できます。セカンダリデータベースサーバーの前に置く必要はありません。
secondary_n:port_n
スタンバイのセカンダリデータベースサーバーに割り当てられたIPアドレスまたは名前の後にポート番号が続きます。 secondary_n が名前の場合、Javaプログラムを実行しているホスト上の /etc/hosts ファイルでIPアドレスとともに指定する必要があります。
database
接続先のデータベースの名前。
以下は、接続URLの例です。
String url = "jdbc:edb://master:5300,secondary1:5400/edb?targetServerType=preferSyncSecondary";
con = DriverManager.getConnection(url, "enterprisedb", "edb");
以下の特性が preferSyncSecondary オプションに適用されます:
マスターデータベースサーバーは、接続リストの任意の場所で指定できます。
Javaプログラムで使用するためにデータベースにアクセスするための接続は、同期セカンダリで最初に試行されます。セカンダリサーバーは読み取り専用操作に使用できます。
非同期モードで実行されているサーバーへの接続は試行されません。
接続試行が行われる順序は、表5-2で説明されている
loadBalanceHosts接続プロパティによって決定されます。デフォルト設定である無効にすると、接続リストで指定された左から右の順に接続が試行されます。有効にすると、接続の試行がランダムに行われます。同期セカンダリに接続できない場合、マスターデータベースサーバーへの接続が使用されます。マスターデータベースサーバーがアクティブでない場合、接続の試行は失敗します。
preferSyncSecondary オプションに使用される同期セカンダリは、ホットスタンバイで使用するように構成する必要があります。
次のセクションでは、ホットスタンバイ、同期レプリケーション用のマスターデータベースサーバーとセカンダリデータベースサーバーのセットアップの概要を簡単に説明します。
マスターおよびセカンダリデータベースサーバーの構成の概要¶
マスターデータベースサーバーとセカンダリデータベースサーバーを構成するプロセスは、PostgreSQLのドキュメントで説明されています。
For general information on hot standby usage, which is needed for the
preferSyncSecondary option, see the PostgreSQL core documentation.
マスターからセカンダリデータベースサーバーのベースバックアップを作成する方法については、セクション25.3.2、*ベースバックアップの作成*(pg_basebackupユーティリティプログラムの使用方法について説明)またはセクション25.3.3、*ベースバックアップの作成``ThePostgreSQLCoreDocumentation<https://www.postgresql.org/docs/12/static/continuous-archiving.html>``のセクション25.3*ContinuousArchivingandPoint-in-TimeRecovery(PITR)*内の低レベルAPI*`_。
ホットスタンバイで使用するために設定する必要がある設定パラメーターについては、``セクション19.6、レプリケーション<https://www.postgresql.org/docs/12/static/runtime-config-replication.html>`_``を参照してください。
次のセクションでは、マスターデータベースサーバーとセカンダリデータベースサーバーをセットアップする基本的な例を示します。
例:マスターおよびセカンダリデータベースサーバー¶
次の例では、次のとおりです。
マスターデータベースサーバーはホスト
192.168.2.24、ポート5444にありますセカンダリデータベースサーバーの名前は
secondary1で、ホスト192.168.2.22、ポート5445に存在しますセカンダリデータベースサーバーの名前は
secondary2であり、ホスト192.162.2.24、ポート5446にあります(マスターと同じホスト)
マスターデータベースサーバーの pg_hba.conf ファイルには、すべてのセカンダリデータベースサーバーの一意のレプリケーションデータベース USER/ADDRESS の組み合わせごとにレプリケーションエントリが必要です。次の例では、データベーススーパーユーザー enterprisedb が、 192.168.2.22 上の secondary1 データベースサーバーと、ローカルにある secondary2 データベースサーバーの両方のレプリケーションデータベースユーザーとして使用されます。マスター。
# TYPE DATABASE USER ADDRESS METHOD
host replication enterprisedb 192.168.2.22/32 md5
host replication enterprisedb 127.0.0.1/32 md5
マスターデータベースサーバーが pg_hba.conf ファイルとともに postgresql.conf ファイルで設定された後、データベースサーバー secondary1 は``のホスト 192.168.2.22 で次のコマンドを呼び出して作成されます2'':
su – enterprisedb
Password:
-bash-4.1$ pg_basebackup -D /opt/secondary1 -h 192.168.2.24 -p 5444 -Fp -R -X stream -l 'Secondary1'
セカンダリデータベースサーバー /opt/secondary1 では、 recovery.conf ファイルがデータベースクラスターに生成されます。これは、 primary_conninfo の一部として application_name=secondary1 設定を追加することにより、次の例で編集されています`` pg_basebackup によって自動的に生成される他の不要なオプションの一部の文字列と削除。 standby_mode = 'on' パラメーターの使用にも注意してください。
standby_mode = 'on'
primary_conninfo = 'user=enterprisedb password=password host=192.168.2.24 port=5444 application_name=secondary1'
アプリケーション名 secondary1 は、マスターデータベースサーバーの postgresql.conf ファイルの synchronous_standby_names パラメーターに含める必要があります。
セカンダリデータベースサーバー( secondary2 )は、マスターが使用する同じホスト上に別の方法で作成されます。
su - enterprisedb
Password:
-bash-4.1$ psql -d edb -c "SELECT pg_start_backup('Secondary2')"
Password:
pg_start_backup
-----------------
0/6000028
(1 row)
-bash-4.1$ cp -rp /var/lib/edb/as12/data/opt/secondary2
-bash-4.1$ psql -d edb -c "SELECT pg_stop_backup()"
Password:
NOTICE: pg_stop_backup complete, all required WAL segments have been archived
pg_stop_backup
----------------
0/6000130
(1 row)
セカンダリデータベースサーバー /opt/secondary2 で、データベースクラスターに recovery.conf ファイルを作成します。次の例に示すように、 primary_conninfo 文字列の一部として application_name=secondary2 設定に注意してください。また、 standby_mode = 'on' パラメータを必ず含めてください。
standby_mode = 'on'
primary_conninfo = 'user=enterprisedb password=password host=localhost port=5444 application_name=secondary2'
アプリケーション名 secondary2 は、マスターデータベースサーバーの postgresql.conf ファイルの synchronous_standby_names パラメーターに含める必要があります。
セカンダリデータベースサーバーの postgresql.conf ファイルの構成パラメーター設定が適切に設定されていることを確認する必要があります(特に hot_standby=on )。
注釈
EDBPostgresAdvancedServerv12では、 recovery.conf ファイルは無効になりました。 standby.signal ファイルに置き換えられます。その結果、 primary_conninfo は recovery.conf ファイルから postgresql.conf ファイルに移動します。 standby.signal ファイルの存在は、スタンバイモードで実行するようにクラスターに通知します。手動で recovery.conf ファイルを作成して data ディレクトリに保存しようとしても、サーバーは起動に失敗してエラーをスローすることに注意してください。
パラメーター standby_mode=on はEDBPostgresAdvancedServerv12からも削除され、 trigger_file パラメーター名は promote_trigger_file に変更されます。
次の表に、セカンダリデータベースサーバーと比較した、マスターデータベースサーバーの基本的な postgresql.conf 構成パラメーター設定を示します。
表-マスター/セカンダリ構成パラメーター
パラメータ |
マスター |
二次 |
説明 |
|---|---|---|---|
archive_mode |
に |
オフ |
アーカイブストレージに送信された完了したWALセグメント |
archive_command |
cp%p/archive_dir/%f |
該当なし |
完了したWALセグメントをアーカイブする |
wal_level |
hot_standby(9.5以前)、レプリカ(9.6以降) |
最小限の |
WALセグメントに書き込まれる情報 |
max_wal_senders |
*n*(正の整数) |
0 |
スタンバイサーバーからの最大同時接続 |
wal_keep_segments |
*n*(正の整数) |
0 |
スタンバイサーバー用に保持する過去のログセグメントの最小数 |
synchronous_standby_names |
n/(secondary1、 secondary2、...) |
該当なし |
同期レプリケーションのスタンバイサーバーのリスト。同期レプリケーションを有効にするには、存在する必要があります。これらは、各スタンバイサーバーのrecovery.confファイルのprimary_conninfoパラメータのapplication_nameオプションから取得されます。 |
hot_standby |
オフ |
に |
クライアントアプリケーションは、スタンバイモードでセカンダリサーバーに接続してクエリを実行できます。 |
セカンダリデータベースサーバー( secondary1 )が起動します:
-bash-4.1$ pg_ctl start -D /opt/secondary1 -l logfile -o "-p 5445"
server starting
セカンダリデータベースサーバー( secondary2 )が起動します:
-bash-4.1$ pg_ctl start -D /opt/secondary2/data -l logfile -o "-p 5446"
server starting
セカンダリデータベースサーバーが同期モードで適切にセットアップされていることを確認するには、マスターデータベースサーバーで次のクエリを使用します。 sync_state 列には、アプリケーション secondary1 および secondary2 が同期としてリストされていることに注意してください。
edb=# SELECT usename, application_name, client_addr, client_port, sync_state FROM pg_stat_replication;
usename | application_name | client_addr | client_port | sync_state
--------------+------------------+--------------+-------------+------------
enterprisedb | secondary1 | 192.168.2.22 | 53525 | sync
enterprisedb | secondary2 | 127.0.0.1 | 36214 | sync
(2 rows)
接続URLは次のとおりです。
String url = "jdbc:edb://master:5444,secondary1:5445,secondary2:5446/edb?targetServerType=preferSyncSecondary";
con = DriverManager.getConnection(url, "enterprisedb", "password");
Javaプログラムを実行しているホスト上の /etc/hosts ファイルには、接続URL文字列で指定されたサーバー名を持つ次のエントリが含まれます。
192.168.2.24 localhost.localdomain master
192.168.2.22 localhost.localdomain secondary1
192.168.2.24 localhost.localdomain secondary2
For this example, the preferred synchronous secondary connection option
results in the first usage attempt made on secondary1, then on
secondary2 if secondary1 is not active, then on the master if both
secondary1 and secondary2 are not active as demonstrated by the
following program that displays the IP address and port of the database
server to which the connection is made.
import java.sql.*;
public class InetServer
{
public static void main(String[] args)
{
try
{
Class.forName("com.edb.Driver");
String url =
"jdbc:edb://master:5444,secondary1:5445,secondary2:5446/edb?targetServerType=preferSyncSecondary";
String user = "enterprisedb";
String password = "password";
Connection con = DriverManager.getConnection(url, user, password);
ResultSet rs = con.createStatement().executeQuery("SELECT inet_server_addr() || ':' || inet_server_port()");
rs.next();
System.out.println(rs.getString(1));
rs.close();
con.close();
System.out.println("Command successfully executed");
}
catch(ClassNotFoundException e)
{
System.out.println("Class Not Found : " + e.getMessage());
}
catch(SQLException exp)
{
System.out.println("SQL Exception: " + exp.getMessage());
System.out.println("SQL State: " + exp.getSQLState());
System.out.println("Vendor Error: " + exp.getErrorCode());
}
}
}
ケース1: すべてのデータベースサーバーがアクティブな場合、 192.168.2.22 ポート 5445 の secondary1 に接続されます。
$ java InetServer
192.168.2.22/32:5445
Command successfully executed
ケース2: secondary1 がシャットダウンされると、 192.168.2.24 ポート 5446 の secondary2 に接続されます。
bash-4.1$ /usr/edb/as12/bin/pg_ctl stop -D /opt/secondary1
waiting for server to shut down.... done
server stopped
$ java InetServer
192.168.2.24/32:5446
Command successfully executed
ケース3: secondary2 もシャットダウンされると、 192.168.2.24 ポート 5444 の master に接続されます。
bash-4.1$ /usr/edb/as12/bin/pg_ctl stop -D /opt/secondary2/data
waiting for server to shut down.... done
server stopped
$ java InetServer
192.168.2.24/32:5444
Command successfully executed