OpenSearch 2.4.0 版本技术解析PIT 点查、加权分片路由与搜索背压机制全解读【免费下载链接】OpenSearch Open source distributed and RESTful search engine.项目地址: https://gitcode.com/gh_mirrors/op/OpenSearch导读本文基于 OpenSearch 官方发布的 2.4.0 Release Notesrelease-notes/opensearch.release-notes-2.4.0.md发布于 2022-11-04系统梳理该版本引入的核心新特性——Point in TimePIT搜索、实验性可搜索快照、区域退役/恢复与加权分片路由、专用 search 节点角色、搜索背压Search Backpressure资源追踪等并结合当前仓库源码逐项印证其底层实现与配置方式。读完本文你将掌握 2.4.0 各新增功能的适用场景、关键配置参数、默认值与源码落点并了解该版本在稳定性修复、依赖升级与安全CVE方面的完整变更清单。版本概览OpenSearch 2.4.0 于 2022 年 11 月 4 日发布是 2.x 系列中功能密度较高的一次迭代。本次版本的核心主题可以概括为三条主线搜索体验与成本优化引入 Point in Time 搜索后续 SQL/PPL 插件查询能力的基础、实验性可搜索快照、专用 search 节点角色让大规模只读/冷数据场景具备更经济、更稳定的查询方案集群路由与可用性新增区域退役decommission/恢复recommissionAPI 与加权分片路由策略配合段复制Segment Replication故障转移支持增强多可用区部署下的容错与流量调度能力稳定性与安全加固引入基于资源消耗的 SearchShardTask 在途取消机制与搜索背压统计 API同时修复大量 Windows 启动脚本、恢复、复制相关的缺陷并升级依赖以缓解多个 CVE。以下按 Release Notes 的 Added / Changed / Removed / Fixed / Security / Dependencies 结构展开并在每个小节补充仓库源码级佐证。核心新增功能Added1. Point in TimePIT搜索Introduce point in time search feature是 2.4.0 最重要的功能之一。PIT 允许搜索请求基于某个时间点创建的固定数据快照上下文执行而不是基于最新的 reader 上下文从而为跨请求的一致性查询如分页、滚动、SQL 聚合提供稳定视图。从源码看PIT 的请求载体定义在 PointInTimeBuilder.java其 javadoc 明确指出A search request with a point in time will execute using the reader contexts associated with that point time instead of the latest reader contexts.该类对外暴露两个核心字段字段类型说明idStringPIT 的唯一标识创建 PIT 时返回搜索时必须携带keep_aliveTimeValuePIT 的存活时间若在搜索请求中再次指定可延长该 PIT 的保留时长该 Builder 实现了Writeable与ToXContentObject意味着它既能在节点间通过 Stream 传输也能以 JSON 形式出现在搜索请求体与响应中解析时若缺少id会抛出IllegalArgumentException(point int time id is not provided)。keep_alive通过TimeValue.parseTimeValue解析支持如1m、30s等标准时间单位字符串。PIT 的创建流程由 CreatePitController.java 负责采用两阶段提交设计阶段一在相关分片上以临时 keep-alive 创建 PIT reader 上下文阶段二将 PIT ID 与请求中的 keep_alive 写入上下文若任一分片更新失败则清理已创建的 PIT。这种两阶段设计是为了把 PIT ID 保存进上下文本身便于后续的 List PIT、Delete PIT 等管理能力复用。该控制器同时定义了PIT_INIT_KEEP_ALIVE正向时间设置用于控制创建阶段的临时存活时长。从源码结构还可以看到PIT 能力贯穿 SearchRequest.java、SearchSourceBuilder.java 与 SearchTransportService.java 等多个搜索链路核心类是搜索层的一等公民而不仅仅是独立接口。2. 实验性可搜索快照Searchable SnapshotIntroduce experimental searchable snapshot feature让索引可以直接从快照仓库如 S3、GCS 等远程对象存储中搜索无需先将全部数据恢复到本地磁盘。该特性在 2.4.0 中仍处于实验阶段。从当前仓库源码可以印证其基础设施已经就位server/src/main/java/org/opensearch/index/store/remote包下存在directory远程目录实现如BlockUnpinningDirectory、filecache本地文件缓存等模块FileCacheSettings.java 提供了文件缓存相关配置IndexSettings.java 中登记了与远程存储/快照相关的索引级设置。与远程存储Remote Store体系结合后可搜索快照的典型收益是只读冷数据可以直接挂载快照进行搜索显著降低存储成本。由于是实验特性生产使用前务必查阅对应版本的官方文档与特性开关说明。3. 区域退役/恢复 API 与加权分片路由Weighted Zonal Search Request RoutingAdd API for decommissioning/recommissioning zone and weighted zonal search request routing policy是为多可用区zone部署设计的路由治理能力包含两大部分区域退役decommission/恢复recommission运维上可以将某个 zone 整体标记为退役状态让分片与流量逐步迁出该 zone恢复操作则反向放行。加权分片路由weighted shard routing按节点属性attribute与权重分配搜索流量实现对不同 zone 或不同规格节点的差异化流量调度。加权路由的数据模型定义在 WeightedRouting.java标注PublicApi(since 2.4.0)其核心是属性名 权重表public WeightedRouting(String attributeName, MapString, Double weights) { this.attributeName attributeName; this.weights Collections.unmodifiableMap(weights); ... }即attributeName指定节点属性例如zoneweights为该属性各取值例如各 zone 名称到权重01 之间的浮点数的映射。isSet()方法要求属性名非空且权重表非空否则视为未启用。2.4.0 同时补齐了该能力的 PUT / GET / DELETE 三套 REST API对应 TransportAddWeightedRoutingAction.java、TransportGetWeightedRoutingAction.java、TransportDeleteWeightedRoutingAction.javaREST 层入口见 RestClusterPutWeightedRoutingAction.java并在 WeightedRoutingMetadata.java 中持久化到集群元数据。Release Notes 中Fix weighted routing metadata deserialization error on process restart表明该元数据序列化/反序列化在进程重启场景下已做加固。调度侧WeightedRoutingService.java 与 OperationRouting.java 配合实现加权选择逻辑同时引入 FailAwareWeightedRouting.java、NodeWeighedAwayException.java 等辅助类——当某节点被加权排除权重为 0 或失败计数触发时会抛出NodeWeighedAwayException走重试路径保证路由决策的健壮性。4. 专用 search 节点角色Add a new node role search which is dedicated to provide search capability引入了专职搜索节点角色。在 DiscoveryNodeRole.java 中该角色定义为public static final DiscoveryNodeRole SEARCH_ROLE new DiscoveryNodeRole(search, s, true) { ... };关键约束在validateRole方法中search 角色不能与任何其他角色组合在同一节点上违反时抛IllegalArgumentException。这意味着 search 节点是纯搜索型节点配合副本分片承载只读查询流量从而隔离搜索负载与写入/管理负载。同一版本中一并出现的还有 warm 角色源码注释明确warm role is added in 2.4用于承载 warm 索引。配置方式是在opensearch.yml中通过node.roles声明例如仅保留search一项。5. 远程 translog 特性开关Remote Translog Feature FlagIntroduce Remote translog feature flag将远程 translogremote translog配合远程存储体系将 translog 持久化到对象存储以**特性开关feature flag**形式引入方便逐步验证与灰度。从当前仓库看远程存储相关能力已广泛分布在 IndexMetadata.java、IndexSettings.java、RemoteStoreRestoreService.java 及server/src/main/java/org/opensearch/gateway/remote包RemoteClusterStateService、RemoteIndexMetadataManager、RemoteManifestManager 等中feature flag 的注册集中在 FeatureFlags.java 与 FeatureFlagSettings.java。2.4.0 还在远程存储方向做了多项配套变更例如 Use RemoteSegmentStoreDirectory instead of RemoteDirectory、Add index specific setting for remote repository、Change behaviour in replica recovery for remote translog enabled indices共同把远程存储的 segment 目录抽象、索引级仓库配置与副本恢复路径推向成熟。6. 段复制Segment Replication故障转移支持Add failover support with Segment Replication enabled完善了段复制模式下的故障转移链路。段复制是 OpenSearch 为降低主分片网络/IO 开销而设计的复制模型副本直接拉取主分片已提交的 segment 文件而非复制整个 translog 操作流。2.4.0 的修复清单中有大量该方向的条目佐证其成熟度Do not fail replica shard due to primary closure主分片关闭时不再连带失败副本Fixed cancellation of segment replication eventsBump segment infos counter before commit during replica promotion副本晋升主分片时递增 segment infos 计数器Fix NoSuchFileExceptions with segment replication when computing primary metadata snapshotsUpdate replicas to commit SegmentInfos instead of relying on SIS files from primary shards副本自行提交 SegmentInfos不再依赖主分片推送的 SIS 文件Fix bug of replica shards translog not purging on index flush when segment replication is enabled。这些修复共同解决了副本恢复、主备切换、checkpoint 处理与 translog 清理等环节的一致性问题是段复制从实验走向生产的关键一步。7. GeoJSON Point 类型支持Add support for GeoJson Point type in GeoPoint field让geo_point字段可以接收 GeoJSON 规范的 Point 格式输入{type: Point, coordinates: [lon, lat]}。配套修复还包括Fix a bug on handling an invalid array value for point type fieldPR #4900即对 point 类型字段的非法数组值给出正确错误处理。地理类型实现位于 server/src/main/java/org/opensearch/index/mapper如 GeoPointFieldMapper 等模块侧可参考 modules/geo。8. s390x 架构支持与 no-jdk 发行版Add support for s390x architecture使 OpenSearch 发行版覆盖 IBM Zs390x平台同时Add missing no-jdk distributions、Build no-jdk distributions as part of release build补齐了各平台不带捆绑 JDK 的发行产物即no-jdk-*系列见 distribution/archives 下的no-jdk-linux-tar、no-jdk-windows-zip等目录供自带 JDK 或使用系统 JDK 的环境使用。9. 搜索背压Search Backpressure资源追踪与在途取消2.4.0 在搜索稳定性方向引入了一套完整的基于资源消耗的 SearchShardTask 在途取消机制Add in-flight cancellation of SearchShardTask based on resource consumptionAdd resource usage trackers for in-flight cancellation of SearchShardTaskAdd search backpressure stats API。核心实现位于 SearchBackpressureService.java它按固定周期默认 1000ms巡检集群中的搜索任务依据任务资源使用情况决定是否取消。任务实体见 SearchShardTask.java统计输出见 SearchShardTaskStats.java 与 SearchShardTaskCancellationStats.java。模式开关search_backpressure.mode支持三档定义于 SearchBackpressureSettings.java模式说明disabled完全关闭背压机制monitor_only默认仅监控与统计不实际取消任务enforced按阈值实际取消超限任务核心阈值参数定义于 SearchShardTaskSettings.java全部为动态、节点级设置配置项默认值含义search_backpressure.search_shard_task.total_heap_percent_threshold0.05所有搜索分片任务堆占用总和占堆的比例阈值01达到后触发在途取消评估search_backpressure.search_shard_task.cpu_time_millis_threshold15000单个任务 CPU 时间阈值毫秒超过则考虑取消search_backpressure.search_shard_task.elapsed_time_millis_threshold30000单个任务挂钟耗时阈值毫秒超过则考虑取消search_backpressure.search_shard_task.heap_percent_threshold0.005单个任务堆占用比例阈值search_backpressure.search_shard_task.heap_variance2.0堆占用方差阈值任务堆占用 ≥ 已完成任务堆占用移动平均值 × 该值 时考虑取消search_backpressure.search_shard_task.heap_moving_average_window_size100计算堆占用移动平均的窗口大小search_backpressure.search_shard_task.cancellation_ratio0.1沿用旧设置默认相对成功完成任务数的取消比例即每成功完成一个任务向令牌桶放入的令牌数01search_backpressure.search_shard_task.cancellation_rate0.003单位毫秒可取消的任务数令牌桶每毫秒补充速率search_backpressure.search_shard_task.cancellation_burst10.0限流前可突发取消的最大任务数从源码注释可以确认旧的search_backpressure.cancellation_ratio / cancellation_rate / cancellation_burst已被标记为Deprecated新设置在search_shard_task命名空间下旧设置保留用于向后兼容并作为新设置的 fallback。设置校验方面cancellation_ratio必须满足0 value 1.0cancellation_rate必须 0否则启动即报错。这套机制的实战价值在于当集群出现慢查询拖垮节点堆/CPU 时管理员可以先将search_backpressure.mode设为monitor_only观察 stats API 的统计数据确认阈值合理后再切换为enforced从而在保护集群可用性与不误杀正常查询之间取得平衡。10. 其他新增Add groupId value propagation tests for ZIP publication task与Plugin ZIP publication groupId value is configurable构建侧将插件 ZIP 发布的groupId设为可配置并补充了传播测试相关逻辑在 buildSrc 的发布实现中。Github workflow for changelog verification新增 CI 工作流校验 PR 是否按规范补充 CHANGELOG 条目对应 CHANGELOG.md 的维护约定。Copy build.sh over from opensearch-build将构建脚本build.sh同步进仓库见 scripts/build.sh。Add feature to ignore indexes starting with dot during shard limit validation分片数限制校验时忽略以.开头的系统索引避免内部索引触发分片上限校验。Update GeoGrid base class access modifier to support extensibility放宽 GeoGrid 基类访问修饰符以支持第三方扩展。变更与改进Changed远程存储目录抽象Use RemoteSegmentStoreDirectory instead of RemoteDirectory将远程 segment 存储从通用 RemoteDirectory 细化为语义明确的 RemoteSegmentStoreDirectory为后续 segment 级精细管理铺路。加权轮询调度Weighted round-robin scheduling policy for shard coordination traffic为分片协调流量引入加权轮询调度策略与加权路由 API 形成数据流 协调流双通道调度。索引级远程仓库设置Add index specific setting for remote repository允许按索引指定远程仓库而非全局统一。副本 SegmentInfos 提交Update replicas to commit SegmentInfos instead of relying on SIS files from primary shards副本分片在恢复完成后自行提交 SegmentInfos消除对主分片文件的隐式依赖修复项 #4450 为同一问题的补强。节点角色加载重构Load the deprecated master role in a dedicated method instead of in setAdditionalRoles()将已废弃的 master 角色加载逻辑独立成方法便于后续清理。日志配置清理Change the version to remove deprecated code of adding node name into log pattern of log4j property file移除 log4j2 配置中把节点名写进日志 pattern 的废弃代码路径对应 distribution/src/config/log4j2.properties。Log4j JUL AdapterInstall and configure Log4j JUL Adapter for Lucene 9.4为 Lucene 9.4 配置 java.util.logging 桥接统一日志输出。反射 API 优化Use getParameterCount instead of getParameterTypes避免不必要的类型数组构造。移除项RemovedRemove RepositoryData.MIN_VERSION support for next major release移除旧版RepositoryData.MIN_VERSION支持为下一个大版本3.x的仓库元数据格式升级腾出空间。这意味着低版本集群创建的旧格式仓库元数据在后续主版本中将不再受支持升级前需确认快照仓库元数据版本。修复项Fixed2.4.0 的修复面覆盖 Windows 启动、恢复/复制、映射解析与集群稳定性几个重点方向Windows 平台启动脚本opensearch-service.bat start与opensearch-service.bat manager无法运行#4289opensearch.bat与opensearch-service.bat install因缺少 logs 目录失败#4305opensearch.bat在安装路径含空格时无法执行#4362修复 Windows 平台构建失败#4924。恢复与段复制Do not fail replica shard due to primary closure#4133取消段复制事件的修复#4225Add check to cancel ongoing replication with old primary on onNewCheckpoint on replica#4363副本晋升时先递增 segment infos 计数器再提交#4365扩展 FileChunkWriter 支持传输客户端取消#4386计算主分片元数据快照时消除NoSuchFileException#4366修复 getSegmentFiles 处理耗时导致的超时#4434checkpoint 处理时校验分片路由非 primary#4716段复制开启时副本 translog 在 flush 后未清理#4975。索引与映射ignore_malformed设置现在同样忽略对象类型的 malformed 值#4494修复 rollover 后 alias filter 丢失#4499修复 point 类型字段的非法数组值处理#4900自动扩缩副本auto_expand_replicas校验修复#4994读取 analyzer 映射规则时的错误处理commit 6d20423。集群与快照修复索引删除时的SnapshotsInProgress错误#4570修复 arm64 架构 JDK 依赖定位错误#4613修复 S3 IRSA 场景下获取快照的accessDeclaredMembers权限异常#4469detailed_error关闭时返回有意义的错误消息替代 No OpenSearchException found#4708。其他恢复org.opensearch.action.support.master.info包中 ClusterInfoRequest 系列类的使用供子类继承#4307日期解析器 day of year 默认值修复#4627regex query string 搜索设置 analyzer#4219比 minimal_english 更优的复数词干器#4738GradlepublishPluginZipPublicationToXxx任务警告修复#4696。安全更新SecurityCVE-2022-41917#5141修复 OpenSearch 自身的相关漏洞CVE-2022-25857#4341org.yaml:snakeyaml反序列化 DoS 漏洞通过升级 snakeyaml 缓解CVE-2022-42003#4781Jackson Databind 升级至 2.13.4.2 修复的漏洞涉及 server/licenses/jackson-dataformat-yaml-3.2.2.jar.sha1 等依赖清单当前仓库已更新至 jackson 3.x。依赖升级Dependencies2.4.0 对底层依赖做了一次集中升级重点包括依赖变更影响面Apache Lucene升级至9.4.1#4922中间经 9.4.0 #4661核心索引与查询引擎配合 Log4j JUL Adapter 调整Netty升级至4.1.84.Final#4893网络传输层libs/netty4、modules/transport-netty4Jackson / SnakeYAMLjackson 2.13.4 snakeyaml 1.32#4556随后 Databind 升至 2.13.4.2 修复 CVE-2022-42003序列化与 YAML 解析protobuf-javarepository-gcs / repository-hdfs 升至 3.21.7#4790再至 3.21.8#5005对象存储仓库插件tika2.4.0 → 2.5.0#4791ingest-attachment 文档解析asm / bytebuddy9.3 → 9.4 / 1.12.12 → 1.12.18#4889Painless 脚本与动态字节码woodstox-core6.4.0#4951XML 解析OpenJDK2022 年 10 月补丁版本#4997运行时基线spotless / xmlbeans / hadoop-hdfs6.9.1→6.10.0 / 5.1.0→5.1.1 / 3.3.3→3.3.4构建与 HDFS 仓库jetty-http / kotlin-stdlib / snakeyaml批量升级#4982服务端组件zookeeperhdfs-fixture 升级#5007、#5047测试基建此外Exclude jettison version brought in with hadoop-minicluster#4787与 httpcore、mockito、slf4j、httpasyncclient、commons-codec 的批量更新#4308也一并合入。当前仓库依赖版本清单可参考 gradle/libs.versions.toml。总结OpenSearch 2.4.0 是一个搜索能力 集群治理 稳定性三线并进的版本搜索侧PIT 为后续 SQL/PPL 查询、分页一致性打下了协议基础search 节点角色与加权路由为多可用区流量调度提供了 API 与数据模型可搜索快照则为冷数据降本探索了新路径。稳定性侧搜索背压从监控到强制取消提供了完整的参数体系mode / 各类阈值 / 令牌桶三件套段复制故障转移与远程存储体系的多项修复让新复制模型与远程 translog 走向可用。安全侧Lucene、Netty、Jackson、SnakeYAML 等关键依赖的集中升级以及 CVE-2022-41917、CVE-2022-25857、CVE-2022-42003 的修复显著降低了已知漏洞面。如需深入验证本文涉及的功能细节推荐从以下源码入口开始阅读搜索背压参数体系见 SearchShardTaskSettings.java 与 SearchBackpressureSettings.javaPIT 见 PointInTimeBuilder.java 与 CreatePitController.java加权路由见 WeightedRouting.java 与 WeightedRoutingService.java节点角色见 DiscoveryNodeRole.java。【免费下载链接】OpenSearch Open source distributed and RESTful search engine.项目地址: https://gitcode.com/gh_mirrors/op/OpenSearch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
