ページの先頭行へ戻る
Enterprise Postgres 16 SP1 クラスタ運用ガイド(データベース多重化編)

2.11.4 最適な異常監視による縮退運転を行うためのチューニング

Mirroring Controllerには監視対象の資源へのアクセスにおいて、タイムアウト時間の超過やリトライ回数を越えたことで異常と判断する監視方法があります。これらの設定が適切でないと、誤検知のリスクや自動縮退の遅延を引き起こす場合があるため、適切な設計が必要となります。

例えば、異常監視に関するチューニングが適切に行われていない場合、以下のような事象が発生します。

以降で説明するサーバ定義ファイルのパラメータをシステムに応じた値に編集することで縮退運転の最適化を行うことができます。また、これらのパラメータを編集するには、“A.4 サーバ定義ファイル”を参照してください。

2.11.4.1 OS/サーバの異常監視のチューニング

OS/サーバの異常監視のチューニングは、OS/サーバの生死監視においてハートビート異常を検出した場合の動作により異なります。

参照

OS/サーバの生死監視においてハートビート異常を検出した場合の動作については、“1.1.1 データベース多重化運用による監視”を参照してください。


2.11.4.1.1 裁定サーバを利用して自動縮退を行う運用の異常監視のチューニング

裁定サーバを利用して自動縮退を行う運用では、Mirroring Controller裁定プロセスがMirroring Controllerからの裁定依頼に即時に応答できるように、データベースサーバの異常監視を定期的に行っています。裁定サーバを利用した自動縮退は、以下のパラメータを編集することによって、OS/サーバの異常検知から自動縮退までの時間の最適化を行うことができます。

データベースサーバのサーバ定義ファイルのOS/サーバの異常監視のパラメータ

表2.10 データベースサーバのサーバ定義ファイルのOS/サーバの異常監視のパラメータ

パラメータ

指針

異常監視の監視間隔
(heartbeat_interval)

Mirroring Controllerによる異常監視がシステムに負荷を与えない範囲で設定しますが、通常は設定不要です (デフォルトは800ミリ秒)。

異常監視のタイムアウト時間
(heartbeat_timeout)

サーバや管理用ネットワークの能力に対して負荷が継続的に掛かる時間を考慮します。例えば、高負荷のバッチ業務を実行する場合や高多重のオンライン業務が連続的に発生するような場合が想定されます (デフォルトは1秒)。

異常監視のリトライ回数
(heartbeat_retry)

負荷が流動的なシステムなど、heartbeat_timeoutで指定した値を超える事象に対して安全値が必要な場合に設定しますが、通常は設定不要です (デフォルトは2回)。

Mirroring Controllerが異常と判断するまでの時間の計算方法を以下に示します。

Mirroring Controllerの異常検出時間 = ( heartbeat_timeout(秒数) + heartbeat_interval(ミリ秒) / 1000 ) × ( heartbeat_retry(回数) + 1) 

デフォルトの値を使用した場合の異常検出時間は以下となります。

Mirroring Controllerの異常検出時間 = ( 1 + 800 / 1000 ) × ( 2 + 1 )
             = 5.4(秒)

裁定定義ファイルのOS/サーバの異常監視のパラメータ

表2.11 裁定定義ファイルのOS/サーバの異常監視のパラメータ

パラメータ

指針

異常監視の監視間隔
(heartbeat_interval)

Mirroring Controller裁定プロセスによる異常監視がシステムに負荷を与えない範囲で設定しますが、通常は設定不要です(デフォルトはデータベースサーバのサーバ定義ファイルのheartbeat_intervalの設定値です) (ミリ秒数)。

異常監視のタイムアウト時間
(heartbeat_timeout)

サーバや裁定用ネットワークの能力に対して負荷が継続的に掛かる時間を考慮します(デフォルトはデータベースサーバのサーバ定義ファイルのheartbeat_timeoutの設定値です) (秒数)。

異常監視のリトライ回数
(heartbeat_retry)

負荷が流動的なシステムなど、heartbeat_timeoutで指定した値を超える事象に対して安全値が必要な場合に設定しますが、通常は設定不要です(デフォルトはデータベースサーバのサーバ定義ファイルのheartbeat_retryの設定値です) (回数)。

