Solr配置:包管理器完整使用指南
Solr的包管理器允许在集群环境中安全地安装和更新Solr特定的包,实现无需重启节点的动态插件管理。本文将详细介绍包管理器的使用方法、安全注意事项和最佳实践。
包管理器概述
什么是包
在Solr的包管理系统中,包是包含一个或多个Solr插件的Java jar文件集合(通常是一个文件)。每个jar文件都附带一个签名字符串,可以根据提供的公钥进行验证。
核心设计理念
包管理器的关键设计特点是能够在集群环境中安全地安装或更新包,而无需重启每个节点。系统的其他设计要素包括:
- 远程仓库安装:从远程仓库安装的能力
- 包标准化:统一的包格式和规范
- 命令行界面:完整的CLI支持
- 包存储:集中式包存储机制
启用包管理器
启用命令
包管理器默认是禁用的。要启用它,需要使用-Denable.packages=true
参数启动所有Solr节点:
1 | bin/solr start -c -Denable.packages=true |
安全警告
重要:启用包管理器有安全后果。如果未经授权的用户获得系统访问权限,他们将拥有对ZooKeeper的写访问权限,并可以从不受信任的源安装包。在启用包管理器之前,请务必使用防火墙和认证授权插件保护Solr。
仓库管理
什么是仓库
仓库是托管一个或多个包的位置。通常,这是一个Web服务,提供关于包的元信息、用于下载的包工件以及用于验证jar文件签名的公钥。
添加可信仓库
要在Solr中安装包,必须添加托管包的仓库:
1 | bin/solr package add-repo <repository-name> <repository-url> |
示例:
1 | bin/solr package add-repo central https://repo1.maven.org/maven2/ |
仓库安全注意事项
重要安全原则:
- 仅添加信任和控制的仓库
- 仅使用HTTPS:只添加基于HTTPS的仓库,避免基于HTTP的仓库以防范中间人攻击
- 验证来源:确保仓库的真实性和可靠性
包的列表和安装
列出已安装的包
1 | bin/solr package list-installed |
列出可安装的包
从已添加的仓库列出可用于安装的包:
1 | bin/solr package list-available |
安装包
安装包,将工件从仓库复制到Solr的内部包存储,并为此包设置类加载器:
1 | bin/solr package install <package-name>[:<version>] |
示例:
1 | # 安装最新版本 |
包的部署
安装包后,可以在集合级别或集群级别使用其中包含的插件。有两种部署方式:
1. CLI部署命令
如果包作者声明支持,可以使用CLI的deploy
命令:
集合级别部署:
1 | bin/solr package deploy <package-name>:[version] --collections <collection1>[,<collection2>,...] |
集群级别部署:
1 | bin/solr package deploy <package-name>:[version] --cluster |
带参数部署:
1 | bin/solr package deploy my-plugin:1.0 --collections collection1 \ |
跳过确认:
1 | bin/solr package deploy my-plugin:1.0 --collections collection1 -y |
2. 手动部署
集合级别手动部署
- 编辑configset:在configset的
solrconfig.xml
中添加插件配置
1 | <requestHandler name="/myhandler" class="mypackage:full.path.to.MyClass"></requestHandler> |
- 重新加载集合:
1 | curl -X POST "http://localhost:8983/solr/admin/collections?action=RELOAD&name=collection1" |
- 设置包版本:
1 | curl "http://localhost:8983/api/collections/collection1/config/params" \ |
集群级别手动部署
对于集群级别插件的手动安装,请参考相关JIRA issue:SOLR-14404。
验证部署
部署后,验证集合是否正在使用包:
1 | bin/solr package list-deployed -c <collection> |
包的更新
检查可用更新
首先确保更新版本在已添加的仓库中可用:
1 | bin/solr package list-available |
安装新版本
1 | bin/solr package install <package-name>:<version> |
示例:
1 | bin/solr package install mypackage:2.0.0 |
部署更新
安装新版本后,可以选择性地更新每个集合或集群级别插件:
集合级别更新:
1 | bin/solr package deploy mypackage:2.0.0 --update --collections mycollection |
集群级别更新:
1 | bin/solr package deploy mypackage:2.0.0 --update --cluster |
验证更新
1 | bin/solr package list-deployed -c mycollection |
包的卸载
撤销部署
如果包支持撤销部署(检查包作者文档),可以撤销之前部署的包:
1 | bin/solr package undeploy <package-name> --collections <collection1>[,<collection2>,...] |
卸载包
如果包已被撤销部署或从未部署,则可以卸载:
1 | bin/solr package uninstall <package-name>:<package-version> |
注意:包名和版本都是必需的。
安全考虑
仓库安全
HTTPS要求:
add-repo
步骤应仅使用启用HTTPS的仓库URL执行,以防止获取公钥时的MITM攻击写入保护:
add-repo
步骤注册受信任仓库的公钥,只能使用具有对包存储的受信任存储(包存储中无法使用包存储API写入的特殊位置)的直接写访问权限的包管理器(CLI)执行ZooKeeper保护:保护ZooKeeper免受未经授权的写访问至关重要
生产环境最佳实践
建立私有仓库:如果要在生产中使用某些包,最佳实践是建立自己的仓库并将其添加到Solr,而不是添加超出管理控制的通用第三方仓库
包重签名:可能需要使用自己的私钥重新签名来自第三方仓库的包,并在自己的仓库中托管它们
访问控制:实施适当的网络防火墙和访问控制
实际使用示例
完整的包管理流程
- 启动Solr并启用包管理器:
1 | bin/solr start -c -Denable.packages=true |
- 添加受信任的仓库:
1 | bin/solr package add-repo myrepo https://my-secure-repo.com/packages/ |
- 列出可用包:
1 | bin/solr package list-available |
- 安装所需包:
1 | bin/solr package install text-analyzer:1.5.0 |
- 部署到集合:
1 | bin/solr package deploy text-analyzer:1.5.0 --collections products,documents |
- 验证部署:
1 | bin/solr package list-deployed -c products |
更新现有包
- 检查新版本:
1 | bin/solr package list-available |
- 安装新版本:
1 | bin/solr package install text-analyzer:1.6.0 |
- 更新部署:
1 | bin/solr package deploy text-analyzer:1.6.0 --update --collections products,documents |
故障排除
常见问题
包管理器未启用:确保所有节点都用
-Denable.packages=true
启动仓库连接问题:检查网络连接和HTTPS证书
权限问题:确保Solr有足够权限访问ZooKeeper和本地文件系统
版本冲突:在更新前确保旧版本已正确卸载
调试命令
1 | # 检查包状态 |
通过合理使用Solr的包管理器,可以实现插件的动态管理和安全更新,大大提高系统的灵活性和可维护性。但必须严格遵循安全最佳实践,确保系统的稳定性和安全性。