Lucene索引备份

时间:2011-05-05 12:39:07

标签: java lucene

在不使索引脱机(热备份)的情况下备份lucene索引的最佳做法是什么?

4 个答案:

答案 0 :(得分:20)

您无需停止IndexWriter即可备份索引。

只需使用SnapshotDeletionPolicy,它可以“保护”某个提交点(及其包含的所有文件)被删除。然后,将该提交点中的文件复制到备份中,最后释放提交。

如果备份需要一段时间才能运行 - 只要你没有使用SnapshotDeletionPolicy释放提交点,IndexWriter就不会删除文件(即使它们已经合并在一起)。

这为您提供了一致的备份,它是索引的时间点图像,不会阻止正在进行索引。

我在Lucene in Action(第2版)中写过这篇文章,摘自http://www.manning.com/hatcher3的书籍(免费),“Lucene的热备份”,更详细地描述了这一点。

答案 1 :(得分:2)

这个答案取决于(a)你的索引有多大,以及(b)你正在使用什么操作系统。它适用于Unix操作系统上托管的大型索引,并且基于Solr 1.3复制策略。

创建文件后,Lucene不会更改它,只会删除它。因此,您可以使用硬链接策略进行备份。方法是:

  • 停止索引(然后执行提交?),这样就可以确保你不会写中期快照
  • 创建索引文件的硬链接副本(使用cp -lr)
  • 重新开始索引

cp -lr只会复制目录结构而不复制文件,因此即使100Gb索引也应该在不到一秒的时间内复制。

答案 2 :(得分:1)

在我看来,通常足以阻止任何正在进行的索引操作,只需获取索引文件的文件副本即可。另请参阅Solr的snapshooter脚本,该脚本可以在apache-solr-1.4.1/src/scripts中找到,基本上可以找到:

cp -lr indexLocation backupLocation

另一个选项可能是查看编程方法的Directory.copy(..)例程(例如,使用与IndexWriter的构造函数参数相同的目录。您可能也对{{{}感兴趣3}}它与脚本等效。

答案 3 :(得分:0)

使用单独的IndexWriter创建新索引,并使用addIndexesNoOptimize()将正在运行的索引合并到新索引中。这非常慢,但它允许您在进行备份时保持原始索引的正常运行。

但是,合并时无法写入索引。因此,即使它在线并且您可以查询索引,也无法在备份期间写入它。