Mirroring Controller裁定プロセスが異常と判断するまでの時間の計算方法を以下に示します。

Mirroring Controller裁定プロセスの異常検出時間 = ( heartbeat_timeout(秒数) + heartbeat_interval(ミリ秒) / 1000 ) × ( heartbeat_retry(回数) + 1) 

デフォルトの値を使用した場合の異常検出時間は以下となります。

Mirroring Controller裁定プロセスの異常検出時間 = ( 1 + 800 / 1000 ) × ( 2 + 1 )
             = 5.4(秒)

ポイント

裁定サーバを利用して自動縮退を行う運用の異常検出時間は以下のように計算できます。

異常検出時間 = Max( Mirroring Controllerの異常検出時間, Mirroring Controller裁定プロセスの異常検出時間) 

注意

裁定定義ファイルにheartbeat_intervalを設定する場合、データベースサーバのサーバ定義ファイルで指定したOS/サーバの異常監視のパラメータとの関係が以下の関係式を満たすように設計してください。

( 裁定定義ファイルのheartbeat_interval(ミリ秒) / 1000 ) <
( heartbeat_timeout(秒数) + heartbeat_interval(ミリ秒) / 1000 ) × heartbeat_retry(回数) + heartbeat_timeout(秒数)

裁定処理とフェンシングに関するパラメータ

表2.12 裁定処理とフェンシングに関するパラメータ

パラメータ

指針

裁定処理のタイムアウト時間
(データベースサーバのサーバ定義ファイルのarbitration_timeout)

Mirroring Controller裁定プロセスでの裁定処理に掛かる時間を考慮します。Mirroring Controller裁定プロセスの異常検出時間 + 裁定定義ファイルのfencing_command_timeout以上の値を指定する必要があります (秒数)。

フェンシングのタイムアウト時間
(裁定定義ファイルのfencing_command_timeout)

フェンシングコマンドの実行に掛かる時間を考慮します (秒数)。


OS/サーバの異常検知から自動縮退までの流れ

裁定サーバを利用して自動縮退を行う運用のOS/サーバの異常検知から自動縮退が発生するまでの流れと関連するパラメータを示します。

OS/サーバの異常検知から自動縮退までの流れ

説明

関連するパラメータ

(1) 異常検知

Mirroring ControllerがデータベースサーバのOS/サーバの異常を検知します。

データベースサーバのサーバ定義ファイルのOS/サーバの異常監視のパラメータ

(2) 裁定依頼

OS/サーバの異常を検知したサーバのMirroring Controllerが裁定サーバに対して相手サーバのOS/サーバの状態確認を依頼します。

-

データベースサーバのサーバ定義ファイルのarbitration_timeout

(3) 裁定処理

Mirroring Controller裁定プロセスが、相手サーバのOS/サーバの状態を確認します。ただし、データベースサーバのMirroring Controllerからの裁定依頼の前に、裁定サーバによるOS/サーバの異常監視の結果が確定している場合は、本処理は実施しません。

裁定定義ファイルのOS/サーバの異常監視のパラメータ

(4) フェンシング

Mirroring Controller裁定プロセスが相手サーバをOS/サーバの異常と判断した場合、その相手サーバをフェンシングし、クラスタシステムから隔離します。Mirroring Controller裁定プロセスがOS/サーバの状態を正常と判断した場合は、本処理および(6)は実施しません。

裁定定義ファイルのfencing_command_timeout

(5) 裁定結果の返却

裁定依頼を行ったデータベースサーバのMirroring Controllerに対して、裁定処理の結果を返却します。

-

(6) 自動縮退

自動縮退を行います。(4)でフェンシングが失敗した場合は、本処理は実施しません。

-

-:関連パラメータなし

注意

データベースサーバのサーバ定義ファイルにfencing_commandパラメータを指定している場合、裁定サーバでのフェンシングが正しく行われたときに、データベースサーバでフェンシングコマンドが呼び出されます。その場合、データベースサーバのサーバ定義ファイルのfencing_command_timeoutパラメータの値を見積もりに加算してください。

