第13回 多租户搜索平台 – 用一个Fess为多个组织提供服务的设计

前言

当您希望将 Fess 提供给公司内部的多个部门,或作为 MSP(托管服务提供商)提供给多个客户时,为每个租户分别构建 Fess 是低效的。

本文介绍一种多租户设计方案,通过一个 Fess 实例为多个租户(组织、部门或客户)提供服务。

目标读者

  • 希望为多个组织或部门提供搜索服务的人员

  • 对 Fess 多租户设计感兴趣的人员

  • 希望了解虚拟主机功能使用方法的人员

场景

假设某集团企业的 IT 部门为旗下3家子公司提供搜索服务。

租户配置
租户 域名 搜索对象
A公司(制造业) search-a.example.com 产品规格书、质量管理文档
B公司(零售业) search-b.example.com 门店手册、商品信息
C公司(服务业) search-c.example.com 客户服务手册、FAQ

每个租户有以下要求:

  • 租户之间的数据不可互相查看(数据隔离)

  • 每个租户需要不同的设计(品牌化)

  • 每个租户需要独立的爬虫设置

虚拟主机功能

使用 Fess 的虚拟主机功能,可以根据访问的主机名提供不同的搜索体验。

虚拟主机设置

在管理界面中设置虚拟主机的值。 通过将该值与爬虫设置和标签关联,可以实现每个租户的数据隔离。

设计要点

DNS / 负载均衡器配置

配置 DNS,使每个租户的域名指向同一台 Fess 服务器。

search-a.example.com → Fess 服务器 (192.168.1.100)
search-b.example.com → Fess 服务器 (192.168.1.100)
search-c.example.com → Fess 服务器 (192.168.1.100)

Fess 通过检查请求的 HTTP 头来判断访问的是哪个虚拟主机。 默认使用 Host 头,但可以通过 virtual.host.headers 设置指定任意头。 配置格式为 头名称:值=虚拟主机键 (例如:Host:search-a.example.com=tenant-a)。

租户隔离设计

数据隔离

租户间的数据隔离通过虚拟主机功能在文档上添加的 virtual_host 字段来实现。

通过虚拟主机隔离

在爬虫设置的”虚拟主机”字段中设置虚拟主机键后,被爬取的文档会被赋予 virtual_host 字段。 搜索时会自动按该字段进行过滤,通过各租户域名访问的用户只能在搜索结果中看到该租户的文档。

  • tenant-a:A公司的文档

  • tenant-b:B公司的文档

  • tenant-c:C公司的文档

此外,通过设置标签的”虚拟主机”字段,还可以按租户分离显示的标签。

通过角色隔离

当需要更严格的隔离时,可以结合基于角色的搜索(参见第5回)。 为每个租户创建角色,并将其分配给爬虫设置和用户。

爬虫设置的分离

各租户的爬虫设置独立管理。

各租户爬虫设置
租户 爬取对象 调度 标签
A公司 smb://fs-a/docs/ 每天 1:00 tenant-a
B公司 https://portal-b.example.com/ 每天 2:00 tenant-b
C公司 smb://fs-c/manuals/ 每天 3:00 tenant-c

租户主题

使用 Fess 的主题功能,可以为每个租户提供不同的设计。

主题设计

为每个租户准备与其品牌颜色和标志相匹配的主题。

  • A公司:适合制造企业的稳重设计(蓝色系)

  • B公司:适合零售业的明亮设计(绿色系)

  • C公司:适合服务业的亲切设计(橙色系)

虚拟主机与主题的联动

通过为每个虚拟主机切换主题,各租户的用户将看到带有自家品牌的搜索界面。

Fess 提供 simpledocsearchcodesearch 等内置主题,同时也支持自定义主题。

API 访问隔离

各租户的 API 访问令牌

为每个租户发放独立的访问令牌。 通过将角色与令牌关联,API 访问也会应用租户隔离。

访问令牌配置
租户 令牌名称 分配角色
A公司 tenant-a-api-token tenant-a-role
B公司 tenant-b-api-token tenant-b-role
C公司 tenant-c-api-token tenant-c-role

当各租户的系统通过 API 集成时(参见第11回),使用租户专属令牌可以确保无法访问其他租户的数据。

运维注意事项

资源管理

由于一个 Fess 实例为多个租户提供服务,因此需要注意资源分配。

  • 爬虫负载均衡:将各租户的爬虫调度错开,避免同时执行

  • 索引大小:监控所有租户的总索引大小

  • 内存:根据租户数和文档数调整 JVM 堆大小

租户的添加与删除

将添加新租户的流程标准化。

  1. 创建标签

  2. 创建角色

  3. 注册爬虫设置

  4. 配置虚拟主机

  5. 发放访问令牌

  6. 添加 DNS 设置

删除租户时,请不要忘记删除相关的索引数据。

扩展判断标准

当出现以下征兆时,应考虑拆分或扩展 Fess 实例(参见第14回)。

  • 搜索响应时间恶化

  • 爬虫未能在计划时间内完成

  • 频繁出现内存不足错误

  • 租户数超过10个

总结

本文介绍了利用 Fess 虚拟主机功能的多租户设计。

  • 通过虚拟主机实现租户专属访问

  • 通过标签和角色实现数据隔离

  • 通过租户主题实现品牌化

  • 通过 API 访问令牌实现租户隔离

  • 资源管理与扩展判断标准

通过一个 Fess 实例,可以高效地为多个租户提供服务,在降低管理成本的同时满足各租户的需求。

下一回将介绍搜索系统的扩展策略。

参考资料