发布概览
Apache Solr 9.10.0 于 2025年11月6日 正式发布,这是Solr 9系列的一次重要更新,标志着Solr在现代化进程中的重要里程碑。本次发布聚焦于云原生架构演进、微服务解耦和性能优化,为Solr 10.x的重大变革铺平道路。
核心亮点
- ✅ Java 24+兼容性:支持最新JDK,适应现代Java生态
- 🏗️ Tika Server外部化:文档解析微服务化,系统稳定性大幅提升
- 🔐 集群版本保护机制:防止版本不兼容节点加入集群
- 🚀 分布式性能优化:集群状态缓存、后台节点刷新降低延迟
- 📊 流式计算增强:fullOuterJoin函数支持完整外连接
- 🔧 Lucene 9.12.3:底层引擎升级,37项依赖更新
一、核心新特性
1.1 Java 24+ 支持
技术背景:
随着Java生态快速演进,Java 21 LTS已成为企业主流,Java 24引入了虚拟线程、模式匹配等现代特性。Solr 9.10.0通过禁用安全管理器(Security Manager已在Java 17+弃用)实现对Java 24及更高版本的兼容。
实现细节(SOLR-17641):
1 | # 启动命令示例 |
业务价值:
- 与现代Java工具链无缝集成(GraalVM、Project Loom)
- 利用虚拟线程提升并发处理能力
- 为未来模块化架构改造预留空间
1.2 Tika Server 外部委托
核心变革(SOLR-7632):
将文档解析从Solr进程中剥离,支持委托给独立的Tika Server服务。这一架构调整具有革命性意义。
架构对比:
| 维度 | 传统内嵌Tika | Tika Server外部化 |
|---|---|---|
| 隔离性 | ❌ 解析崩溃影响Solr | ✅ 故障隔离 |
| 扩展性 | ❌ 受Solr JVM限制 | ✅ 独立横向扩展 |
| 资源管理 | ❌ 共享堆内存 | ✅ 独立资源配额 |
| 升级灵活性 | ❌ 需重启Solr | ✅ 热升级Tika |
配置示例:
1 | <!-- solrconfig.xml --> |
企业应用场景:
- 大规模文档处理:Tika Server可部署为容器集群,处理PDF/Word/PPT高峰流量
- 多租户SaaS:不同租户使用独立Tika实例,避免资源争抢
- 安全隔离:解析用户上传文件的风险与搜索服务隔离
迁移路径:
1 | 阶段1(现在):保留内嵌Tika,添加Tika Server选项(已弃用内嵌) |
1.3 集群版本保护机制
问题背景:
在滚动升级场景,旧版本节点可能意外加入已升级的集群,导致:
- 不兼容的序列化协议
- 功能降级(新特性失效)
- 数据一致性风险
解决方案(SOLR-17879):
1 | 节点启动时验证主次版本号: |
运维影响:
1 | # 启动日志示例 |
最佳实践:
- 使用CI/CD管道统一版本部署
- 监控集群版本分布(Prometheus指标)
- 蓝绿部署替代滚动升级
1.4 fullOuterJoin 流式函数
技术实现(SOLR-17923):
1 | // 流式表达式示例 |
与LEFT/INNER JOIN对比:
| JOIN类型 | 左集合无匹配 | 右集合无匹配 | 使用场景 |
|---|---|---|---|
| innerJoin | 丢弃 | 丢弃 | 严格匹配 |
| leftOuterJoin | 保留 | 丢弃 | 左集合为主 |
| fullOuterJoin | 保留 | 保留 | 完整数据集 |
企业场景:
- 库存对账:商品表 FULL JOIN 库存表,找出缺失库存的商品
- 日志关联:应用日志 FULL JOIN 访问日志,定位丢失事件
- 数据完整性检查:订单表 FULL JOIN 支付表,发现未关联记录
1.5 副本路由优化
新特性(SOLR-17915):
1 | shards.preference=replica.location:host |
场景价值:
在Kubernetes环境中,将查询路由到同一Pod/主机上的副本,利用:
- 本地缓存(Linux Page Cache)
- 减少网络RTT
- 提升CPU缓存命中率
性能对比:
1 | 场景:10万QPS聚合查询 |
二、性能与架构优化
2.1 远程代理高QPS优化
技术细节(SOLR-17893):
通过集群状态缓存(Cluster State Cache)加速远程代理查询:
1 | // 优化前:每次查询都获取集群状态 |
性能提升:
- ZooKeeper读请求减少90%
- 代理查询延迟降低30-50ms
- 支持更高查询并发度
适用场景:
- API网关代理多个Solr集群
- 跨数据中心查询聚合
- 高QPS搜索服务(10k+ QPS)
2.2 CloudSolrClient 后台节点刷新
问题场景(SOLR-17921):
当集群扩容/缩容时,客户端节点列表缓存过期,导致:
1 | 请求 → 已下线节点 → 超时 → 刷新节点列表 → 重试 |
优化方案:
1 | // 后台定期刷新活跃节点(异步) |
效果:
- 消除缓存失效引起的延迟尖刺
- P99延迟改善40-60%
- 提升集群弹性伸缩体验
2.3 PULL副本功能增强
变更内容(SOLR-17860):DocBasedVersionConstraintsProcessorFactory 现支持 PULL 副本类型。
技术背景:
- NRT副本:实时索引,强一致性
- TLOG副本:事务日志复制,最终一致性
- PULL副本:只读,从Leader拉取段文件
应用价值:
PULL副本适用于:
- 只读查询节点(降低Leader压力)
- 地理分布式部署(跨区域复制)
- 降低存储成本(按需拉取段)
配置示例:
1 | curl "http://localhost:8983/solr/admin/collections?action=ADDREPLICA&collection=products&shard=shard1&type=PULL&node=solr-read-1" |
三、关键Bug修复
3.1 授权头传递问题
问题描述(SOLR-17789):
在分布式查询中,请求转发时Authorization头未正确传递,导致:
- 身份验证失败(401 Unauthorized)
- 影响启用BasicAuth/JWT的集群
修复验证:
1 | # 测试脚本 |
3.2 原子更新NPE修复
场景复现(SOLR-17721):
1 | // 在null字段上使用"Add Distinct"触发空指针异常 |
修复后行为:
1 | // 自动初始化null字段 |
3.3 领导者选举竞态条件
技术细节(SOLR-17863):
SolrCore指纹缓存的并发访问导致:
1 | 线程A:计算指纹 → 写缓存 |
修复方案:
使用 ConcurrentHashMap.computeIfAbsent() 确保原子性:
1 | // 修复前 |
四、依赖升级与生态
4.1 核心依赖版本
| 组件 | 旧版本 | 新版本 | 主要改进 |
|---|---|---|---|
| Lucene | 9.12.2 | 9.12.3 | 索引稳定性修复 |
| Jetty | 10.0.24 | 10.0.26 | HTTP/2性能优化 |
| ZooKeeper | 3.9.3 | 3.9.4 | 安全补丁 |
| Kafka | 3.9.0 | 3.9.1 | 流处理bug修复 |
| OpenTelemetry | 1.52.0 | 1.53.0 | 分布式追踪增强 |
4.2 供应链安全
37项依赖升级反映了对安全的重视:
- Commons-Compress 1.28.0(修复CVE漏洞)
- Netty 4.2.6.Final(内存泄漏修复)
- Jackson(防御性编程增强)
最佳实践:
1 | # 使用Dependency-Check扫描 |
五、弃用与向后兼容性
5.1 重要弃用清单
| 组件 | 弃用版本 | 移除版本 | 替代方案 |
|---|---|---|---|
| 内嵌Tika | 9.10.0 | 10.x | 外部Tika Server |
| XLSXResponseWriter | 9.10.0 | 11.x | 自定义导出工具 |
| Tika语言识别器 | 9.10.0 | 10.x | 外部NLP服务 |
| CloudSolrClient.Builder | 9.10.0 | 10.x | CloudHttp2SolrClient |
| waitForFinalState参数 | 9.10.0 | 11.x | 异步状态轮询 |
5.2 SolrJ客户端简化
依赖优化(SOLR-17884):
1 | <!-- 不使用旧版HttpSolrClient时可排除 --> |
收益:
- JAR包体积减少 ~2MB
- 依赖冲突风险降低
- 推动HTTP/2客户端迁移
六、升级指南
6.1 兼容性评估
自检清单:
- 当前版本 ≥ 9.0.0(不支持从8.x直接升级)
- Java版本 ≥ 17(建议Java 21)
- 使用Tika的用户需规划外部化迁移
- SolrJ客户端代码审查(弃用API)
- 集群版本一致性(避免混合版本)
6.2 升级步骤
推荐策略:蓝绿部署
1 | # 1. 部署新版本集群(9.10.0) |
6.3 滚动升级注意事项
重要警告:
由于版本保护机制(SOLR-17879),不能混合运行9.9和9.10节点!
安全滚动升级:
1 | # 步骤1:升级Overseer节点 |
6.4 Tika外部化迁移
阶段性方案:
1 | # docker-compose.yml |
性能测试:
1 | # 基准测试:解析1000个PDF文档 |
七、性能优化建议
7.1 Java虚拟线程应用
Java 21+ 特性利用:
1 | // 在Jetty中启用虚拟线程(实验性) |
预期收益:
- 并发处理能力提升 2-3x
- 线程池开销降低 80%
- 适合I/O密集型查询场景
7.2 集群状态缓存调优
1 | <!-- solr.xml --> |
调优原则:
- 稳定集群:TTL=30s(减少ZK负载)
- 动态集群:TTL=5s(快速感知变化)
- 监控缓存命中率(Prometheus指标)
7.3 副本策略优化
推荐配置:
1 | { |
八、监控与运维
8.1 新增Prometheus指标
1 | # 集群状态缓存命中率 |
8.2 健康检查增强
1 | # 集群版本一致性检查 |
九、业务价值总结
9.1 TCO(总拥有成本)影响
| 维度 | 改进 | 年节省(假设1000核集群) |
|---|---|---|
| Tika外部化 | 故障隔离 | 减少停机时间 ~$50K |
| 性能优化 | 降低延迟 | 节省服务器成本 ~$30K |
| 依赖升级 | 减少CVE | 降低安全事件风险 ~$100K |
9.2 技术债务清偿
- ✅ 移除安全管理器依赖(Java模块化准备)
- ✅ HTTP/2客户端统一(简化技术栈)
- ✅ 微服务架构演进(Tika外部化)
- 🚧 为Solr 10重大架构调整铺路
十、未来展望
10.1 Solr 10.x路线图预测
基于9.10.0的弃用策略,预计Solr 10将包含:
- 完全移除内嵌Tika:强制外部Tika Server
- Java 21 LTS为最低版本:利用虚拟线程、模式匹配
- SolrJ API重构:彻底迁移到HTTP/2
- 模块化插件系统:OSGi/JPMS支持
- 原生云架构:Kubernetes Operator、容器优先
10.2 生态系统趋势
- AI原生搜索:增强向量搜索、LLM集成(延续9.9.0方向)
- ClickHouse集成:实时分析查询卸载
- Pulsar支持:替代Kafka的流式索引
- WebAssembly插件:跨语言扩展机制
参考资源
- 官方文档:https://solr.apache.org/guide/solr/9_10/
- 升级说明:https://solr.apache.org/guide/solr/9_10/upgrade-notes/
- 完整变更日志:https://solr.apache.org/9_10_0/changes/Changes.html
- JIRA发布说明:https://issues.apache.org/jira/browse/SOLR/fixforversion/12356181
- 下载地址:https://solr.apache.org/downloads.html
结语
Apache Solr 9.10.0是一次战略性升级,通过Tika外部化、Java 24支持、性能优化等举措,验证了Solr团队对现代化架构的坚定承诺。对于企业用户,建议:
- 评估Tika使用场景,制定外部化迁移计划
- 规划Java 21升级路径,利用新语言特性
- 测试性能优化效果,量化业务收益
- 关注Solr 10动态,为重大架构变革做好准备
Solr不仅在延续其搜索引擎的核心能力,更在向云原生、微服务化、AI增强的方向加速演进。9.10.0是这一旅程中的重要里程碑。