図2.1 プライマリサーバのMirroring ControllerでOS/サーバの異常を検知した場合

図2.2 スタンバイサーバのMirroring ControllerでOS/サーバの異常を検知した場合


2.11.4.1.2 縮退の判断を行うユーザー出口を呼び出して自動縮退を行う運用の異常監視のチューニング

縮退の判断を行うユーザー出口を呼び出して自動縮退を行う運用では、データベースサーバのサーバ定義ファイルのOS/サーバの異常監視のパラメータおよび裁定処理とフェンシングに関連するパラメータを編集することによって、OS/サーバの異常検知から自動縮退までの時間の最適化を行うことができます。データベースサーバのサーバ定義ファイルのOS/サーバの異常監視のパラメータの詳細は、“データベースサーバのサーバ定義ファイルのOS/サーバの異常監視のパラメータ”を参照してください。

表2.13 裁定処理とフェンシングに関するパラメータ

パラメータ

指針

裁定処理のタイムアウト時間
(arbitration_command_timeout)

裁定コマンドの実行にかかる時間を考慮します (秒数)。

フェンシングのタイムアウト時間
(fencing_command_timeout)

フェンシングコマンドの実行にかかる時間を考慮します (秒数)。


OS/サーバの異常検知から自動縮退までの流れ

縮退の判断を行うユーザー出口を呼び出して自動縮退を行う運用のOS/サーバの異常検知から自動縮退が発生するまでの流れと関連するパラメータを示します。

OS/サーバの異常検知から自動縮退までの流れ

説明

関連するパラメータ

(1) 異常検知

Mirroring ControllerがデータベースサーバのOS/サーバの異常を検知します。

データベースサーバのサーバ定義ファイルのOS/サーバの異常監視のパラメータ

(2) 裁定処理

裁定コマンドを実行し、相手サーバのOS/サーバの状態を確認します。

データベースサーバのサーバ定義ファイルのarbitration_command_timeout

(3) フェンシング

(2)でOS/サーバの異常と判断した場合、相手サーバをフェンシングし、クラスタシステムから隔離します。(2)で相手サーバのOS/サーバの状態を正常と判断した場合は、本処理および(4)は実施しません。

データベースサーバのサーバ定義ファイルのfencing_command_timeout

(4) 自動縮退

自動縮退を行います。(3)でフェンシングが失敗した場合は、本処理は実施しません。

-

-:関連パラメータなし

図2.3 プライマリサーバのMirroring ControllerでOS/サーバの異常を検知した場合

図2.4 スタンバイサーバのMirroring ControllerでOS/サーバの異常を検知した場合


2.11.4.1.3 メッセージを通知する運用の異常監視のチューニング

メッセージを通知する運用では、データベースサーバのサーバ定義ファイルのOS/サーバの異常監視のパラメータを編集することによって、OS/サーバの異常検知時間の最適化を行うことができます。データベースサーバのサーバ定義ファイルのOS/サーバの異常監視のパラメータの詳細は、“データベースサーバのサーバ定義ファイルのOS/サーバの異常監視のパラメータ”を参照してください。なお、メッセージを通知する運用では、Mirroring Controllerが異常を検知した場合に、裁定処理、フェンシングおよび自動縮退は行わず、メッセージの通知のみ行います。


2.11.4.1.4 ハートビート異常で無条件に自動縮退を行う運用の異常監視のチューニング

ハートビート異常で無条件に自動縮退を行う運用では、データベースサーバのサーバ定義ファイルのOS/サーバの異常監視のパラメータを編集することによって、OS/サーバの異常検知から自動縮退までの時間の最適化を行うことができます。データベースサーバのサーバ定義ファイルのOS/サーバの異常監視のパラメータの詳細は、“データベースサーバのサーバ定義ファイルのOS/サーバの異常監視のパラメータ”を参照してください。なお、ハートビート異常で無条件に自動縮退を行う運用では、Mirroring Controllerが異常を検知した場合に、裁定処理とフェンシングは行わず、無条件に自動縮退を行います。

注意

