Lucene索引备份

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

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

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

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

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

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

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

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

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

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

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

 cp -lr indexLocation backupLocation 

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

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

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