包管理

Solr 中的包管理器允许在 Solr 的集群环境中安装和更新 Solr 特定的包。

在此系统中,是一组 Java jar 文件(通常是一个),其中包含一个或多个 Solr 插件。每个 jar 文件还附带一个签名字符串(可以使用提供的公钥进行验证)。

此系统的一个关键设计方面是能够在集群环境中安全地安装或更新包,而无需重新启动每个节点。

该设计的其他要素包括从远程存储库安装的能力;包标准化;命令行界面 (CLI);以及包存储。

本节将重点介绍如何使用包管理器来安装和更新包。有关技术细节,请参阅 包管理器内部 一节。

与包管理器交互

包管理器 (CLI) 允许您

  • 添加受信任的存储库

  • 列出存储库中的包

  • 安装所需的包

  • 将包部署和取消部署到/从集合或集群

  • 在有可用更新时更新包

启用包管理器

包管理器默认情况下处于禁用状态。要启用它,请使用 -Denable.packages=true 参数启动所有 Solr 节点。

$ bin/solr start -c -Denable.packages=true
启用包管理器会产生安全后果。如果未经授权的用户获得对系统的访问权限,他们将拥有对 ZooKeeper 的写入权限,并可以从不受信任的来源安装包。在启用包管理器之前,始终确保您已使用防火墙和 配置身份验证和授权 来保护 Solr。

添加受信任的存储库

仓库是一个托管一个或多个软件包的位置。通常,这是一个 Web 服务,它提供有关软件包的元信息、用于下载的软件包工件,以及用于在安装时验证 jar 文件签名的公钥。

为了将软件包安装到 Solr 中,必须添加一个托管这些软件包的仓库。

$ bin/solr package add-repo <repository-name> <repository-url>
不要添加你不信任或无法控制的仓库。仅添加基于 HTTPS 的仓库,并避免使用基于 HTTP 的仓库,以防止中间人 (MITM) 攻击。

列出和安装软件包

要列出已安装的软件包

$ bin/solr package list-installed

要列出可从已添加仓库安装的软件包

$ bin/solr package list-available

要安装一个软件包,需要将工件从仓库复制到 Solr 的内部软件包存储中,并为该软件包设置类加载器以供使用

$ bin/solr package install <package-name>[:<version>]

部署软件包

一旦安装了软件包,其中包含的插件就可以在集合或集群级别使用。

有两种方法可以执行此操作:使用 CLI 的 deploy 命令或手动部署。

deploy 命令

如果软件包作者声明支持,则可以使用 CLI 的 deploy 命令部署该软件包。

$ bin/solr package deploy <package-name>:[version] --collections <collection1>[,<collection2>,...] [-p <param1>=<val1> -p <param2>=<val2> ...

或者

$ bin/solr package deploy <package-name>:[version] --cluster

如果软件包接受其设置命令的参数,则可以指定这些参数(按照软件包文档)。

$ bin/solr package deploy <snipped...> -p <param1>=<val1> -p <param2>=<val2>

作者可能希望你通过提示确认软件包的部署。如果向命令传递 -y,则可以跳过确认。

手动部署

也可以通过编辑配置集并重新加载集合来手动部署软件包的集合级别插件。

例如,如果名为 mypackage 的软件包包含一个请求处理程序,我们将像这样将其添加到配置集的 solrconfig.xml

<requestHandler name="/myhandler" class="mypackage:full.path.to.MyClass"></requestHandler>

然后使用 Collections API RELOAD 命令Admin UI 来重新加载集合。

接下来,设置此集合正在使用的软件包版本。如果集合名为 collection1,软件包名称为 mypackage,并且已安装的版本为 1.0.0,则命令如下所示

curl  "https://127.0.0.1:8983/api/collections/collection1/config/params" \
   -H 'Content-type:application/json' -d "{set: {PKG_VERSIONS: {mypackage: '1.0.0'}}}"

有关手动安装集群级别插件,请参阅 集群级别请求处理程序

验证部署

部署后,验证集合是否正在使用该软件包

$ bin/solr package list-deployed -c <collection>

更新软件包

要更新软件包,第一步是确保更新的版本在已添加的仓库中可用,方法是运行上面在列出和安装软件包中显示的 list-available 命令。

接下来,从仓库安装软件包的新版本。

$ bin/solr package install <package-name>:<version>

安装新版本后,你可以有选择地更新每个集合或集群级别的插件。假设软件包 mypackage 的旧版本为 1.0.0,新版本为 2.0.0,则命令如下所示

$ bin/solr package deploy mypackage:2.0.0 --update --collections mycollection

或者

$ bin/solr package deploy mypackage:2.0.0 --update --cluster

你可以运行 list-deployed 命令来验证此集合是否正在使用新添加的版本。

取消部署软件包

如果软件包支持取消部署其中包含的插件(请查看软件包作者的文档),则可以按如下方式取消部署先前部署的软件包

$ bin/solr package undeploy <package-name> --collections <collection1>[,<collection2>,...]

卸载软件包

如果软件包已取消部署或从未部署,则可以按如下方式卸载它

$ bin/solr package uninstall <package-name>:<package-version>

或者

$ bin/solr package deploy <package-name>:<package-version> --cluster

软件包名称和版本都是必需的。

安全

应该仅使用启用 HTTPS 的仓库 URL 来执行 add-repo 步骤,以防止 Solr 在获取仓库的公钥时遭受 MITM 攻击。此 add-repo 步骤注册受信任仓库的公钥,因此只能使用可以直接写入软件包存储的受信任存储(软件包存储中的特殊位置,不能使用软件包存储 API 写入)的软件包管理器 (CLI) 执行。此外,保护 ZooKeeper 免受未经授权的写入访问至关重要。

此外,请记住,一旦添加了仓库,就可以从该仓库安装任何软件包。如果你想在生产环境中使用某些软件包,最佳实践是设置你自己的仓库并将其添加到 Solr 中,而不是添加超出你管理控制范围的通用第三方仓库。你可能希望使用你自己的私钥重新签名来自第三方仓库的软件包,并将它们托管在你自己的仓库中。