ハートビート異常で無条件に自動縮退を行う運用の注意事項は、“付録D ハートビート異常で即時に自動縮退を行うを選択した場合の注意事項”を参照してください。

2.11.4.2 データベースプロセスの異常監視のチューニング

データベースプロセスの異常監視は、データベースサーバのサーバ定義ファイルの以下のパラメータを編集することによって、最適化を行うことができます。

表2.14 データベースプロセスの異常監視のパラメータ

パラメータ

指針

異常監視の監視間隔
(db_instance_check_interval)

Mirroring Controllerによる異常監視がシステムに負荷を与えない範囲で設定しますが、通常は設定不要です(デフォルトはheartbeat_intervalの設定値です) (ミリ秒数)。

データベースプロセスの異常監視のタイムアウト時間
(db_instance_check_timeout)

データベースに対して負荷が継続的にかかる時間を考慮します。例えば、高負荷のバッチ業務を実行する場合や高多重のオンライン業務が連続的に発生するような場合が想定されます(デフォルトはheartbeat_timeoutの設定値です) (秒数)。

異常監視のリトライ回数
(db_instance_check_retry)

負荷が流動的なシステムなど、db_instance_check_timeoutで指定した値を超える事象に対して安全値が必要な場合に設定しますが、通常は設定不要です(デフォルトはheartbeat_retryの設定値です) (回数)。

異常と判断するまでの時間の計算方法を以下に示します。

異常検出時間 = ( db_instance_check_timeout(秒数) + db_instance_check_interval(ミリ秒) / 1000 ) × ( db_instance_check_retry(回数) + 1 )

デフォルトの値を使用した場合の異常検出時間は以下となります。

異常検出時間 = ( 1 + 800 / 1000 ) × ( 2 + 1 )
             = 5.4(秒)

注意

  • サーバ識別子.confファイルのdb_instance_timeout_actionにmessageを指定した場合、db_instance_check_timeoutの指定値が短いと、データベースプロセスのダウンを無応答として検知し、自動縮退が発生するまでに時間がかかる場合があります。そのため、db_instance_check_timeoutには、適切なタイムアウト時間を指定してください。

  • データベースに対する高負荷とインスタンスに接続できない事象が同時に発生した場合は、監視のリトライは行わずに異常と判断します。


2.11.4.3 ストリーミングレプリケーションの異常監視のチューニング

ストリーミングレプリケーションの異常監視は、データベースサーバのサーバ定義ファイルの以下のパラメータを編集することによって、最適化を行うことができます。

表2.15 ストリーミングレプリケーションの異常監視のパラメータ

パラメータ

指針

異常監視の監視間隔
(db_instance_check_interval)

Mirroring Controllerによる異常監視がシステムに負荷を与えない範囲で設定しますが、通常は設定不要です(デフォルトはheartbeat_intervalの設定値です) (ミリ秒数)。

異常監視のリトライ回数
(db_instance_check_retry)

一時的にログ転送LAN異常が発生する場合など、安全値が必要な場合に設定しますが、通常は設定不要です(デフォルトはheartbeat_retryの設定値です) (回数)。

ストリーミングレプリケーションの異常監視のタイムアウト時間
(postgresql.conf内のwal_sender_timeoutおよびwal_receiver_timeout)

ログ転送用ネットワークの能力および負荷やデータベースに対する負荷が継続的に掛かる時間を考慮します。例えば、WALが大量に発生するようなデータ更新を行う業務が連続的に発生するような場合には誤検知を回避する設定が必要です (デフォルトは60秒)。

異常と判断するまでの時間の計算方法を以下に示します。

異常検出時間
= wal_sender_timeout(秒数) + ( db_instance_check_interval(ミリ秒) / 1000 × ( disk_check_retry(回数) + 1 ) )   または
= wal_receiver_timeout(秒数) + ( db_instance_check_interval(ミリ秒) / 1000 × ( disk_check_retry(回数) + 1 ) )

デフォルトの値を使用した場合の異常検出時間は以下となります。

異常検出時間 = 60 + (800 / 1000 × (2 + 1))
             = 62.4(秒)

2.11.4.4 ディスクの異常監視のチューニング

