今回は、Goldの「パフォーマンスチューニング - 性能に関係するパラメータ」からの出題です。
on にすると、WALがスタンバイ機のディスクに正常に書き出されたタイミングでコミット成功とする
off にすると、WALがプライマリ機にもスタンバイ機にもまだ書き出されていない状況でもコミット成功とする
local にすると、WALがスタンバイ機のディスクに書き出される前の、バッファに書き出されたタイミングでコミット成功とする
remote_apply にすると、スタンバイ機でのWALのディスク書き込みだけでなく、WALの記述内容がデータベースに適用されたタイミングでコミット成功とする
※この例題は実際のOSS-DB技術者認定試験とは異なります。
正解は「 C 」です。
synchronous_commit パラメータは、レプリケーション構成における同期レベルを制御します。
以下では、synchronous_commit パラメータに設定可能な値とその解説をします。
●remote_apply
同期レベルが最も高い設定値です。この設定の場合、プライマリ機でのトランザクションのコミットを実行してから、コミット成功となるまでの流れは以下の通りです。
STEP 1. ユーザが、プライマリ機でコミットを実行する
STEP 2. プライマリ機が、WALをプライマリ機のディスクに保存する
STEP 3. プライマリ機が、WALをスタンバイ機に送信し、スタンバイ機がWALを受取る
STEP 4. スタンバイ機が、WALをオペレーションシステムのバッファキャッシュに保存する
STEP 5. スタンバイ機が、バッファキャッシュに保存されたWALをディスクに保存する
STEP 6. スタンバイ機が、WALの記述内容に従って、データベースを更新する(ここでSELECTクエリを実行すると更新された状態になる)。
STEP 7. プライマリ機が、スタンバイ機からの報告を受取る
STEP 8. プライマリ機が、コミットを成功と判定する
●on
デフォルトの同期設定です。remote_applyと比べて、STEP 6. の完了を待たずに STEP 7. に進みます。この設定では、プライマリ機およびすべてのスタンバイ機がデータベース記憶装置の故障を被った場合を除いて、トランザクションが失われないことが保証されます。
●remote_write
同期レベルが準同期の設定です。remote_applyと比べて、STEP 5., STEP 6. の完了を待たずに STEP 7. に進みます。
この設定の特徴として、プライマリ機のWAL書き込み処理の待ち時間が短縮されることにより、「on」よりも性能がやや向上します。また、スタンバイ機のPostgreSQLサーバがクラッシュしたとしても、データの保護を保証できます。ただし、スタンバイ機がOSレベルでクラッシュした場合は、システムのバッファが失われる可能性があるため、データ保護を保証できません。
●local
非同期の設定です。remote_applyと比べて、STEP 4.〜 STEP 7.の完了を待たずに STEP 8. に進みます。この設定は、同期レプリケーション構成では望ましい設定ではありません。
●off
完全非同期の設定です。remote_applyと比べて、STEP 2.〜 STEP 7. の完了を待たずに STEP 8. に進みます。
プライマリ機でのトランザクションのコミット時、WALレコードがプライマリ機およびスタンバイ機に書き込まれたかどうかを待たずにコミット成功とするため、性能が向上します。一方で、OSやPostgreSQLサーバのクラッシュ時にトランザクションが失われる可能性があります。
なお、非レプリケーション構成では、「remote_apply」、「on」、「remote_write」は、「local」と同じ動作となります。
例題の選択肢を一つずつ見ていきましょう。
[A. on にすると、WALがスタンバイ機のディスクに正常に書き出されたタイミングでコミット成功とする]
正しいです。onにすると、スタンバイ機はWALをディスクに書込んだ時点でプライマリ機に対して報告を行い、プライマリ機はその報告をもとにトランザクションのコミットを成功と判定します。
[B. off にすると、WALがプライマリ機にもスタンバイ機にもまだ書き出されていない状況でもコミット成功とする]
正しいです。offにすると、プライマリ機はWALのプライマリ機へのディスクへの書き出完了、スタンバイ機でのWALの書き出し、クエリ実行完了などの報告を待たずにコミット成功と判定します。
[C. local にすると、WALがスタンバイ機のディスクに書き出される前の、バッファに書き出されたタイミングでコミット成功とする]
誤りです。この記述は、設定値「local」でなく、設定値「remote_write」に関する記述です。
[D. remote_apply にすると、スタンバイ機でのWALのディスク書き込みだけでなく、WALの記述内容がデータベースに適用されたタイミングでコミット成功とする]
正しいです。remote_applyにすると、プライマリ機は、スタンバイ機にてWALの内容が適用された旨の報告を待って、コミット成功と判定します。
今回の解説について、理解できないポイントがあればどんどん質問をお寄せ下さい。
※試験問題に関わるお問い合わせにつきましては、LPI-Japan事務局ではお応えできませんのでご了解ください。
© EDUCO All Rights Reserved.