包管理

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

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

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

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

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

与包管理器交互

包管理器 (CLI) 允许您

  • 添加受信任的存储库

  • 列出存储库中的包

  • 安装所需的包

  • 将包部署到集合或集群,或从集合或集群中取消部署包

  • 在有更新时更新包

启用包管理器

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

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

添加受信任的存储库

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

要将包安装到 Solr 中,必须添加一个托管这些包的存储库。

$ bin/solr package add-repo <repository-name> <repository-url>
不要添加您不信任或无法控制的存储库。为了防止 MITM 攻击,只添加基于 HTTPS 的存储库,避免添加基于 HTTP 的存储库。

列出和安装包

要列出已安装的包

$ 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 传递给命令,则可以跳过确认。

手动部署

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

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

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

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

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

curl  "http://localhost: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

需要提供软件包名称和版本。

安全性

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

此外,请记住,一旦添加存储库,就可以从该存储库安装任何软件包。如果您希望在生产环境中使用某些软件包,最佳做法是设置自己的存储库,并将其添加到 Solr 中,而不是添加不受您管理控制的通用第三方存储库。您可能希望使用自己的私钥重新签署第三方存储库中的软件包,并将它们托管在您自己的存储库中。