分片是将包含许多文档的索引拆分为多个较小索引(通常称为分片)的过程。这种横向扩展技术在处理大型数据库时非常有用。在 Meilisearch 中,实现分片策略的最佳方法是使用远程联邦搜索。 本指南将引导您通过激活 /network 路由、配置网络对象和执行远程联邦搜索来实施分片策略。

配置多个实例

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

先决条件

  • 多个运行 Meilisearch >=v1.13 的 Meilisearch 项目(实例)

激活 /network 端点

Meilisearch 云

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

自托管

使用 /experimental-features 路由启用 network
curl \
  -X PATCH 'MEILISEARCH_URL/experimental-features/' \
  -H 'Content-Type: application/json'  \
  --data-binary '{
    "network": true
  }'
Meilisearch 应立即响应,确认路由现在可访问。对所有实例重复此过程。

配置网络对象

接下来,您必须配置网络对象。它由以下字段组成
  • remotes:定义一个列表,其中包含访问每个远程实例所需的信息
  • self:指定已配置的 remotes 中哪一个对应于当前实例

设置远程列表

使用 /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 hashing 对其主键进行哈希处理。

更新索引设置

在分片数据库中更改设置与在单个 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" 不会导致实际的代理搜索。
© . This site is unofficial and not affiliated with Meilisearch.