DataHub Elasticsearch 与 OpenSearch 多客户端搜索 Shim 配置与迁移指南
【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub
本指南系统讲解 DataHub 的搜索客户端 shim(Search Client Shim)机制:通过一套统一抽象接口,让同一份 DataHub 部署无缝对接 Elasticsearch 7.17、Elasticsearch 8.17+ 与 OpenSearch 2.x,并支持在引擎之间平滑迁移。读完本文,你将掌握 shim 的架构组成、全部配置项(环境变量与 application.yaml)、三类典型迁移场景的落地步骤、部署到 Docker Compose / Kubernetes / Helm 的方法,以及验证、排障与扩展 shim 的完整实操路径。
Overview:为什么要引入多客户端 shim
DataHub 的搜索客户端 shim 位于 metadata-io 模块的 shim 包 中,其核心价值是屏蔽不同搜索引擎客户端 API 的差异,让 DataHub 通过统一接口支持:
- Elasticsearch 7.17:基于 REST High Level Client
- Elasticsearch 8.17+:基于新版 Elasticsearch Java Client(
co.elastic.clients:elasticsearch-java) - OpenSearch 2.x:基于 OpenSearch REST High Level Client
在此基础上,DataHub 可以在不同版本的搜索引擎之间平滑迁移,同时保持对既有 DataHub 部署的向后兼容——已上线的代码仍然可以继续使用原有的RestHighLevelClient工作方式,由 shim 在底层完成适配。
注意:当前仓库的工厂实现中,
SearchEngineType枚举还额外支持ELASTICSEARCH_9(ES9)与OPENSEARCH_3(OS3),配置字符串ES9/OS3也可被解析,详见下文配置说明。
Architecture:shim 的核心组件与支持矩阵
核心组件
shim 由以下几部分组成:
SearchClientShim—— 主抽象接口,统一封装所有搜索操作(search、bulk、cluster info、feature detection 等);SearchClientShimFactory—— 负责按配置创建合适的客户端实现,Spring 侧的工厂见 SearchClientShimFactory.java;- 实现类—— 针对每种搜索引擎的具象实现,全部位于 shim/impl 目录:
Es7CompatibilitySearchClientShim—— ES 7.17(兼容模式,沿用 RestHighLevelClient 调用方式)Es8SearchClientShim—— ES 8.17+OpenSearch2SearchClientShim—— OpenSearch 2.x- 另有
OpenSearchSearchClientShim、AbstractBulkProcessorShim、ElasticsearchRestClientAdapter等支撑类,以及用于 AWS IAM 签名的AwsRequestSigningApacheInterceptor
接口与实现还针对不同引擎派生了ElasticSearchClientShim/OpenSearchClientShim两个子接口,并在 builder 目录 中提供了引擎专属的 kNN 查询与语义索引构建器(Es8KnnQueryBuilder、OpenSearch2KnnQueryBuilder等)。
支持配置矩阵
| 源引擎 | 目标引擎 | Shim 实现 | 状态 |
|---|---|---|---|
| DataHub → ES 7.17 | ES 7.17 | Es7CompatibilitySearchClientShim | ✅ Complete |
| DataHub → ES 8.17+ | ES 8.17+ | Es8SearchClientShim | ✅ Complete |
| DataHub → OpenSearch 2.x | OpenSearch 2.x | OpenSearch2SearchClientShim | ✅ Complete |
对应的客户端依赖分别为org.elasticsearch.client:elasticsearch-rest-high-level-client(ES 7.17)、co.elastic.clients:elasticsearch-java(ES 8.x)与org.opensearch.client:opensearch-rest-high-level-client(OpenSearch 2.x)。
关键特性
- 自动探测(Auto-detection):启动时连接集群,自动识别引擎类型与版本;
- 配置驱动:也可通过配置显式指定具体客户端实现;
- 向后兼容:既有代码可继续使用
RestHighLevelClient的调用习惯; - 特性探测:支持查询各引擎特有的能力(如语义搜索 kNN 引擎)。
Configuration:shim 的完整配置说明
环境变量方式
# 启用搜索客户端 shim(必填;默认 false,即使用 legacy 客户端) ELASTICSEARCH_SHIM_ENABLED=true # 指定引擎类型(或使用 AUTO_DETECT) ELASTICSEARCH_SHIM_ENGINE_TYPE=AUTO_DETECT # 可选值:AUTO_DETECT, ELASTICSEARCH_7, ELASTICSEARCH_8, OPENSEARCH_2 # 启用自动探测(推荐;默认 true) ELASTICSEARCH_SHIM_AUTO_DETECT=true从源码看,SearchClientShimFactory通过@Value("${elasticsearch.shim.engineType:AUTO_DETECT}")与@Value("${elasticsearch.shim.autoDetectEngine:true}")读取配置,即engineType 默认AUTO_DETECT、autoDetectEngine 默认true。引擎类型字符串大小写不敏感,工厂还支持别名与额外类型:ELASTICSEARCH_7/ES7、ELASTICSEARCH_8/ES8、ELASTICSEARCH_9/ES9、OPENSEARCH_2/OS2、OPENSEARCH_3/OS3。
两条重要校验规则(来自 SearchClientShimFactory.java):
- 当autoDetectEngine 为 false时,engineType 必须显式指定,且不能是
AUTO_DETECT(会抛出IllegalArgumentException); - 当autoDetectEngine 为 true时,即使配置了 engineType 也会被忽略,直接走自动探测分支。
application.yaml 方式
elasticsearch: host: localhost port: 9200 username: ${ELASTICSEARCH_USERNAME:#{null}} password: ${ELASTICSEARCH_PASSWORD:#{null}} useSSL: false # 标准 Elasticsearch 配置... # 多客户端 shim 配置 shim: enabled: true # 启用 shim engineType: AUTO_DETECT # 或指定具体类型 ELASTICSEARCH_7 / ELASTICSEARCH_8 / OPENSEARCH_2 autoDetectEngine: true # 自动探测集群类型 apiCompatibilityMode: false # API 兼容模式(ES7 兼容场景可开启)除了host/port/username/password/useSSL等标准配置外,shim 构建时会透传更多底层参数:pathPrefix(路径前缀)、threadCount(线程数)、connectionRequestTimeout(连接请求超时)与socketTimeout(套接字超时)等。特别地,当maeConsumer.enabled=true时,工厂会使用Math.max(global, mae)合并 MAE Consumer 的 RestClient 超时配置,使 MAE 索引写入与 GMS 共享同一个客户端。
程序化创建 shim(Java SDK 用法)
如需在代码中直接创建,可参考 shim 包 README 中的用法:
// 指定引擎类型 SearchClientShim.ShimConfiguration config = new ShimConfigurationBuilder() .withEngineType(SearchEngineType.ELASTICSEARCH_7) .withHost("localhost") .withPort(9200) .withCredentials("user", "pass") .withApiCompatibilityMode(true) .build(); try (SearchClientShim shim = SearchClientShimFactory.createShim(config)) { // 使用 shim... } // 自动探测 SearchClientShim.ShimConfiguration config = new ShimConfigurationBuilder() .withHost("localhost") .withPort(9200) .build(); try (SearchClientShim shim = SearchClientShimFactory.createShimWithAutoDetection(config)) { SearchEngineType detectedType = shim.getEngineType(); String version = shim.getEngineVersion(); System.out.println("Detected: " + detectedType + " version " + version); }在 Spring 应用中,可直接注入:
@Autowired private SearchClientShim searchClientShim; public void searchExample() throws IOException { SearchRequest request = new SearchRequest("my-index"); SearchResponse response = searchClientShim.search(request, RequestOptions.DEFAULT); // 处理响应... }Migration Scenarios:三种典型迁移场景
场景一:Elasticsearch 7.17 → Elasticsearch 8.x(最常见迁移路径)
Step 1:启用 shim 并指定目标引擎
ELASTICSEARCH_SHIM_ENABLED=true ELASTICSEARCH_SHIM_ENGINE_TYPE=ELASTICSEARCH_8Step 2:验证连接
# 检查日志中的成功连接信息启动时观察 GMS 日志,确认出现类似Creating shim with configured engine type: ELASTICSEARCH_8的日志,且无连接异常。若同时启用了语义搜索,工厂会对 ES 8 shim 执行verifySemanticSearchSupport(),要求集群版本达到8.18+,不满足时会在启动阶段快速失败(fail-fast)。
场景二:Elasticsearch 7.17 → OpenSearch 2.x
直接从 Elasticsearch 迁移到 OpenSearch 2.x:
ELASTICSEARCH_SHIM_ENABLED=true ELASTICSEARCH_SHIM_ENGINE_TYPE=OPENSEARCH_2 ELASTICSEARCH_SHIM_AUTO_DETECT=trueOpenSearch 2.x 场景支持可选的 AWS IAM 认证:通过opensearchUseAwsIamAuth与region配置启用后,shim 会使用进程级共享的defaultAwsCredentialsProvider进行请求签名。源码中的assertIamAuthHasSharedCredentials校验会强制要求该 provider 非空,否则启动即报错(详见 SearchClientShimFactory.java)。对应的OpenSearch2SearchClientShimIamCredentialsTest测试覆盖了 IAM 凭据场景。
场景三:自动探测(推荐)
让 DataHub 自动识别搜索引擎类型:
ELASTICSEARCH_SHIM_ENABLED=true ELASTICSEARCH_SHIM_ENGINE_TYPE=AUTO_DETECT ELASTICSEARCH_SHIM_AUTO_DETECT=trueshim 将自动执行三步:
- 连接你的搜索集群;
- 识别引擎类型与版本;
- 选择对应的客户端实现。
对应日志形如INFO Auto-detecting search engine type for shim。自动探测的实现路径是SearchClientShimUtil.createShimWithAutoDetection(...),其行为由单元测试 SearchClientShimUtilTest.java 与集成测试 SearchClientShimElasticsearchIntegrationTest.java、SearchClientShimOpenSearchIntegrationTest.java 共同保障。
Deployment Guide:三种部署形态下的配置注入
Docker Compose
在docker-compose.yml中为 datahub-gms 服务注入环境变量:
services: datahub-gms: environment: - ELASTICSEARCH_SHIM_ENABLED=true - ELASTICSEARCH_SHIM_ENGINE_TYPE=AUTO_DETECT # ... 其他 ES 配置参考仓库中 profiles/docker-compose.yml 与 profiles/docker-compose.gms.yml 的组织方式,将 shim 变量并入既有环境变量段即可。
Kubernetes
更新 GMS 的 Deployment 清单:
apiVersion: apps/v1 kind: Deployment metadata: name: datahub-gms spec: template: spec: containers: - name: datahub-gms env: - name: ELASTICSEARCH_SHIM_ENABLED value: "true" - name: ELASTICSEARCH_SHIM_ENGINE_TYPE value: "AUTO_DETECT" # ... 其他配置Helm
更新 Helm 的values.yaml,将 shim 配置挂到global.elasticsearch下:
global: elasticsearch: shim: enabled: true engineType: "AUTO_DETECT" autoDetectEngine: trueValidation and Testing:迁移后的验证与测试
验证 shim 配置生效
- 检查日志中的 shim 初始化信息:
docker logs datahub-gms | grep -i "shim\|search"应能看到类似消息:
INFO Creating SearchClientShim for engine type: ELASTICSEARCH_7 INFO Auto-detected search engine type: ELASTICSEARCH_7(真实日志文本以当前版本源码为准,例如显式指定引擎时输出INFO Creating shim with configured engine type: ELASTICSEARCH_8,自动探测时输出INFO Auto-detecting search engine type for shim。)
在 DataHub UI 中测试搜索功能:
- 搜索数据集(dataset)
- 浏览数据资产
- 检查血缘(lineage)是否正常
在切换期间监控性能:
- 关注连接错误
- 检查响应时间
- 监控资源使用情况
通用验证步骤
# 1. 检查 DataHub 健康端点 curl http://localhost:8080/health # 2. 验证搜索索引可访问 curl -u user:pass "http://elasticsearch:9200/_cat/indices?v" # 3. 测试搜索功能(GraphQL) curl -X POST "http://localhost:8080/api/graphql" \ -H "Content-Type: application/json" \ -d '{"query": "{ search(input: {type: DATASET, query: \"*\"}) { total }}"}'仓库自带的测试资产也可作为参考:shim 相关单测覆盖了引擎探测、kNN 查询、索引设置对比、版本与集群信息获取等多个维度,如 SearchClientShimTest.java、Es7CompatibilitySearchClientShimTest.java、Es8SearchClientShimConversionTest.java 与 OpenSearch2SearchClientShimClusterInfoTest.java。
Troubleshooting:常见问题与排障
1. 连接失败
ERROR: Unable to connect to search cluster解决方案:
- 核对
ELASTICSEARCH_HOST与ELASTICSEARCH_PORT - 检查 DataHub 与搜索集群之间的网络连通性
- 确认凭据正确
- 检查 SSL/TLS 配置(ES8 容器默认启用 SSL,如果之前未启用 SSL,升级后可能因此导致连接失败)
2. 自动探测失败
ERROR: Unable to detect search engine type解决方案:
- 手动指定引擎类型:
ELASTICSEARCH_SHIM_ENGINE_TYPE=ELASTICSEARCH_8 - 检查集群健康:
curl http://elasticsearch:9200/_cluster/health - 验证认证凭据
3. API 兼容性问题
ERROR: Incompatible API version解决方案:
- 检查 Elasticsearch 版本兼容性
- 查看 ES 日志中的弃用(deprecation)警告
4. 依赖缺失
ERROR: ClassNotFoundException for ES client解决方案:
- 确认 classpath 中包含了正确的客户端依赖
- 检查 build.gradle 中所需依赖是否齐全
- 使用正确的客户端库重新构建 DataHub
开启调试模式
# 加入环境变量 DATAHUB_LOG_LEVEL=DEBUG ELASTICSEARCH_SHIM_DEBUG=true性能监控
迁移期间监控关键指标:
# 连接池指标 curl "http://localhost:8080/actuator/metrics/elasticsearch.connections" # 搜索操作指标 curl "http://localhost:8080/actuator/metrics/elasticsearch.search" # 错误率 curl "http://localhost:8080/actuator/metrics/elasticsearch.errors"Best Practices:迁移最佳实践
迁移前(Pre-Migration)
- 备份数据,再进行搜索引擎配置变更
- 在预发环境测试,使用有代表性的数据量
- 监控当前部署的资源使用模式
- 记录当前配置,用于回滚场景
迁移中(During Migration)
- 先启用自动探测,让切换过程更平滑
- 密切监控日志中的连接与性能问题
- 配置变更后测试所有搜索功能
迁移后(Post-Migration)
- 更新文档以反映新配置
- 持续监控性能指标数天
- 规划未来升级(如 ES 8.x 原生支持、语义搜索 8.18+ 能力)
- 培训团队成员掌握新配置项
扩展 shim 支持新的搜索引擎
如需为 shim 增加新的搜索引擎支持,可遵循以下步骤(对应 shim 包 README 的扩展指南):
- 实现
SearchClientShim接口,适配目标客户端 - 在
SearchEngineType枚举中新增引擎类型 - 更新工厂逻辑(
SearchClientShimFactory/SearchClientShimUtil),创建对应实现 - 在 application.yaml 中增加配置项
- 编写测试与文档(参照现有
Es7CompatibilitySearchClientShimTest、Es8SearchClientShimConversionTest、OpenSearch2SearchClientShimClusterInfoTest等测试的组织方式)
Support Matrix 与 FAQ
支持矩阵
| DataHub 版本 | ES 7.17 | ES 8.x | OpenSearch 2.x |
|---|---|---|---|
| 0.3.15+ | ✅ Full | ✅ 8.17+ | ✅ Full |
| Future | ✅ Full | ✅ Full | ✅ Full |
FAQ
Q:已有部署可以直接使用 shim 吗?
A:可以。shim 完全向后兼容,它只是现有代码之上的一层薄抽象,既有调用方式无需改动。
Q:能否同时使用多个搜索引擎?
A:不能。DataHub 在同一时刻只连接一个搜索集群。shim 的价值在于让你在不同引擎类型之间切换,而非并行连接多个集群。
Q:shim 与语义搜索(semantic search)如何配合?
A:从工厂源码可见,若启用了语义搜索:ES 8 shim 会校验集群版本达到 8.18+;ES 7 兼容模式(Es7CompatibilitySearchClientShim)下启用语义搜索会在启动阶段直接抛错;OpenSearch 3.x 上使用nmslibkNN 引擎同样会被拒绝(需改用 faiss 或 lucene)。这些校验均以快速失败的方式在启动时暴露配置错误,而不是等到查询时才报错。
【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考