FEATURED · 精选文章

DataHub Elasticsearch 与 OpenSearch 多客户端搜索 Shim 配置与迁移指南

发布时间 / 2026/9/16 15:40:44
来源 / 创域科博编辑部
栏目 / 资讯中心
DataHub Elasticsearch 与 OpenSearch 多客户端搜索 Shim 配置与迁移指南 DataHub Elasticsearch 与 OpenSearch 多客户端搜索 Shim 配置与迁移指南【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub本指南系统讲解 DataHub 的搜索客户端 shimSearch Client Shim机制通过一套统一抽象接口让同一份 DataHub 部署无缝对接 Elasticsearch 7.17、Elasticsearch 8.17 与 OpenSearch 2.x并支持在引擎之间平滑迁移。读完本文你将掌握 shim 的架构组成、全部配置项环境变量与 application.yaml、三类典型迁移场景的落地步骤、部署到 Docker Compose / Kubernetes / Helm 的方法以及验证、排障与扩展 shim 的完整实操路径。Overview为什么要引入多客户端 shimDataHub 的搜索客户端 shim 位于 metadata-io 模块的 shim 包 中其核心价值是屏蔽不同搜索引擎客户端 API 的差异让 DataHub 通过统一接口支持Elasticsearch 7.17基于 REST High Level ClientElasticsearch 8.17基于新版 Elasticsearch Java Clientco.elastic.clients:elasticsearch-javaOpenSearch 2.x基于 OpenSearch REST High Level Client在此基础上DataHub 可以在不同版本的搜索引擎之间平滑迁移同时保持对既有 DataHub 部署的向后兼容——已上线的代码仍然可以继续使用原有的RestHighLevelClient工作方式由 shim 在底层完成适配。注意当前仓库的工厂实现中SearchEngineType枚举还额外支持ELASTICSEARCH_9ES9与OPENSEARCH_3OS3配置字符串ES9/OS3也可被解析详见下文配置说明。Architectureshim 的核心组件与支持矩阵核心组件shim 由以下几部分组成SearchClientShim—— 主抽象接口统一封装所有搜索操作search、bulk、cluster info、feature detection 等SearchClientShimFactory—— 负责按配置创建合适的客户端实现Spring 侧的工厂见 SearchClientShimFactory.java实现类—— 针对每种搜索引擎的具象实现全部位于 shim/impl 目录Es7CompatibilitySearchClientShim—— ES 7.17兼容模式沿用 RestHighLevelClient 调用方式Es8SearchClientShim—— ES 8.17OpenSearch2SearchClientShim—— OpenSearch 2.x另有OpenSearchSearchClientShim、AbstractBulkProcessorShim、ElasticsearchRestClientAdapter等支撑类以及用于 AWS IAM 签名的AwsRequestSigningApacheInterceptor接口与实现还针对不同引擎派生了ElasticSearchClientShim/OpenSearchClientShim两个子接口并在 builder 目录 中提供了引擎专属的 kNN 查询与语义索引构建器Es8KnnQueryBuilder、OpenSearch2KnnQueryBuilder等。支持配置矩阵源引擎目标引擎Shim 实现状态DataHub → ES 7.17ES 7.17Es7CompatibilitySearchClientShim✅ CompleteDataHub → ES 8.17ES 8.17Es8SearchClientShim✅ CompleteDataHub → OpenSearch 2.xOpenSearch 2.xOpenSearch2SearchClientShim✅ Complete对应的客户端依赖分别为org.elasticsearch.client:elasticsearch-rest-high-level-clientES 7.17、co.elastic.clients:elasticsearch-javaES 8.x与org.opensearch.client:opensearch-rest-high-level-clientOpenSearch 2.x。关键特性自动探测Auto-detection启动时连接集群自动识别引擎类型与版本配置驱动也可通过配置显式指定具体客户端实现向后兼容既有代码可继续使用RestHighLevelClient的调用习惯特性探测支持查询各引擎特有的能力如语义搜索 kNN 引擎。Configurationshim 的完整配置说明环境变量方式# 启用搜索客户端 shim必填默认 false即使用 legacy 客户端 ELASTICSEARCH_SHIM_ENABLEDtrue # 指定引擎类型或使用 AUTO_DETECT ELASTICSEARCH_SHIM_ENGINE_TYPEAUTO_DETECT # 可选值AUTO_DETECT, ELASTICSEARCH_7, ELASTICSEARCH_8, OPENSEARCH_2 # 启用自动探测推荐默认 true ELASTICSEARCH_SHIM_AUTO_DETECTtrue从源码看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.enabledtrue时工厂会使用Math.max(global, mae)合并 MAE Consumer 的 RestClient 超时配置使 MAE 索引写入与 GMS 共享同一个客户端。程序化创建 shimJava 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_ENABLEDtrue ELASTICSEARCH_SHIM_ENGINE_TYPEELASTICSEARCH_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.xELASTICSEARCH_SHIM_ENABLEDtrue ELASTICSEARCH_SHIM_ENGINE_TYPEOPENSEARCH_2 ELASTICSEARCH_SHIM_AUTO_DETECTtrueOpenSearch 2.x 场景支持可选的 AWS IAM 认证通过opensearchUseAwsIamAuth与region配置启用后shim 会使用进程级共享的defaultAwsCredentialsProvider进行请求签名。源码中的assertIamAuthHasSharedCredentials校验会强制要求该 provider 非空否则启动即报错详见 SearchClientShimFactory.java。对应的OpenSearch2SearchClientShimIamCredentialsTest测试覆盖了 IAM 凭据场景。场景三自动探测推荐让 DataHub 自动识别搜索引擎类型ELASTICSEARCH_SHIM_ENABLEDtrue ELASTICSEARCH_SHIM_ENGINE_TYPEAUTO_DETECT ELASTICSEARCH_SHIM_AUTO_DETECTtrueshim 将自动执行三步连接你的搜索集群识别引擎类型与版本选择对应的客户端实现。对应日志形如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_ENABLEDtrue - ELASTICSEARCH_SHIM_ENGINE_TYPEAUTO_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_TYPEELASTICSEARCH_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_LEVELDEBUG ELASTICSEARCH_SHIM_DEBUGtrue性能监控迁移期间监控关键指标# 连接池指标 curl http://localhost:8080/actuator/metrics/elasticsearch.connections # 搜索操作指标 curl http://localhost:8080/actuator/metrics/elasticsearch.search # 错误率 curl http://localhost:8080/actuator/metrics/elasticsearch.errorsBest 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.17ES 8.xOpenSearch 2.x0.3.15✅ Full✅ 8.17✅ FullFuture✅ Full✅ Full✅ FullFAQQ已有部署可以直接使用 shim 吗A可以。shim 完全向后兼容它只是现有代码之上的一层薄抽象既有调用方式无需改动。Q能否同时使用多个搜索引擎A不能。DataHub 在同一时刻只连接一个搜索集群。shim 的价值在于让你在不同引擎类型之间切换而非并行连接多个集群。Qshim 与语义搜索semantic search如何配合A从工厂源码可见若启用了语义搜索ES 8 shim 会校验集群版本达到 8.18ES 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),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