news 2026/9/23 13:59:26

OpenSearch 2.18.0 版本特性深度解读:Workload Management 弹性治理、Phone 号码分析器与集群可观测性增强

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenSearch 2.18.0 版本特性深度解读:Workload Management 弹性治理、Phone 号码分析器与集群可观测性增强

OpenSearch 2.18.0 版本特性深度解读:Workload Management 弹性治理、Phone 号码分析器与集群可观测性增强

【免费下载链接】OpenSearch🔎 Open source distributed and RESTful search engine.项目地址: https://gitcode.com/gh_mirrors/op/OpenSearch

本文围绕 OpenSearch 2.18.0 Release Notes(2024-10-28 发布)展开,系统梳理该版本在 Workload Management 查询组弹性、电话号码分析能力、S3 存储与快照、分层缓存、集群可观测性与 _list 系列分页 API 等方面的核心变化,并结合本仓库源码(server、plugins 目录)验证实现细节。读完本文,你将掌握 2.18.0 新增 API 的用法、phone 分析器的配置方式,以及各项增强背后的设计意图,为集群升级与功能选型提供依据。

一、版本概览:2.18.0 的关键主题

2.18.0 是 OpenSearch 在 2024 年 10 月 28 日发布的稳定版本,其核心主题可归纳为三方面:

  1. Workload Management(工作负载管理)进入弹性治理新阶段:新增 QueryGroupService 编排器、任务资源取消框架、QueryGroup Stats API,并补齐 CRUD 集成测试、跨进程持久化与多节点执行路径;
  2. 搜索与分析能力扩展:新增phone/phone-search分析器(位于新插件analysis-phonenumber)、msearch 管道、successfulSearchShardIndices追踪、Star Tree 指标聚合支持等;
  3. 存储、缓存与可观测性增强:S3 异步删除、增量全集群快照 clone 优化、分段缓存(Segmented Cache)、_list/indices_list/shards分页 API、REMOTE_STORE节点指标等。

同时,Lucene 从 9.11.1 升级至 9.12.0,Netty 升级至 4.1.114.Final,Log4j 升级至 2.24.0。

二、Workload Management:查询组弹性治理全面落地

Workload Management 是 2.18.0 中最具分量的一组新增功能,仓库中对应实现集中在 server/src/main/java/org/opensearch/wlm 与 server/src/main/java/org/opensearch/action/admin/cluster/wlm。

