DataHub Elasticsearch 与 OpenSearch 多客户端搜索 Shim 配置与迁移指南
2026/9/16 15:40:32 网站建设 项目流程

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 由以下几部分组成:

  1. SearchClientShim—— 主抽象接口,统一封装所有搜索操作(search、bulk、cluster info、feature detection 等);
  2. SearchClientShimFactory—— 负责按配置创建合适的客户端实现,Spring 侧的工厂见 SearchClientShimFactory.java;
  3. 实现类—— 针对每种搜索引擎的具象实现,全部位于 shim/impl 目录:
    • Es7CompatibilitySearchClientShim—— ES 7.17(兼容模式,沿用 RestHighLevelClient 调用方式)
    • Es8SearchClientShim—— ES 8.17+
    • OpenSearch2SearchClientShim—— OpenSearch 2.x
    • 另有OpenSearchSearchClientShimAbstractBulkProcessorShimElasticsearchRestClientAdapter等支撑类,以及用于 AWS IAM 签名的AwsRequestSigningApacheInterceptor

接口与实现还针对不同引擎派生了ElasticSearchClientShim/OpenSearchClientShim两个子接口,并在 builder 目录 中提供了引擎专属的 kNN 查询与语义索引构建器(Es8KnnQueryBuilderOpenSearch2KnnQueryBuilder等)。

支持配置矩阵

源引擎目标引擎Shim 实现状态
DataHub → ES 7.17ES 7.17Es7CompatibilitySearchClientShim✅ Complete
DataHub → ES 8.17+ES 8.17+Es8SearchClientShim✅ Complete
DataHub → OpenSearch 2.xOpenSearch 2.xOpenSearch2SearchClientShim✅ 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/ES7ELASTICSEARCH_8/ES8ELASTICSEARCH_9/ES9OPENSEARCH_2/OS2OPENSEARCH_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_8

Step 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=true

OpenSearch 2.x 场景支持可选的 AWS IAM 认证:通过opensearchUseAwsIamAuthregion配置启用后,shim 会使用进程级共享的defaultAwsCredentialsProvider进行请求签名。源码中的assertIamAuthHasSharedCredentials校验会强制要求该 provider 非空,否则启动即报错(详见 SearchClientShimFactory.java)。对应的OpenSearch2SearchClientShimIamCredentialsTest测试覆盖了 IAM 凭据场景。

场景三:自动探测(推荐)

让 DataHub 自动识别搜索引擎类型:

ELASTICSEARCH_SHIM_ENABLED=true ELASTICSEARCH_SHIM_ENGINE_TYPE=AUTO_DETECT ELASTICSEARCH_SHIM_AUTO_DETECT=true

shim 将自动执行三步:

  1. 连接你的搜索集群;
  2. 识别引擎类型与版本;
  3. 选择对应的客户端实现。

对应日志形如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: true

Validation and Testing:迁移后的验证与测试

验证 shim 配置生效

  1. 检查日志中的 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。)

  1. 在 DataHub UI 中测试搜索功能

    • 搜索数据集(dataset)
    • 浏览数据资产
    • 检查血缘(lineage)是否正常
  2. 在切换期间监控性能

    • 关注连接错误
    • 检查响应时间
    • 监控资源使用情况

通用验证步骤

# 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_HOSTELASTICSEARCH_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)

  1. 备份数据,再进行搜索引擎配置变更
  2. 在预发环境测试,使用有代表性的数据量
  3. 监控当前部署的资源使用模式
  4. 记录当前配置,用于回滚场景

迁移中(During Migration)

  1. 先启用自动探测,让切换过程更平滑
  2. 密切监控日志中的连接与性能问题
  3. 配置变更后测试所有搜索功能

迁移后(Post-Migration)

  1. 更新文档以反映新配置
  2. 持续监控性能指标数天
  3. 规划未来升级(如 ES 8.x 原生支持、语义搜索 8.18+ 能力)
  4. 培训团队成员掌握新配置项

扩展 shim 支持新的搜索引擎

如需为 shim 增加新的搜索引擎支持,可遵循以下步骤(对应 shim 包 README 的扩展指南):

  1. 实现SearchClientShim接口,适配目标客户端
  2. SearchEngineType枚举中新增引擎类型
  3. 更新工厂逻辑SearchClientShimFactory/SearchClientShimUtil),创建对应实现
  4. 在 application.yaml 中增加配置项
  5. 编写测试与文档(参照现有Es7CompatibilitySearchClientShimTestEs8SearchClientShimConversionTestOpenSearch2SearchClientShimClusterInfoTest等测试的组织方式)

Support Matrix 与 FAQ

支持矩阵

DataHub 版本ES 7.17ES 8.xOpenSearch 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询