【问题标题】:How to terminate process with Lucene NRT Reader/ Writer gracefully?如何优雅地终止使用 Lucene NRT Reader/Writer 的进程?
【发布时间】:2012-01-26 03:15:35
【问题描述】:

我们正在使用 Lucene 的近乎实时的搜索功能在我们的应用程序中进行全文搜索。由于提交成本很高,假设我们在每添加 10 个文档后提交索引(我们预计每小时大约 150 到 200 个文档进行索引)。现在,如果我想终止我的进程,我如何确保在我的进程被终止之前将内存中的所有文档都提交到磁盘?这里有什么推荐的方法吗?还是我的文档量太少而无需担心,我应该在每次添加时都承诺吗?

我应该跟踪所有未提交的文档吗?如果进程在提交到磁盘之前被杀死,我应该在进程启动时再次索引这些未提交的进程吗?

Lucene NRT 用于运行嵌入式 Jetty 的进程。向码头发送关闭命令(调用一些 servlet)并等待所有文档提交然后使用 System.exit() 终止是正确的方法吗?

【问题讨论】:

    标签: lucene lucene-nrt


    【解决方案1】:

    您可以添加一个钩子来提交您的 servlet 的 destroy 方法中的所有缓冲文档,并确保在调用 System.exit 之前关闭嵌入式 servlet 容器(可能通过向 JVM 添加一个 shutdown hook )。

    但这仍然不完美。如果您的进程被杀死,所有缓冲的数据都将丢失。另一种解决方案是使用软提交。软提交是廉价的提交(不执行 fsync),因此如果您的进程被终止,则不会丢失任何数据(但如果服务器意外关闭,数据仍可能丢失)。

    总结一下:

    • 关机挂钩
      • 最佳吞吐量
      • 如果进程被杀死,数据可能会丢失
    • 软提交
      • 如果进程被杀死,不会丢失任何数据
      • 如果服务器意外关闭,数据可能会丢失
    • 硬提交(默认)
      • 完全没有数据丢失
      • 慢(需要执行 fsync)

    【讨论】:

    • 如何在 lucene 中进行软提交?在google上搜索时找不到任何资源。
    • 抱歉,这是 Solr 独有的功能。我认为它也可以在 Lucene 中使用,但事实并非如此,这意味着如果你想使用它,你必须自己实现它。你可以在wiki.apache.org/solr/UpdateXmlMessages 阅读一些关于它的文档,在issues.apache.org/jira/browse/SOLR-2193 阅读一些技术文档(最新的补丁包含软提交的工作实现)。
    猜你喜欢
    • 2011-01-04
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 2016-05-31
    • 1970-01-01
    相关资源
    最近更新 更多