同期セカンダリデータベースサーバーの優先

Advanced Server JDBC Connectorは、表5-2に示すように、 targetServerType接続プロパティのpreferSyncSecondaryオプションをサポートしてpreferSyncSecondaryます。

注意

targetServerType値slave 、 preferSlave 、 preferSyncSlaveすべて、 secondary 、 preferSecondary 、およびpreferSyncSecondary値と同じ機能セットを提供します。 slave値は廃止されました。 secondary値を使用することをお勧めします。

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名前である、それはにそのIPアドレスを指定する必要があります/etc/hosts Javaプログラムを実行しているホスト上のファイル。

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のドキュメントに記載されています。

preferSyncSecondaryオプションに必要なホットスタンバイの使用に関する一般情報については、 セクション26.5、ホットスタンバイを参照してください。

マスタからセカンダリデータベースサーバーのベースバックアップを作成する方法については、セクション25.3.2、 ベースバックアップの作成 (pg_basebackupユーティリティプログラムの使用法を説明)またはセクション25.3.3、 低レベルAPIを使用したベースバックアップの作成を参照してください。 PostgreSQL Core Documentationのセクション25.3 Continuous Archiving and Point-in-Time Recovery(PITR)内。

ホットスタンバイで使用するために設定する必要のある設定パラメータについては、 セクション19.6、レプリケーションを参照してください。

次のセクションでは、マスターデータベースサーバーとセカンダリデータベースサーバーをセットアップする基本的な例を示します。

例:マスターおよびセカンダリデータベースサーバー

次の例では、次のとおりです。

  • マスターデータベースサーバーはホスト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上のsecondary2データベースサーバーと、マスターに対してローカルなsecondary1データベースサーバーの両方のレプリケーションデータベースユーザーとして使用されます。

# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    replication     enterprisedb    192.168.2.22/32         md5
ホスト複製enterprisedb 127.0.0.1/32 md5 

マスター・データベース・サーバがで設定された後postgresql.confそのとともにファイルpg_hba.confファイル、データベース・サーバのsecondary1ホスト上で次のコマンドを呼び出すことによって作成された192.168.2.22ためsecondary1 :

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ファイルを追加することによって、以下の例に編集されたデータベース・クラスタで生成されるapplication_name=secondary1の一部として設定primary_conninfoの一部の文字列と除去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 )。

注意

EDB Postgres Advanced Server v12の時点で、 recovery.confファイルは無効になりました。 standby.signalファイルに置き換えられます。その結果、 primary_conninfoはrecovery.confファイルからpostgresql.confファイルに移動されます。 standby.signalファイルの存在は、スタンバイモードで実行するようにクラスターにstandby.signalます。 recovery.confファイルを手動で作成してdataディレクトリに保存しようとしても、サーバーの起動に失敗してエラーがスローされることに注意してください。

パラメーターstandby_mode=onもEDB Postgres Advanced Server v12から削除され、 trigger_fileパラメーター名はpromote_trigger_file変更されpromote_trigger_file 。

次の表は、セカンダリデータベースサーバーと比較した、マスターデータベースサーバーの基本的なpostgresql.conf構成パラメーター設定を示しています。

表-マスター/セカンダリ構成パラメーター

パラメータ主人二次説明
archive_mode オンOffアーカイブストレージに送信された完了したWALセグメント
archive_command CP%P / archive_dir /%F N / A 完了した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 、…)

N / A 同期レプリケーション用のスタンバイサーバーのリスト。同期レプリケーションを有効にするには、存在する必要があります。これらは、各スタンバイサーバーのrecovery.confファイルのprimary_conninfoパラメータのapplication_nameオプションから取得されます。
hot_standby Offオンクライアントアプリケーションは、スタンバイモードでセカンダリサーバーに接続してクエリを実行できます。

セカンダリデータベースサーバー( 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

注意

接続URL名secondary1およびsecondary2は、 primary_conninfoおよびsynchronous_standby_namesパラメーターで指定されたアプリケーション名とprimary_conninfo一致しますが、これは必須ではありません。接続URL名は、 primary_conninfoパラメーターおよびsynchronous_standby_namesパラメーターで指定されたアプリケーション名とは無関係です。

この例では、上に作られた第1の使用の試みに好適同期二次接続オプション結果secondary1 、その後にsecondary2場合secondary1アクティブでない場合、マスタの両方場合secondary1とsecondary2表示次のプログラムによって示されるようにアクティブでありません接続先のデータベースサーバーのIPアドレスとポート。

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