【问题标题】:What is the best approach to guarantee commits in Apache SOLR?在 Apache SOLR 中保证提交的最佳方法是什么?
【发布时间】:2015-08-21 11:12:08
【问题描述】:

问题:在将数据持久化到磁盘和可见性都同等重要的情况下,如何使用 Apache SOLR 获得“保证提交”?

背景:我们有一个网站,它需要用于机器学习的高端搜索功能,还需要保证金融交易的承诺。我们只想将 SOLR 作为我们唯一的数据存储来保持简单,并且不想在旁边使用另一个数据库。

我似乎找不到这个问题的任何答案。金融交易最简单的解决方案似乎是在记录被持久化后定期查询 SOLR 以获取记录,但这可能需要更长的等待时间还是有更好的解决方案?

任何人都可以提出一个解决方案来实现 SOLR 的“保证提交”吗?

【问题讨论】:

    标签: solr solr4 solrcloud


    【解决方案1】:

    正如您在邮件列表中被告知的,Solr 没有交易。如果您从十几个客户端建立索引,并且某个地方发生了提交(autoSoftCommit、udpate 请求上的 commitWithin 或来自这十几个客户端之一的显式提交),则由这些客户端索引的所有文档所有搜索者都可以看到十几个客户。

    对于事务性数据库,发送更新的十几个客户端中的每一个都必须发出提交,这只会使该特定客户端所做的更改可见。

    Solr 通常不对提交做出任何保证。如果您同时发出十次提交,那很可能会超过 maxWarmingSearchers 配置,该配置通常设置为 2。这十次提交中的大多数实际上不会创建新的搜索器,这就是使新文档可见的原因。

    如果您以永远不会超过 maxWarmingSearchers 的方式进行手动提交,那么当该提交完成且没有错误时,您可以将其视为所有更改现在都可见的标志。

    【讨论】:

      【解决方案2】:

      答案是 Solr 不是设计为主要数据存储。它的数据结构和索引/检索是为其他用例设计的,即使表面上看起来像 CRUD。您应该将您的数据保存在其他地方,然后在 Solr 中建立索引 - 以便于查找的方式 - 稍后。与 Elasticsearch 和其他面向搜索的软件相同。

      如果您绝对必须将这些东西结合起来,请查看在 Cassandra 或其他类似数据库之上包含 Solr 的商业产品。

      【讨论】:

      • 我的问题是关于如何保证 SOLR 中的提交,而不是 SOLR 是否适用于初级。 MongoDB 也不保证提交,但可以使用两阶段提交和 mongos 日志文件在一定程度上保证提交。 SOLR 完全可以用作主数据存储... Guardian.uk 将其用作主数据库。如果您看到 SOLR 的创始人的一些演示......您可以看到他们建议将 SOLR 用作与 NoSql 数据库竞争的数据存储。
      • 我认为“推荐”这个词太强了。众所周知,Solr 满足一些 NoSQL 数据需求……但正如人们不断告诉你的那样,它的核心是搜索引擎,而不是数据库。 Solr 根本无法提供金融交易所需的那种保证。
      【解决方案3】:

      Solr 提供了两种类型的提交来持久化 solr 中的数据。

      • 软提交: 软提交将持久化到 Solr 数据结构中。 Solr 保证每次软提交后文档的可见性。它实际上并不将数据存储到磁盘中。因此,如果 Solr 实例出现故障,则无法恢复此信息。
      • Hard Commit: 应用程序每次将数据索引到 solr 时,都会执行数据的硬提交。硬提交将数据持久化到磁盘中,即使实例停机也可以恢复。频繁硬提交的缺点是,solr 必须频繁执行段合并,这是 CPU 密集型的。

      您可以根据需要在solrconfig.xml中配置autoCommit选项。

      <autoCommit>
        <maxDocs>10000</maxDocs>
        <maxTime>1000</maxTime>
        <openSearcher>false</openSearcher>
      </autoCommit>
      

      每种方法都有优点和缺点。您可以在 CloudSolr Understanding Transaction Logs, Soft Commit and Commit in SolrCloud 中找到有关 Apache Wiki Commits 的更多信息和来自 LucidWorks 关于提交的文章

      【讨论】:

      • 是的,我理解软提交和硬提交之间的区别,但这并不能回答我关于如何在应用层级别保证提交的问题。就像如何使用 SOLR 处理金融交易一样。我希望得到一个有人用来实现这一点的模式,比如 MongoDB 中的两阶段提交。
      猜你喜欢
      • 1970-01-01
      • 2015-07-28
      • 2017-07-23
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 2020-09-26
      相关资源
      最近更新 更多