第14回:搜索系统的扩展策略 – 从小规模到大规模的阶段性扩展

前言

当以小规模引入 Fess 后,随着使用的扩大,不可避免地会出现”更多文档”、”更多用户”、”更快搜索”等需求。

本文将介绍从小规模单服务器配置到大规模集群配置的阶段性扩展策略和判断标准。

目标读者

  • 计划大规模运营 Fess 的人员

  • 面临性能问题的人员

  • 希望了解 OpenSearch 集群基本概念的人员

扩展的阶段

Fess 的扩展通常按照以下阶段进行。

扩展的阶段
阶段 配置 文档数量参考 用户数量参考 成本
S 单服务器 100万件以内 50人以内
M 分离配置 100万件以内 500人以内
L 集群配置 100万~1,000万件 数千人以内
XL 多实例 1,000万件以上 数千人以上 最高

阶段 S:单服务器配置

这对应于第2回中构建的 Docker Compose 配置。 Fess 和 OpenSearch 在同一台服务器上运行。

适用场景

  • 初始部署、PoC、中小规模组织

  • 文档数量在100万件以下

  • 并发搜索用户较少

调优要点

JVM 堆调整

分别为 Fess 和 OpenSearch 适当设置 JVM 堆大小。

  • Fess:最大 2GB(默认值。初始堆为 256MB)

  • OpenSearch:物理内存的 50% 以下,且不超过 32GB

线程池

根据服务器的 CPU 核心数调整爬取时的线程数。

阶段 M:分离配置

将 Fess 服务器和 OpenSearch 服务器进行物理分离。

适用场景

  • 并发搜索用户增加,爬取期间的搜索性能成为问题时

  • 在阶段 S 中内存或 CPU 开始不足时

配置

[Fess 服务器] <-> [OpenSearch 服务器]

在 Fess 设置中将 OpenSearch 的连接目标更改为外部服务器。

优势

  • 消除 Fess(爬取处理)和 OpenSearch(搜索处理)之间的资源竞争

  • 可以为每台服务器分配最优资源(CPU、内存)

  • OpenSearch 服务器的磁盘 I/O 独立

阶段 L:集群配置

将 OpenSearch 配置为集群,以提高搜索的冗余性和性能。

适用场景

  • 文档数量在100万~1,000万件

  • 需要高可用性时

  • 需要改善搜索响应时间时

配置示例

[Fess 服务器]
      |
[OpenSearch 节点 1](主节点/数据)
[OpenSearch 节点 2](数据)
[OpenSearch 节点 3](数据)

OpenSearch 集群通过分片和副本的概念来分布和冗余化数据。

分片(Shard):将索引分割并分布到多个节点上(通过并行处理实现加速)

副本(Replica):在不同节点上保存分片的副本(故障时的冗余性 + 搜索并行化)

配置要点

  • 分片数:根据文档数量和搜索性能设置(每个分片 10~50GB 为参考)

  • 副本数:至少 1 个(确保冗余性)

  • 节点数:至少 3 个(主节点选举所需的法定人数)

阶段 XL:多实例配置

将 Fess 本身也配置为多个实例,分散爬取和搜索处理。

适用场景

  • 文档数量超过 1,000万件

  • 需要并行执行大量爬取任务

  • 搜索请求频率高

配置示例

[负载均衡器]
  +-- [Fess 实例 1](搜索 + 管理)
  +-- [Fess 实例 2](搜索)
  +-- [Fess 实例 3](仅爬取)
          |
[OpenSearch 集群]
  +-- [节点 1](主节点)
  +-- [节点 2](数据)
  +-- [节点 3](数据)
  +-- [节点 4](数据)

从 Fess 15.6 开始,分布式协调器功能可以在多个 Fess 实例之间对维护操作(如索引重建和清除等)进行排他控制。

扩展判断流程图

当发生性能问题时,按照以下顺序确定原因并研究对策。

1. 搜索缓慢时

  • 检查 OpenSearch 集群状态

  • 检查 JVM 堆使用率

  • 检查索引大小

  • -> 考虑阶段 M(分离)或阶段 L(集群化)

2. 爬取缓慢或无法完成时

  • 检查爬取目标的文档数量

  • 调整线程数和间隔

  • 检查爬取期间对搜索的影响

  • -> 考虑阶段 M(分离)或阶段 XL(专用爬取实例)

3. 并发访问量大时

  • 监控搜索响应时间

  • 检查 Fess 服务器的 CPU 使用率

  • -> 考虑阶段 XL(负载均衡器 + 多实例)

JVM 调优

在任何阶段,JVM 调优都对性能有重大影响。

主要参数

JVM 参数
参数 说明 推荐值
-Xmx 最大堆大小 物理内存的 50% 以下
-Xms 初始堆大小 -Xmx 相同的值
GC 设置 垃圾回收方式 G1GC(默认)

堆大小参考

  • 100万件以下:2~4GB

  • 100万~500万件:8GB

  • 500万~1,000万件:16GB

  • 1,000万件以上:32GB 以上(OpenSearch 侧)

总结

本文介绍了 Fess 的阶段性扩展策略。

  • 阶段 S:单服务器(100万件以内)

  • 阶段 M:Fess / OpenSearch 分离(100万件以内,多用户支持)

  • 阶段 L:OpenSearch 集群化(100万~1,000万件)

  • 阶段 XL:Fess 多实例(1,000万件以上)

  • 扩展判断流程图和 JVM 调优

通过”从小规模开始,根据需要逐步扩大”的方式,可以在控制成本的同时根据需求进行扩展。

下一回将讨论安全架构。

参考资料