是否有可能在亚秒级内切换到Solr新索引?

时间:2017-04-07 21:08:37

标签: apache-spark indexing solr batch-processing

我一直想着的东西。假设我有一个索引非常大的solr实现,并且由于每天导入的新数据,必须每晚重建索引。可以有一个工作,将新数据索引到一个索引,即离线"当它完全索引时切换到新索引?这实际上意味着我的搜索索引只会被搜索并且永远不会实时更新 - 只有当新索引被切换时才会被更新。

提前感谢任何/所有回复。 - MG

4 个答案:

答案 0 :(得分:1)

在这种情况下,您需要创建两个核心。

  • SearchCore - 搜索
  • IndexingCore - 用于索引

IndexingCore 中成功完成索引编制。您需要交换 IndexingCore与 SearchCore

http://localhost:8983/solr/admin/cores?action=SWAP&core=IndexingCore&other=SearchCore

此SearchCore将指向IndexingCore数据目录,反之亦然。然后你可以卸载 IndexingCore,这样它就不会占用内存。

http://localhost:8983/solr/admin/cores?action=UNLOAD&core=IndexingCore

答案 1 :(得分:1)

我会用Aliases解决这个问题(假设您使用的是Solrcloud):

  1. 说您的收藏名称为'当前'
  2. 您创建了一个指向'当前'
  3. 的别名a_current
  4. 您的客户端代码未调用“当前'收集本身,而只是调用' a_current'
  5. 无论何时需要,您都可以创建一个包含新数据的新集合,例如current_2
  6. 在一次操作中,没有停机时间,使用与以前相同的CREATEALIAS命令,将a_current指向current_2

答案 2 :(得分:1)

让我们看看两种主要的可能情景:

单个Solr实例

  1. 您创建了2个核心:A,B
  2. 在线
  3. 重新索引B(离线)
  4. 准备好后换掉[1]
  5. / solr的/管理/芯动作= SWAP&安培;核心= A和其他= B

    N.B。您搜索客户端将始终指向A

    SolrCloud架构

    1. 您创建了2个集合:A,B
    2. 您为A [2]指定别名:
    3. /管理/集动作= CREATEALIAS&安培;命名= online_search&安培;集合= A 注:您搜索客户端将访问' online_search'端点。

      1. 你重新索引集合B
      2. 准备好后,将别名分配给B [2]
      3. /管理/集动作= CREATEALIAS&安培;命名= online_search&安培;集合= B  5.现在集合A离线

        [1] https://cwiki.apache.org/confluence/display/solr/CoreAdmin+API#CoreAdminAPI-SWAP

        [2] https://cwiki.apache.org/confluence/display/solr/Collections+API#CollectionsAPI-CREATEALIAS:CreateorModifyanAliasforaCollection

答案 3 :(得分:0)

如果您不是在谈论同一群集或solr服务器上的核心或集合,请不要使用Solr来分发请求(这需要您将专用的Solr服务器保持在线才能使用它作为一个分片端点,没有做任何有用的事情)。

使用常规HTTP负载均衡器并将其指向活动的Solr服务器。在将负载切换到它之前,请务必使用新索引在Solr服务器上使用正确的加温查询(以避免在服务器联机时进行慢速查询)。负载均衡器也可以向两个节点发送查询(但只返回主服务器的响应),以便在仍然为旧服务器提供请求时动态加热新服务器。