使用远程联合搜索实现分片
本指南将引导您通过激活 /network
路由、配置网络对象和执行远程联合搜索来实施分片策略。
分片是将包含许多文档的索引拆分为多个较小索引(通常称为分片)的过程。这种水平扩展技术在处理大型数据库时非常有用。在 Meilisearch 中,实施分片策略的最佳方法是使用远程联合搜索。
本指南将引导您激活 /network
路由、配置网络对象和执行远程联合搜索。
配置多个实例
为了最大程度地减少问题并限制意外行为,所有分片的实例、网络和索引配置都应相同。本指南描述了您必须在单个实例上执行的各个步骤,并假设您将在所有实例上复制这些步骤。
先决条件
- 多个运行 Meilisearch >=v1.13 的 Meilisearch 项目(实例)
激活 /network
端点
Meilisearch Cloud
如果您使用的是 Meilisearch Cloud,请联系支持人员以在您的项目中启用此功能。
自托管
使用 /experimental-features
路由启用 network
Meilisearch 应立即响应,确认该路由现在可访问。对所有实例重复此过程。
配置网络对象
接下来,您必须配置网络对象。它包含以下字段:
remotes
:定义一个列表,其中包含访问每个远程实例所需的信息self
:指定已配置的remotes
中哪个对应于当前实例
设置远程列表
使用 /network
路由配置网络对象的 remotes
字段。remotes
应该是一个包含一个或多个对象的对象。每个嵌套对象都应包含每个实例的名称,并与其 URL 和具有搜索权限的 API 密钥相关联。
配置分片数据库中的整个远程实例集,确保向每个实例发送相同的远程配置。
指定当前实例的名称
现在所有实例共享相同的远程列表,设置 self
字段以指定哪个远程对应于当前实例
Meilisearch 会在对应于 self
的远程上本地处理搜索,而不是发起远程请求。
添加或删除实例
更改网络拓扑涉及根据您的哈希方案将某些文档从一个实例移动到另一个实例。
由于 Meilisearch 不提供跨多个实例的原子性,您需要:
- 接受文档迁移期间的搜索停机时间
- 接受在迁移期间某些文档不会出现在搜索结果中
- 接受在迁移期间搜索结果中可能出现一些重复文档
减少停机时间
如果您的磁盘空间允许,您可以通过应用以下算法来减少停机时间:
- 在每个远程实例中创建一个新的临时索引
- 计算每个文档的新实例
- 将文档发送到其新实例的临时索引
- 一旦 Meilisearch 将所有文档复制到其目标实例,将新索引与以前使用的索引交换
- 交换后删除临时索引
- 更新所有实例上的网络配置和搜索查询
创建索引并添加文档
在所有实例上创建相同的空索引,并使用相同的设置。保持设置和索引同步很重要,可以避免错误和意外行为,尽管这不是严格要求。
将文档分布到所有实例。不要将相同的文档发送到多个实例,因为这可能导致重复的搜索结果。同样,您应确保文档的所有未来版本都发送到同一个实例。Meilisearch 建议您使用 rendezvous hashing 对其主键进行哈希处理。
更新索引设置
在分片数据库中更改设置与在单个 Meilisearch 实例上更改设置没有根本区别。如果更新启用了一项功能,例如设置可过滤属性,请等到所有更改都处理完毕后再在查询中使用 filter
搜索参数。同样,如果更新禁用了某个功能,请首先从搜索请求中删除它,然后更新您的设置。
执行搜索
发送您的联合搜索请求,其中包含每个实例的一个查询
如果所有实例共享相同的网络配置,您可以将搜索请求发送到任何实例。由于 network.self
,将 "remote": "ms-00"
出现在该名称实例的查询列表中不会导致实际的代理搜索。