在不使索引脱机(热备份)的情况下备份lucene索引的最佳做法是什么?
答案 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只会复制目录结构而不复制文件,因此即使100Gb索引也应该在不到一秒的时间内复制。
答案 2 :(得分:1)
在我看来,通常足以阻止任何正在进行的索引操作,只需获取索引文件的文件副本即可。另请参阅Solr的snapshooter
脚本,该脚本可以在apache-solr-1.4.1/src/scripts
中找到,基本上可以找到:
cp -lr indexLocation backupLocation
另一个选项可能是查看编程方法的Directory.copy(..)
例程(例如,使用与IndexWriter的构造函数参数相同的目录。您可能也对{{{}感兴趣3}}它与脚本等效。
答案 3 :(得分:0)
使用单独的IndexWriter创建新索引,并使用addIndexesNoOptimize()将正在运行的索引合并到新索引中。这非常慢,但它允许您在进行备份时保持原始索引的正常运行。
但是,合并时无法写入索引。因此,即使它在线并且您可以查询索引,也无法在备份期间写入它。