使用远程联合搜索实现分片 实验性

    分片是将包含大量文档的索引拆分为多个较小索引的过程,通常称为分片。这种水平扩展技术在处理大型数据库时非常有用。在 Meilisearch 中,实现分片策略的最佳方法是使用远程联合搜索。

    本指南将引导您完成激活 /network 路由、配置网络对象以及执行远程联合搜索的过程。

    配置多个实例

    为了最大限度地减少问题并限制意外行为,所有分片的实例、网络和索引配置应相同。本指南描述了您必须在单个实例上执行的各个步骤,并假设您将在所有实例中复制这些步骤。

    先决条件

    激活 /network 端点

    Meilisearch Cloud

    如果您正在使用 Meilisearch Cloud,请联系支持人员以在您的项目中启用此功能。

    自托管

    使用 /experimental-features 路由启用 network

    curl \
      -X PATCH 'MEILISEARCH_URL/experimental-features/' \
      -H 'Content-Type: application/json'  \
      --data-binary '{
        "network": true
      }'
    

    Meilisearch 应该立即响应,确认该路由现在可以访问。对所有实例重复此过程。

    配置网络对象

    接下来,您必须配置网络对象。它包含以下字段

    设置远程列表

    使用 /network 路由配置网络对象的 remotes 字段。 remotes 应该是一个包含一个或多个对象的对象。每个嵌套对象都应包含每个实例的名称,并与其 URL 和具有搜索权限的 API 密钥相关联

    curl \
      -X PATCH 'MEILISEARCH_URL/network' \
      -H 'Content-Type: application/json' \
      --data-binary '{
        "remotes": {
          "REMOTE_NAME_1": {
            "url": "INSTANCE_URL_1",
            "searchApiKey": "SEARCH_API_KEY_1"
          },
          "REMOTE_NAME_2": {
            "url": "INSTANCE_URL_2",
            "searchApiKey": "SEARCH_API_KEY_2"
          },
          "REMOTE_NAME_3": {
            "url": "INSTANCE_URL_3",
            "searchApiKey": "SEARCH_API_KEY_3"
          },
          …
        }
      }'
    

    在您的分片数据库中配置整套远程实例,确保将相同的远程实例发送到每个实例。

    指定当前实例的名称

    现在所有实例都共享相同的远程列表,设置 self 字段以指定哪个远程实例对应于当前实例

    curl \
      -X PATCH 'MEILISEARCH_URL/network' \
      -H 'Content-Type: application/json' \
      --data-binary '{
        "self": "REMOTE_NAME_1"
      }'
    

    Meilisearch 在本地处理与 self 对应的远程实例上的搜索,而不是发出远程请求。

    添加或删除实例

    更改网络拓扑涉及根据您的哈希方案将一些文档从一个实例移动到另一个实例。

    由于 Meilisearch 不提供跨多个实例的原子性,因此您需要

    1. 接受迁移文档时的搜索停机时间
    2. 接受某些文档在迁移期间不会出现在搜索结果中
    3. 接受某些重复文档在迁移期间可能会出现在搜索结果中

    减少停机时间

    如果您的磁盘空间允许,您可以通过应用以下算法来减少停机时间

    1. 在每个远程实例中创建一个新的临时索引
    2. 计算每个文档的新实例
    3. 将文档发送到其新实例的临时索引
    4. 一旦 Meilisearch 将所有文档复制到其目标实例,将新索引与先前使用的索引交换
    5. 交换后删除临时索引
    6. 更新所有实例中的网络配置和搜索查询

    创建索引并添加文档

    在所有实例上使用相同的设置创建相同的空索引。保持设置和索引同步对于避免错误和意外行为非常重要,但并非严格要求。

    在所有实例之间分发您的文档。不要将同一文档发送到多个实例,因为这可能会导致重复的搜索结果。同样,您应该确保文档的所有未来版本都发送到同一实例。Meilisearch 建议您使用 Rendezvous 哈希对它们的主键进行哈希处理。

    更新索引设置

    在分片数据库中更改设置与在单个 Meilisearch 实例上更改设置没有根本区别。如果更新启用了某项功能(例如设置可过滤属性),请等到所有更改都已处理完毕,然后再在查询中使用 filter 搜索参数。同样,如果更新禁用了某项功能,请先从搜索请求中删除它,然后再更新设置。

    发送您的联合搜索请求,其中每个实例包含一个查询

    curl \
      -X POST 'MEILISEARCH_URL/multi-search' \
      -H 'Content-Type: application/json' \
      --data-binary '{
        "federation": {},
        "queries": [
          {
            "indexUid": "movies",
            "q": "batman",
            "federationOptions": {
              "remote": "ms-00"
            }
          },
          {
            "indexUid": "movies",
            "q": "batman",
            "federationOptions": {
              "remote": "ms-01"
            }
          }
        ]
      }'

    如果所有实例共享相同的网络配置,您可以将搜索请求发送到任何实例。由于 network.self,在具有该名称的实例上的查询列表中出现 "remote": "ms-00" 不会导致实际的代理搜索。