是否可以在亚秒级时间内切换到 Solr 新索引?
Is it possible to cutover to a Solr new index in sub-second time?
我一直在想的事情。假设我有一个 solr 实现,它有一个非常大的索引,并且由于每天导入新数据,索引必须每晚重建。可以有一个作业将新数据索引到 "off-line" 的索引中,然后在完全索引后切换到新索引吗?这实际上意味着我的搜索索引只会被搜索而不会实时更新——只有在新索引被切换时才会被实时更新。
提前感谢 any/all 的回复。
-- 毫克
在这种情况下,您需要创建两个核心。
- SearchCore - 用于搜索
- IndexingCore - 用于索引
在 IndexingCore 中成功完成索引时。您需要 swap 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
我会用 Aliases 来解决这个问题(假设您使用的是 Solrcloud):
- 说你的 collection 叫做 'current'
- 您创建了一个指向 'current'
的别名 a_current
- 您的客户端代码不会调用 'current' collection 本身,而只是调用 'a_current'
- 只要你需要,你就可以用新数据创建一个新的 collection,比如 current_2
- 在一次操作中,无需停机,使用与之前相同的 CREATEALIAS 命令,将 a_current 指向 current_2
如果您不是在谈论同一集群或 solr 服务器上的核心或集合,请不要使用 Solr 来分发请求(这需要您保持专用的 Solr 服务器在线才能将其用作分片端点而不做任何有用的事情)。
使用常规 HTTP 负载平衡器并将其指向活动的 Solr 服务器。在将负载切换到它之前,请务必在您的 Solr 服务器上使用新索引使用适当的预热查询(以避免服务器刚上线时的缓慢查询)。负载均衡器也可以向两个节点发送查询(但只有 return 来自主服务器的响应),让您动态预热新服务器,同时仍然服务于旧服务器的请求。
让我们看看两种主要可能的情况:
单个 Solr 实例
- 您创建了 2 个核心:A、B
- 在线
- re-index乙(离线)
- 准备好后交换 [1]
/solr/admin/cores?action=SWAP&core=A&other=B
N.B。您搜索客户端将始终指向 A
SolrCloud 架构
- 你创建了 2 collections : A, B
- 您为 A [2] 分配了一个别名:
/admin/collections?action=CREATEALIAS&name=online_search&collections=A
N.B。您的搜索客户端将访问 'online_search' 个端点。
- 你re-indexcollectionB
- 准备好后,您将别名分配给 B[2]
/admin/collections?action=CREATEALIAS&name=online_search&collections=B
5.现在collectionA离线
[1] https://cwiki.apache.org/confluence/display/solr/CoreAdmin+API#CoreAdminAPI-SWAP
我一直在想的事情。假设我有一个 solr 实现,它有一个非常大的索引,并且由于每天导入新数据,索引必须每晚重建。可以有一个作业将新数据索引到 "off-line" 的索引中,然后在完全索引后切换到新索引吗?这实际上意味着我的搜索索引只会被搜索而不会实时更新——只有在新索引被切换时才会被实时更新。
提前感谢 any/all 的回复。 -- 毫克
在这种情况下,您需要创建两个核心。
- SearchCore - 用于搜索
- IndexingCore - 用于索引
在 IndexingCore 中成功完成索引时。您需要 swap 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
我会用 Aliases 来解决这个问题(假设您使用的是 Solrcloud):
- 说你的 collection 叫做 'current'
- 您创建了一个指向 'current' 的别名 a_current
- 您的客户端代码不会调用 'current' collection 本身,而只是调用 'a_current'
- 只要你需要,你就可以用新数据创建一个新的 collection,比如 current_2
- 在一次操作中,无需停机,使用与之前相同的 CREATEALIAS 命令,将 a_current 指向 current_2
如果您不是在谈论同一集群或 solr 服务器上的核心或集合,请不要使用 Solr 来分发请求(这需要您保持专用的 Solr 服务器在线才能将其用作分片端点而不做任何有用的事情)。
使用常规 HTTP 负载平衡器并将其指向活动的 Solr 服务器。在将负载切换到它之前,请务必在您的 Solr 服务器上使用新索引使用适当的预热查询(以避免服务器刚上线时的缓慢查询)。负载均衡器也可以向两个节点发送查询(但只有 return 来自主服务器的响应),让您动态预热新服务器,同时仍然服务于旧服务器的请求。
让我们看看两种主要可能的情况:
单个 Solr 实例
- 您创建了 2 个核心:A、B
- 在线
- re-index乙(离线)
- 准备好后交换 [1]
/solr/admin/cores?action=SWAP&core=A&other=B
N.B。您搜索客户端将始终指向 A
SolrCloud 架构
- 你创建了 2 collections : A, B
- 您为 A [2] 分配了一个别名:
/admin/collections?action=CREATEALIAS&name=online_search&collections=A N.B。您的搜索客户端将访问 'online_search' 个端点。
- 你re-indexcollectionB
- 准备好后,您将别名分配给 B[2]
/admin/collections?action=CREATEALIAS&name=online_search&collections=B 5.现在collectionA离线
[1] https://cwiki.apache.org/confluence/display/solr/CoreAdmin+API#CoreAdminAPI-SWAP