Lucene热备份
想象一下:您拥有一个小型的,非常有利可图且快速增长的电子商务网站。您围绕强大的开源搜索引擎Lucene精心设计了整个用户体验。这种以搜索为中心的方法是您的秘诀,您知道这是您赢得竞争对手用户的原因。百分之八十的购买来自搜索。
然后不可思议的事情发生了:有一天你的硬盘崩溃,你的搜索索引崩溃了无法使用。所以你会怎么做?您从备份还原!你有搜索索引的备份,对吧?令人惊讶的是,搜索密集型网站的所有者和管理员忽略了定期备份搜索索引是很常见的。在我们日益增长的敏捷,永远在线,搜索驱动的世界中,未能备份搜索索引是一个非常代价高昂的错误。幸运的是,从版本Lucene2.3开始,备份Lucene索引现在非常简单。
在重量级,昂贵且复杂的闭源企业搜索引擎的现代世界中,Lucene令人惊讶地呼吸新鲜空气。简单的设计,精心公开的API和令人难以置信的功能集,使得向您的应用程序添加搜索变得微不足道。最近,Lucene一直处于非常活跃的发展阶段,很快就添加了以前仅用于昂贵的闭源商业产品的功能。热备份就是这样一个功能。
挑战
备份Lucene索引最明显的方法是关闭IndexWriter并为索引中的所有文件制作完整或增量副本。毕竟,这些只是存储在文件系统中单个平面目录中的普通文件,因此这种方法可行。虽然这种方法很简单,但它有严重的局限性。在Windows上,如果您在索引上打开了IndexReader,即使最近一次提交不再需要它们,它也可以保留文件。然后,您的备份过程会浪费时间和空间复制这些不必要的文件。在关闭IndexWriter之后和运行备份之前,您可以通过始终重新打开阅读器来解决该问题。
另一个问题:在备份完成之前,您无法打开另一个IndexWriter,因为编写器可能在备份运行时更改索引,这会损坏您的备份。这意味着您在备份运行时无法对索引进行任何更新,从而使您的索引成为只读。更糟糕的是,您既不能预测也不能控制这个只读停机时间的实际长度。它可能是30秒,也可能是一个小时或更长时间,具体取决于索引的大小和整体IO带宽的可用性。
因此,您可能决定通过为备份过程提供最高优先级来解决这个问题。这样它就能尽快完成,对吧?嗯,是的,但这会对您用于搜索索引的任何IndexSearchers造成严重干扰。实际上你应该做相反的事情:给备份进程一个低优先级,或者小心地限制它的IO,这样它就不会干扰搜索。
突然之间,这个备份过程真的很麻烦,因为它会干扰正在进行的搜索和更新。难怪有这么多人只是不打扰备份,只是发现,艰难的方式,他们真正的重要性。
解决方案
幸运的是,Lucene的简单分段架构(本文稍后将介绍)提供了一种优雅的解决方案。 随着2.3的最新更改,现在可以对索引进行热备份,这意味着备份它而不必关闭IndexWriter,也不会暂停索引或重新启动搜索器。 此外,如果备份过程需要花费尽可能多的时间,这是很好的,因为Lucene将保护必要的文件。 备份将是搜索索引的时间点副本,即使编写器仍在更改索引。
欢迎大家关注DataLearner官方微信,接受最新的AI技术推送
