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 日发布的稳定版本,其核心主题可归纳为三方面:
- Workload Management(工作负载管理)进入弹性治理新阶段:新增 QueryGroupService 编排器、任务资源取消框架、QueryGroup Stats API,并补齐 CRUD 集成测试、跨进程持久化与多节点执行路径;
- 搜索与分析能力扩展:新增
phone/phone-search分析器(位于新插件analysis-phonenumber)、msearch 管道、successfulSearchShardIndices追踪、Star Tree 指标聚合支持等; - 存储、缓存与可观测性增强: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 可以看出,查询组以系统索引为存储载体,配合WorkloadGroupTask、WorkloadGroupThreadContextStatePropagator、WorkloadGroupsStateAccessor等类完成状态传播与访问控制。
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 承载,并支持SortBy、SortOrder排序(见 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,提供phone与phone-search两种分析器,专用于电话号码字段的索引与检索。实现位于 plugins/analysis-phonenumber/src/main/java/org/opensearch/analysis/phone。
3.1 设计理念:索引与搜索分离
phone分析器:用于索引阶段(analyzer),会生成电话号码的ngram前缀词元(如1、91、919…),支持前缀模糊匹配;phone-search分析器:用于检索阶段(search_analyzer),不生成 ngram,只输出完整号码词元,避免查询时误匹配其他国家的号码。
两者共用 PhoneNumberTermTokenizer.java,通过构造参数addNgrams区分行为(索引为 true、搜索为 false),详见 PhoneNumberAnalyzer.java 的createComponents实现。
3.2 底层 token 化逻辑
PhoneNumberTermTokenizer.java 的getTokens()依次执行:
- 保留原始输入作为词元;
- 剥离
tel:与sip:前缀(索引模式下会额外保留该前缀词元); - 去掉开头的
+; - 截断
@之后的域名部分(适配 SIP 地址); - 调用 Google
libphonenumber(PhoneNumberUtil)解析号码,提取国家码与国内号码,产出countryCode + nationalNumber完整词元; - 索引模式下对纯数字串生成所有长度的前缀 ngram,若存在国家码,还会生成
countryCode + prefix形式的扩展 ngram。
如果号码无法被 libphonenumber 解析(例如NumberParseException),则退化为直接按原始输入 ngram,保证"垃圾进、垃圾出"而非抛错。
3.3 phone-region 设置
可通过phone-region设置指定默认区域(ISO 3166-1 国家码,如CH、US),使不带+国际前缀的号码也能被正确解析。测试配置 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:+441344840400,phone分析器产出tel:、44、441、13、1344、1344840400、441344840400等 ngram 词元; - 同一输入经
phone-search分析器仅产出tel:+441344840400与441344840400两个词元; - SIP 地址
sip:+14177141363@178.97.105.13;...可提取出417、4177、14177; - 带分机号
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 shards、cat indices、cat 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 Lucene | 9.11.1 → 9.12.0 |
| log4j-core | 2.23.1 → 2.24.0 |
| Netty | 4.1.112.Final → 4.1.114.Final |
| RoaringBitmap | 1.2.1 → 1.3.0 |
| protobuf | 3.22.3 → 3.25.4 → 3.25.5 |
| gson | 2.10.1 → 2.11.0 |
| grpc-api | 1.57.2 → 1.68.0 |
| jline | 3.26.3 → 3.27.0 |
| azure-identity | 1.13.0 → 1.13.2 |
| nimbus-jose-jwt | 9.40 → 9.41.1 |
| okio | 3.9.0 → 3.9.1 |
| japicmp (gradle 插件) | 0.4.3 → 0.4.4 |
其中 Lucene 9.12.0 与 Netty 4.1.114 的升级对查询、网络栈的稳定性有直接影响。
九、其他值得关注的变化
- #15916:在
ValuesSourceAggregationBuilder与FieldSortBuilder中实现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),仅供参考