読者です 読者をやめる 読者になる 読者になる

文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

solrのrollbackはRDBのrollbackとは挙動が違う

solr

solrにはrollbackの機能があります。
ところがRDBと全く同じrollbackではありません。

例えばインデックス全件生成を例に上げてみます。

1,インデックス全件削除。
2,インデックス全件生成。
3,全件生成中にエラー発生。
4,catch節でrollbackを実行。

こういう場合、2は反映されず、1以前の状態に戻ります。
ただしそれは メモリ上の話です
インデックスの物理ファイルはカッチリ削除されています。
つまりrollbackした後にtomcat等のservletコンテナを再起動すると、
全件削除された状態でインデックスがロードされてインデックスが0件になります。
RDBのように物理的にrollbackされる訳ではないのです

これを意識していないと、以下のような事が起こりえます。

1,インデックス全件削除。
2,インデックス全件生成。
3,全件生成中にエラー発生。
4,catch節でrollbackを実行。全件生成は失敗に終わり、rollbackされる。
5,インデックス差分更新が走る

この場合、4でインデックスが0件になり、5のインデックス差分更新が成功した場合、
差分更新の件数が1件だとすると、1件の状態でcommitが走りインデックスは1件になります。
こういった事故を防ぐ手段として、全件更新か差分更新が失敗した場合にロックファイル等を作り、
ロックファイルが有る場合は処理をせずメールでアラート通知する、等が必要になるかと思います。

他の手段としては、コアを2個用意してswapで入れ替える手法があります。
インデックス生成は core1_tmp に実行、core1_tmpの状態が正常である事を確認して、
core1 と core1_tmp をswapして入れ替える、MySQLで言うところのrename tableと同じ事をします。
CoreAdmin - Solr Wiki
手間はかかりますが、これで安全にインデックスの更新ができるのではないでしょうか。

Mapion・日本一の地図システムの作り方 (Software Design plus)

Mapion・日本一の地図システムの作り方 (Software Design plus)