[groonga-dev,04203] Re: PGROONGAでレコード追加時にエラー発生

Back to archive index

高見 直輝 takam****@orega*****
2016年 12月 5日 (月) 17:04:28 JST


高見です。

> 須藤です。
> 
> In <20161****@orega*****>
>   "[groonga-dev,04199] Re: PGROONGAでレコード追加時にエラー発生" on Thu, 01 Dec 2016 17:31:40 +0900,
>   高見 直輝 <takam****@orega*****> wrote:
> 
> >>   pgroonga.flush_explicitly = true
> >> みたいなパラメーターを用意してtrueならINSERT/DELETE/UPDATE後
> >> やCREATE INDEX後に(OSのディスク書き出しタイミングに任せずに)
> >> ディスクに書き出すようにしようかと思っています。
> > 
> > この機能によって、ハード障害などが原因の場合にもデータの破損を回避できるようになるのでしょうか?
> 
> ハード障害というのはディスクが壊れたとかも想定していますか?
> であれば、回避できません。

いいえ。記憶領域の物理的な破損については想定していません。
想定しているのは以下のような場合です。
・高負荷などによってディスク書き込みが失敗した
・外付けのHDDで、ケーブルが抜けた等の理由により書き込みが停止した
いずれも、時間の経過やユーザによる復旧処理で回復するものです。

> なお、そのレベルで壊れるとPostgreSQLでも回避できません。壊れ
> たディスクのデータは信用できないので、そこからWALで復旧して
> も正常な状態にならないかもしれないからです。
> 
> なので、そのレベルの状態からの復旧を考えるのであれば、バック
> アップをとるとか、レプリケーションして同じものを別のディスク
> にも用意しておくとか、そういうレベルでの対応を考える必要があ
> ります。
> 
> で、私はそういうレベルの壊れるではなく、OSのシャットダウンな
> どでPostgreSQLのプロセスが強制終了されることによる破損を想定
> していました。

この場合、先述のパラメータで破損を完全に回避することが可能なのでしょうか?
タイミング次第ですが、パラメータをONにしても発生し得るのでは?

> > データ破損を完全に回避することができないのであれば、以下のようなエラー発生時用の機能の方が重要か
> > もしれません
> > ・ロック中のオブジェクトの一覧取得
> 
> これは、PostgreSQL起動前にgrndb checkをすることでわかります。

PostgreSQLを停止しなくて良い手段は在りませんでしょうか?
PGROONGAと無関係な処理は継続したいのです。
そういう意味では、現状の復旧手段である『DBを停止してPGROONGAのファイルを削除する』についても、
GROONGAのコマンドで全データのクリア(初期化)が出来るのが望ましいです。

> ただ、ロックには取得時刻情報はない(そういうものを入れるとロッ
> クのオーバーヘッドが大きくなる)ので
> 
> >  →ロック取得日時が分かれば、再起動によって解放されないロックか判断可能。
> 
> はできません。
> 
> > ・エラーの対象(ロックの場合、データベースORテーブル)
> >  →毎回、全テーブル再構築をしなくて済む。
> 
> これもgrndb checkでわかります。
> 
> > ・データの破損(SQL実行時にエラーが発生するレベルのもの)
> 
> これは。。。フラッシュされずにプロセスが死んだ(OSのシャット
> ダウンでPostgreSQLが強制終了した場合など)場合はどのくらいディ
> スクに書き込まれたかがわからないので、壊れているかもしれない
> し壊れていないかもしれない、くらいまでしかわからないんですよ
> ねぇ。

壊れている(かもしれない)対象を、Postgreのエラー(メッセージ)に仕込むことは出来ませんか?
内情がどうあれ、レコードの追加が出来ない以上、対応は必要になります。
また、GROONGAのインデックスの量に応じて復旧にかかる時間が延びるため、大量のデータが存在する環境
では再構築に2日かかった事例が存在しています。
当方の環境ではテーブルを分割しているので、対象が特定できれば、そしてそれが1つのテーブルだけであ
れば、現状の『全テーブルに対してインデックス再構築』に要する時間を大幅に減らすことが可能になります。

> >> どのくらいかわかりませんが、たぶん書き込みパフォーマンスは落
> >> ちるのでデフォルトでは有効にしたくないのですが、↑のように必
> >> 要な人だけが有効にする、ならアリかなぁと思っています。
> > 
> > 各コマンド毎にFlushが行われるのは、パフォーマンスが落ち過ぎるような気がします。
> > トランザクションのコミット毎なら、許容範囲に収まるのではないでしょうか?。
> 
> 残念ながらPostgreSQLはPGroongaにコミットのタイミングを通知し
> てくれないのです。。。

これって、ロールバックが行われた場合、どうなるのでしょうか?
内部的にはレコードの削除が通知されてくる?

> 最終変更時刻からn秒後にフラッシュ(更新が連続していればフラッ
> シュされない)くらいがいいんですかねぇ。

Create・Drop Indexとそれ以外のコマンドで、壊れる範囲が変わることがあるのでしょうか?
それでしたら、破損範囲の特定という観点から、Create・Drop Indexとそれ以外の設定を分けた方が良いと
思います。

----------------------------- 
高見 直輝 <takam****@orega*****>
株式会社オレガ
TEL:03-3267-0150
FAX:03-3267-0180




groonga-dev メーリングリストの案内
Back to archive index