これはPGroonga 2.X and 3.X用のドキュメントです。古いPGroongaを使っているならPGroonga 1.xのドキュメントを見てください。
PGroongaは2.3.3からクラッシュセーフ機能に対応しています。
この機能はまだ実験的です。もし問題を見つけたら PGroonga Issues に報告してください。
このドキュメントは次のことを説明します。
PGroonga用のクラッシュセーフ機能の設定方法
PGroonga用のクラッシュセーフ機能はどう動くか
PGroonga用のクラッシュセーフ機能はGroongaのクラッシュセーフ機能を使っています。PostgreSQLのWALを使ったPostgreSQLのクラッシュセーフ機能は使っていません。
メリット:
PostgreSQLのプロセスがクラッシュしたとき、PGroongaのインデックスが自動で復旧する
REINDEX
を実行する必要はない欠点:
このセクションではクラッシュセーフ機能の設定方法を説明します。
postgresql.conf
で次のパラメーターを指定しなければいけません。
shared_preload_libraries = 'pgroonga_crash_safer'
pgroonga.enable_crash_safe = on
pgroonga_crash_safer
モジュールはワーカープロセスを使います。max_worker_processes
パラメーターの値を増やさないといけないかもしれません。詳細はpgroonga_crash_safer
モジュールを参照してください。
このセクションではクラッシュセーフ機能はどう動くかを説明します。
PGroongaのクラッシュセーフ機能はGroongaのクラッシュセーフ機能を使っています。
Groongaのクラッシュセーフ機能は、他のすべてのプロセスがGroongaのデータベースを開く前にデータベースを開き、他のすべてのプロセスがGroongaのデータベースを閉じた後にデータベースを閉じるプロセスが必要です。このプロセスを「プライマリープロセス」と呼びます。プライマリープロセスはメモリー上にある変更を定期的にストレージにフラッシュします。
pgroonga_crash_safer
モジュールはPostgreSQLのデータベースごとにプライマリープロセスを起動します。PGroongaの機能を使う接続が現れると、この接続用のプロセスはpgroonga_crash_safer
モジュールに対象のPostgreSQLのデータベース用にプライマリープロセスを起動するように依頼します。その後、プライマリープロセスがGroongaのデータベースを開くまで待ちます。
PGroongaの機能を使う接続用のプロセスを「セカンダリープロセス」と呼びます。プライマリープロセスは1つだけですが、セカンダリープロセスは0個以上存在できます。
セカンダリープロセスはPGroongaのインデックスが更新されるごとに(PostgreSQLのWALではなく)GroongaのWALを書き出します。メモリー上のWALの内容は確実にストレージにフラッシュします。ここで書き込み性能が落ちます。
プライマリープロセスはシャットダウン時にメモリー上のすべての変更をストレージに書き出してGroongaのすべてのWALファイルを削除します。つまり、正常にシャットダウンしたときはGroongaのWALファイルは存在しません。スタートアップ時にWALファイルがあった場合はプライマリープロセスは対象データベースを自動で復旧します。プライマリープロセスはGroongaのWALからの復旧を試みます。これが失敗すると既存のGroongaのデータベースを削除し、新しくGroongaのデータベースを作ります。その後、REINDEX
を実行します。これによりPostgreSQL内のデータからPGroongaのインデックスを再構築します。
プライマリープロセスが定期的にフラッシュするときにGroongaのWALファイルは削除されます。そのため、GroongaのWALのサイズが永遠に増え続けるということはありません。フラッシュする間隔はpgroonga_crash_safer.flush_naptime
パラメーターで設定できます。