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

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

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

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)