ディスクの異常監視は、データベースサーバのサーバ定義ファイルの以下のパラメータを編集することによって、最適化を行うことができます。

表2.16 ディスクの異常監視のパラメータ

パラメータ

指針

異常監視の監視間隔
(disk_check_interval)

Mirroring Controllerによる異常監視がシステムに負荷を与えない範囲で設定します。ディスクアクセス時間より大きい値を設定してください (デフォルトはheartbeat_intervalの設定値です) (ミリ秒数)。

異常監視のリトライ回数
(disk_check_retry)

一時的なディスクの入出力障害が発生する可能性が想定される場合など、安全値が必要な場合に設定しますが、通常は設定不要です (デフォルトはheartbeat_retryの設定値です) (回数)。

異常監視のタイムアウト時間
(disk_check_timeout)

ディスク異常が発生した時点の次のdisk_check_intervalの開始時刻からタイムアウトによる異常と判断するまで許容する時間(デフォルトは2147483です) (秒数)。

0~2147483までの間の整数が指定可能です。

異常監視に利用するスレッド数の上限
(disk_check_max_threads)

ディスク監視用スレッド数の上限(デフォルトはJVMが利用可能なプロセッサ数です)

1~2147483647までの間の整数が指定可能ですが、マシンが利用可能なスレッド以上の値を設定するとシステムエラーになる可能性があります。

監視プロセスとは別に、mc_ctl statusコマンドを実行する場合に、mc_ctl statusごとに監視プロセスと同じ数量のスレッドが一時的に利用されます。disk_check_max_threadsを設定する際に、マシンのスレッド上限、利用予定のテーブル空間数、および同時に実行する可能性があるmc_ctl statusコマンドの数を考慮し、設定してください。


ディスクの異常監視ではディスクチェックを行い、異常検出時間またはdisk_check_timeoutに設定された時間内で、どちらか先に異常を検知した時点で縮退が実施されます。ただし、スタンバイサーバでdisk_check_timeoutによる異常検知時に、スタンバイサーバの切り離しを行うためには、shutdown_detached_synchronous_standbyにonを設定する必要があります。

異常検出時間(異常と判断するまでの時間)の計算方法を以下に示します。

異常検出時間 = disk_check_interval (ミリ秒) / 1000 × ( disk_check_retry(回数) + 1 )

デフォルトの値を使用した場合の異常検出時間は以下となります。

異常検出時間 = 800 / 1000  × ( 2 + 1 )
             = 2.4(秒)

ディスクの異常監視を検出する例を以下に示します。

例1)

1つのスレッドが1つのディスクを監視、disk_check_retry = 2を設定。
ディスクに対するレスポンスが遅いため、ディスクアクセス時間内に読み込みまたは書き込みが完了できない場合。

例2)

1つのスレッドが2つのディスクを監視、disk_check_retry = 2を設定。
ディスクに対するレスポンスが遅いため、ディスク1は、1回目、2回目にディスクアクセス時間内に読み込みまたは書き込みが完了できず、3回目のリトライで読み込みまたは書き込みが成功。ディスク2はディスクアクセス時間内に読み込みまたは書き込みがすべて失敗した場合。

例3)

1つのスレッドが2つのディスクを監視、disk_check_retry = 2を設定。
ディスク2が無応答となり、タイムアウト時間内に監視結果が取得できない場合。

注意

  • 上記のチューニングは、タイムアウトを検知してからプライマリサーバを切り替えるなどの操作を行うまでの時間に影響します。そのため、誤検知を行わない設計を行った上で、切り替え/切り離し時間を考慮した値に補正してください。

  • OSやサーバの生死監視においてハートビート異常で即時に自動縮退を行う選択を行った場合には、スプリットブレインを発生させる危険性があります。詳細は、“付録D ハートビート異常で即時に自動縮退を行うを選択した場合の注意事項“を参照してください。

参考

監視対象の資源によっては、Mirroring Controllerがデータベースインスタンスへの接続やSQLアクセスにより異常監視を行うものがあります。この異常監視を行うための接続先データベース名や接続ユーザー名は、サーバ定義ファイル内のパラメータに従います。また、アプリケーション名は‘mc_agent’です。