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

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

配置多个实例

为了最小化问题并限制意外行为,所有分片的实例配置、网络配置和索引配置应当保持一致。本指南描述了在单个实例上需要执行的独立步骤,并假设您将在所有实例上复制这些步骤。

先决条件

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

激活 /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 会立即响应,确认路由已可访问。在所有实例上重复此过程。

配置网络对象

接下来,您需要配置网络对象。它包含以下字段:

  • 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 建议使用会合哈希对主键进行哈希计算。

更新索引设置

在分片数据库中更改设置与在单个 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 的存在,即使在名为 "ms-00" 的实例查询列表中出现 "remote": "ms-00" 也不会导致实际的代理搜索。