2.1 QueryGroupService 编排器(#15925)

新增的QueryGroupService是 WLM 弹性机制(resiliency)的核心编排器,负责查询组的生命周期管理、状态维护与跨组件协调。从 WorkloadGroupService.java 可以看出,查询组以系统索引为存储载体,配合WorkloadGroupTaskWorkloadGroupThreadContextStatePropagatorWorkloadGroupsStateAccessor等类完成状态传播与访问控制。

2.2 资源取消框架(#15651)

wlm/cancellation包引入任务取消框架:

  • TaskSelectionStrategy.java:定义"取消哪个任务"的策略抽象;
  • MaximumResourceTaskSelectionStrategy.java:默认策略,优先取消占用资源最多的任务;
  • WorkloadGroupTaskCancellationService.java:取消服务的具体实现。

配套的 #16417 增强了 WLM 的拒绝(rejection)机制,使超限查询组能获得更可控的反馈。

2.3 QueryGroup Stats API(#15777)

新增_plugins/_wlm/query_group/stats类统计接口,底层为 WlmStatsAction.java,其 Action 名为cluster:monitor/wlm/stats,响应结构由 WlmStatsResponse.java 承载,并支持SortBySortOrder排序(见 stats/SortBy.java)。状态视图包括 WorkloadGroupState.java 与 WorkloadGroupStats.java,资源使用情况由 WorkloadGroupLevelResourceUsageView.java 呈现。该 API 标注为@opensearch.experimental,属实验特性,生产使用前需关注后续版本稳定性。

2.4 CRUD 集成测试与健壮性修复

  • #15955 为 WLM CRUD API 补充了集成测试;
  • #16370 使查询组在进程重启后依然持久(persistent across restarts);
  • #16422 修复了 Create/Update QueryGroup TransportAction 只能在集群管理器节点执行的问题,现在可从任意非集群管理器节点发起。

2.5 动态设置与拦截器

WorkloadManagementSettings.java 定义各阈值设置,WorkloadManagementTransportInterceptor.java 负责在传输层拦截并归属请求到对应查询组,WorkloadGroupRequestOperationListener.java 作为请求操作监听器嵌入执行流程。

三、新增 phone 与 phone-search 分析器(#15915)

2.18.0 引入全新插件analysis-phonenumber,提供phonephone-search两种分析器,专用于电话号码字段的索引与检索。实现位于 plugins/analysis-phonenumber/src/main/java/org/opensearch/analysis/phone。

3.1 设计理念:索引与搜索分离

  • phone分析器:用于索引阶段(analyzer),会生成电话号码的ngram前缀词元(如191919…),支持前缀模糊匹配;
  • phone-search分析器:用于检索阶段(search_analyzer),不生成 ngram,只输出完整号码词元,避免查询时误匹配其他国家的号码。

两者共用 PhoneNumberTermTokenizer.java,通过构造参数addNgrams区分行为(索引为 true、搜索为 false),详见 PhoneNumberAnalyzer.java 的createComponents实现。

3.2 底层 token 化逻辑

PhoneNumberTermTokenizer.java 的getTokens()依次执行:

  1. 保留原始输入作为词元;
  2. 剥离tel:sip:前缀(索引模式下会额外保留该前缀词元);
  3. 去掉开头的+
  4. 截断@之后的域名部分(适配 SIP 地址);
  5. 调用 GooglelibphonenumberPhoneNumberUtil)解析号码,提取国家码与国内号码,产出countryCode + nationalNumber完整词元;
  6. 索引模式下对纯数字串生成所有长度的前缀 ngram,若存在国家码,还会生成countryCode + prefix形式的扩展 ngram。

如果号码无法被 libphonenumber 解析(例如NumberParseException),则退化为直接按原始输入 ngram,保证"垃圾进、垃圾出"而非抛错。

3.3 phone-region 设置

可通过phone-region设置指定默认区域(ISO 3166-1 国家码,如CHUS),使不带+国际前缀的号码也能被正确解析。测试配置 phone_analysis.json 展示了完整写法:

{ "index": { "analysis": { "analyzer": { "phone": { "type": "phone" }, "phone-search": { "type": "phone-search" }, "phone-ch": { "type": "phone", "phone-region": "CH" }, "phone-search-ch":{ "type": "phone-search", "phone-region": "CH" } } } } }

在索引映射中的典型用法:

PUT /contacts { "settings": { "analysis": { "analyzer": { "phone": { "type": "phone" }, "phone-search": { "type": "phone-search" } } } }, "mappings": { "properties": { "phone_number": { "type": "text", "analyzer": "phone", "search_analyzer": "phone-search" } } } }

3.4 词元行为验证(源码测试)

PhoneNumberAnalyzerTests.java 给出了可复现的词元输出示例:

  • 输入tel:+441344840400phone分析器产出tel:444411313441344840400441344840400等 ngram 词元;
  • 同一输入经phone-search分析器仅产出tel:+441344840400441344840400两个词元;
  • SIP 地址sip:+14177141363@178.97.105.13;...可提取出417417714177
  • 带分机号sip:+13169410766;ext=2233@...会产出扩展号词元2233

YAML REST 测试见 10_basic.yml 与 20_search.yml。

四、存储、快照与远程仓库增强

4.1 S3BlobContainer 异步删除(#15621)

为 S3 仓库的BlobContainer增加异步删除能力,减少删除大量分片 blob 时对传输线程的阻塞。该项配合 #15978 ——S3 客户端默认重试机制由旧模式切换为 Standard Mode(AWS SDK 的标准重试模式),使重试行为更可预期、吞吐表现更稳定。

4.2 增量全集群快照 clone 优化(#16296)

优化增量全集群快照(incremental full cluster snapshot)的 clone 操作路径,降低重复数据拷贝开销。同时 #16292 支持在快照恢复(snapshot restore)过程中重命名 alias,为恢复场景提供了更大的灵活性。

4.3 其他相关修复

  • #16194:修复安装 repository-s3 插件后启动时 SLF4J 警告;
  • #16254:修复通过客户端依赖泄漏 protobuf-java 的问题;
  • #16201:修复任务索引映射缺少字段导致任务结果无法正确存储的问题。

五、缓存、查询与索引优化

5.1 Tiered Caching 分段缓存(#16047)

分段缓存(Segmented Cache)是分片请求缓存(shard request cache)的分段化演进,将缓存按段(segment)组织,配合查询取消机制可减少缓存失效与内存抖动,为大型集群的查询缓存命中率优化提供基础。

5.2 flat_object 字段查询优化(#14383)

flat_object字段改用IndexOrDocValuesQuery执行查询:当索引中存在可用倒排索引时走索引查询,否则回退 doc values,显著改善flat_object字段的过滤与匹配性能。同时 #15985 修复了flat_object字段包含非法 token 时可能陷入无限循环的问题,#16273 清理并移除了旧的ApproximateIndexOrDocValuesQuery实现。

5.3 Star Tree 指标聚合(#15289)

Star Tree 搜索路径新增对metric 聚合(含/不含 term query)的支持,使星树预聚合索引能直接服务更多聚合查询模式,减少实时计算开销。

5.4 通配符与搜索相关修复

  • #15737:修复通配符查询中含转义字符的解析问题;
  • #15882:修复通配符字段上的大小写不敏感查询;
  • #15988:修复search_as_you_type不支持多字段(multi-fields)的问题;
  • #15931:修复嵌套聚合(nested agg)中的无限循环;
  • #14948:修复将 replica 显式设为 null 时更新设置不生效的集群设置 bug;
  • #16331:修复建索引时index.number_of_routing_shards设为 null 的默认值错误。

六、集群管理与可观测性

6.1 _list/indices 与 _list/shards 分页 API(#14718、#14641)

2.18.0 引入_list/indices_list/shards,作为_cat/indices_cat/shards的分页替代方案,解决超大集群下 cat 输出行数爆炸的问题。二者与 #15986 配套——后者为cat shardscat indicescat segments增加动态限制设置,当集群规模超过阈值时可阻止调用,保护协调节点不被 cat 请求压垮。

典型用法(示意):

# 分页拉取索引列表 curl -X GET "localhost:9200/_list/indices?page=1&page_size=50" # 分页拉取分片列表 curl -X GET "localhost:9200/_list/shards?page=1&page_size=50"

6.2 NodeStats 新增 REMOTE_STORE 指标(#15611)

_nodes/stats响应中新增REMOTE_STORE指标分组,用于观测远程存储(remote store)相关状态,配合 remote-backed storage 场景排查分段上传与恢复瓶颈。

6.3 异步分片抓取指标(#15976)

为异步分片抓取(async shard fetch)补充 success / failure 指标,帮助定位搜索阶段分片数据抓取的失败率与延迟来源。

6.4 其他可观测性增强

  • #16290:协调节点(coordinator)的search.request_stats_enabled设置改为默认开启,搜索请求级统计开箱即用;
  • #15938:cluster stats API 支持URI path 过滤,可只统计指定路径(path)下的索引;
  • #16347:将多个设置改为动态(dynamic),便于大集群在线调优而无需重启;
  • #16236:支持动态调整线程池大小,配合动态设置实现在线容量伸缩。

七、搜索 API 与传输层增强

7.1 msearch 支持 search pipeline(#15923)

_msearch多搜索 API 现在可以为每个子请求指定search pipeline 名称,使管道化处理(重写、归一化、后处理)在多搜索场景下同样可用。

7.2 搜索上下文增强(#15967、#16110)

searchRequestContext新增successfulSearchShardIndices,记录搜索请求中成功返回的 shard 集合,便于在部分 shard 失败时精确统计成功分片,为部分结果场景(partial results)提供数据支撑。

7.3 集群状态回退(#15424)

当 Term-Version 校验不一致(check mismatch)时,节点可回退到远程集群状态(remote cluster-state),提升集群元数据同步的容错性。

7.4 安全传输参数与代码清理

  • #16387:SecureTransportSettingsProvider接口新增返回动态SecureTransportParameters的方法,使安全传输参数可随环境动态变化;
  • #15430、#16024:从 RestController 移除 identity 相关 feature-flagged 代码并删除 Identity FeatureFlag;
  • #16154:确保RestHandler.Wrapper将全部实现委托给被包装的 handler。

7.5 索引与请求处理修复

  • #16158:修复 streaming bulk 请求挂起问题;
  • #16337:修复 Streaming Indexing 偶发的The bulk request must be terminated by a newline [\n]失败;
  • #16265:修复带模板的 multi-search 不返回状态码的问题;
  • #15521:修复节点加入与离开(node-join / node-left)路径的竞态条件。

八、依赖升级一览

2.18.0 同步升级了一批关键依赖(Dependencies 部分):

依赖版本变化
Apache Lucene9.11.1 → 9.12.0
log4j-core2.23.1 → 2.24.0
Netty4.1.112.Final → 4.1.114.Final
RoaringBitmap1.2.1 → 1.3.0
protobuf3.22.3 → 3.25.4 → 3.25.5
gson2.10.1 → 2.11.0
grpc-api1.57.2 → 1.68.0
jline3.26.3 → 3.27.0
azure-identity1.13.0 → 1.13.2
nimbus-jose-jwt9.40 → 9.41.1
okio3.9.0 → 3.9.1
japicmp (gradle 插件)0.4.3 → 0.4.4

其中 Lucene 9.12.0 与 Netty 4.1.114 的升级对查询、网络栈的稳定性有直接影响。

九、其他值得关注的变化

  • #15916:在ValuesSourceAggregationBuilderFieldSortBuilder中实现WithFieldName接口,统一字段名访问方式;
  • #13574:新增offline-tasks 库,提供离线后台任务(Offline Background Tasks)所需的各类接口,为未来离线任务体系打基础;
  • #16049:TestFixturesPlugin 支持 docker compose v2;
  • #16215:在 commit 阶段更新 last seen cluster state,提升集群状态一致性感知;
  • #15386:修复以count()结尾的低效 Stream API 调用链;
  • #15362:修复RemoteStoreNodeAttribute.toString()super误写为sb的笔误;
  • #16378:修复ResyncReplicationRequest中数组 hashCode 计算错误;
  • #15501:为搜索背压(search backpressure)取消设置增加参数校验。

十、升级与使用建议

  • 若集群已启用分片请求缓存且查询缓存命中率波动明显,可关注Segmented Cache并做 A/B 对比验证;
  • 需要做电话号码前缀/模糊检索的业务,可直接安装analysis-phonenumber插件,并严格遵循索引用phone、检索用phone-search的分离策略;注意分析器基于 libphonenumber,建议用 PhoneNumberAnalyzerTests.java 中的用例先行验证词元是否符合预期;
  • 超大集群的_cat类调用应迁移到_list/indices_list/shards分页 API,并为cat设置动态限制阈值;
  • Workload Management 相关 API 仍标注为实验特性(@opensearch.experimental),生产环境引入前建议先在小规模集群验证取消策略(MaximumResourceTaskSelectionStrategy)与拒绝行为;
  • 升级时注意 Lucene 9.12、Netty 4.1.114 与 protobuf 3.25.5 的兼容性,建议参考仓库 CHANGELOG.md 与 TESTING.md 中的验证流程。

总体而言,2.18.0 在多租户资源治理(WLM)、电话号码检索体验、远程存储与缓存性能、以及大规模集群可观测性四条主线上均有关键进展,是从 2.17 升级的重要候选版本。

【免费下载链接】OpenSearch🔎 Open source distributed and RESTful search engine.项目地址: https://gitcode.com/gh_mirrors/op/OpenSearch

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/23 13:58:46

LibQQt:基于Qt的跨平台UI组件库实战解析

1. 项目概述与核心定位1.1 为什么值得关注LibQQt我不记得第一次看到LibQQt是什么时候了,但真正把它用进实际项目,是在一个桌面端工业数据展示系统里。当时项目要求界面必须在低配工控机上流畅运行,还得支持多屏异显、高DPI缩放和皮肤切换&…

作者头像 李华
网站建设 2026/9/23 13:57:49

高清摄像机系统级测试方法:从MTF到PTP的全链路验证

简介:本资源是《高清摄像机测试方法》行业标准征求意见稿(2010年7月版),面向安防监控设备研发工程师、质检人员、标准化从业人员及高校光电/仪器仪表方向师生,解决高清摄像机性能评估缺乏统一量化依据的实践难题。文件…

作者头像 李华
网站建设 2026/9/23 13:56:03

KNN股市预测实战:从相似行情检索到可回测交易信号

简介:本资源是一份基于KNN算法的轻量级股市预测Python实现,面向金融数据分析初学者、量化入门学习者及对机器学习在投资领域应用感兴趣的开发者。代码聚焦于利用历史股价数据进行趋势预测,涵盖数据获取(tushare)、特征…

作者头像 李华
网站建设 2026/9/23 13:53:28

Visual C++物理模拟入门:水瓶晃动与动量守恒实战

简介:本资源是一个基于物理原理的轻量级水瓶动力学模拟程序,面向高校物理竞赛(如CUPT中国大学物理学术竞赛)备赛学生、C初学者及游戏开发入门者,旨在通过可视化编程实践深化对动量守恒、牛顿运动定律与流体行为建模的理…

作者头像 李华