前言
当您希望将 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 提供 simple、docsearch、codesearch 等内置主题,同时也支持自定义主题。
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 堆大小
租户的添加与删除
将添加新租户的流程标准化。
创建标签
创建角色
注册爬虫设置
配置虚拟主机
发放访问令牌
添加 DNS 设置
删除租户时,请不要忘记删除相关的索引数据。
扩展判断标准
当出现以下征兆时,应考虑拆分或扩展 Fess 实例(参见第14回)。
搜索响应时间恶化
爬虫未能在计划时间内完成
频繁出现内存不足错误
租户数超过10个
总结
本文介绍了利用 Fess 虚拟主机功能的多租户设计。
通过虚拟主机实现租户专属访问
通过标签和角色实现数据隔离
通过租户主题实现品牌化
通过 API 访问令牌实现租户隔离
资源管理与扩展判断标准
通过一个 Fess 实例,可以高效地为多个租户提供服务,在降低管理成本的同时满足各租户的需求。
下一回将介绍搜索系统的扩展策略。