备份和恢复

如果您担心数据丢失,而且您应该担心,那么您需要一种备份 Solr 索引的方法,以便在发生灾难性故障时能够快速恢复。

Solr 提供了两种备份和恢复 Solr 核心或集合的方法,具体取决于您运行 Solr 的方式。如果您运行 SolrCloud 集群,您将使用 Collections API。如果您运行用户管理的集群或单节点安装,您将使用复制处理程序。

备份(和快照)捕获已硬提交的数据。使用 softCommit=true 提交更改可能会导致更改在搜索结果中可见,但不包含在后续备份中。

同样,使用 openSearcher=false 提交更改可能会导致更改提交到磁盘并包含在后续备份中,即使它们当前在搜索结果中不可见。

SolrCloud 集群

SolrCloud 中的备份支持由Collections API提供。这允许跨多个分片生成备份,并恢复到与原始集合相同数量的分片和副本。

SolrCloud 备份/恢复需要在所有节点上以相同路径挂载的共享文件系统或 HDFS。

支持四种不同的 API 命令

  • action=BACKUP:此命令备份 Solr 索引和配置。更多信息请参见备份集合部分。

  • action=RESTORE:此命令恢复 Solr 索引和配置。更多信息请参见恢复集合部分。

  • action=LISTBACKUP:此命令列出指定位置可用的备份点,并显示每个备份点的元数据。更多信息请参见列出备份部分。

  • action=DELETEBACKUP:此命令允许删除备份文件或整个备份。更多信息请参见删除备份部分。

用户管理的集群和单节点安装

备份和恢复使用 Solr 的复制处理程序。开箱即用,Solr 包括对复制的隐式支持,因此可以使用此 API。但是,可以通过在 solrconfig.xml 中定义自己的复制处理程序来自定义复制处理程序的配置。有关配置复制处理程序的详细信息,请参阅配置 ReplicationHandler部分。

备份 API

backup API 需要向 /replication 处理程序发送命令以备份系统。

您可以使用如下 HTTP 命令触发备份(将“gettingstarted”替换为您正在使用的核心名称)

备份 API 示例
https://127.0.0.1:8983/solr/gettingstarted/replication?command=backup

backup 命令是异步调用,它将表示来自最新索引提交点的数据。所有索引和搜索操作将像往常一样继续针对索引执行。

一次只能对一个核心进行一个备份调用。在正在进行的备份操作期间,后续的恢复调用将抛出异常。

备份请求还可以采用以下其他参数

location

可选

默认值:无

将创建备份的路径。如果该路径不是绝对路径,则备份路径将相对于 Solr 的实例目录。

name

可选

默认值:无

快照将在名为 snapshot.<name> 的目录中创建。如果未指定名称,则目录名称将具有以下格式:snapshot.<_yyyyMMddHHmmssSSS_>

numberToKeep

可选

默认值:无

要保留的备份数量。如果在 solrconfig.xml 中的复制处理程序上指定了 maxNumberOfBackups,则始终使用 maxNumberOfBackups,并且尝试使用 numberToKeep 将导致错误。此外,如果指定了备份名称,则不考虑此参数。有关 maxNumberOfBackups 的更多信息,请参阅 配置 ReplicationHandler 部分。

repository

可选

默认值:无

用于备份的存储库的名称。如果未指定存储库,则会自动使用本地文件系统存储库。

commitName

可选

默认值:无

在使用 CREATESNAPSHOT 命令创建快照时使用的提交的名称。

备份状态

可以通过向 /replication 处理程序发送 details 命令来监视 backup 操作是否已完成,如本例所示

状态 API 示例
https://127.0.0.1:8983/solr/gettingstarted/replication?command=details&wt=xml
输出片段
<lst name="backup">
  <str name="startTime">2022-02-11T17:19:33.271461700Z</str>
  <int name="fileCount">10</int>
  <int name="indexFileCount">10</int>
  <str name="status">success</str>
  <str name="snapshotCompletedAt">2022-02-11T17:19:34.363859100Z</str>
  <str name="endTime">2022-02-11T17:19:34.363859100Z</str>
  <str name="snapshotName">my_backup</str>
</lst>

如果失败,则会在响应中发送 snapShootException

还原 API

还原备份需要向 /replication 处理程序发送 restore 命令,后跟要还原的备份的名称。

您可以使用如下命令从备份还原

用法示例
https://127.0.0.1:8983/solr/gettingstarted/replication?command=restore&name=backup_name

这将把指定的索引快照还原到当前核心。还原完成后,搜索将开始反映快照数据。

restore 请求可以采用以下附加参数

location

可选

默认值:无

备份快照文件的位置。如果未指定,它会在 Solr 的数据目录中查找备份。

name

可选

默认值:无

要还原的备份索引快照的名称。如果未提供名称,它会在位置目录中查找具有 snapshot.<timestamp> 格式的备份。在这种情况下,它会选择最新的时间戳备份。

repository

可选

默认值:无

用于备份的存储库的名称。如果未指定存储库,则会自动使用本地文件系统存储库。

restore 命令是一个异步调用。还原完成后,反映的数据将是还原的备份索引的数据。

在同一时间,只能对一个核心进行一次 restore 调用。当正在进行还原操作时,后续的还原调用将引发异常。

还原状态 API

您还可以通过向 /replication 处理程序发送 restorestatus 命令来检查 restore 操作的状态,如本例所示

状态 API 示例
https://127.0.0.1:8983/solr/gettingstarted/replication?command=restorestatus&wt=xml
状态 API 输出
<response>
  <lst name="responseHeader">
    <int name="status">0</int>
    <int name="QTime">0</int>
  </lst>
  <lst name="restorestatus">
    <str name="snapshotName">snapshot.<name></str>
    <str name="status">success</str>
  </lst>
</response>

状态值可以是“In Progress”、“success”或“failed”。如果失败,则响应中还会发送“exception”。

CREATE:创建快照

快照功能与备份功能不同,因为索引文件不会复制到任何地方。索引文件在相同的索引目录中进行快照,并且可以在进行备份时引用。

您可以使用如下 HTTP 命令触发快照命令(将“techproducts”替换为您正在使用的核心的名称)

  • V1 API

  • V2 API

curl -X POST https://127.0.0.1:8983/solr/admin/cores?action=CREATESNAPSHOT&core=techproducts&commitName=commit1

使用 v2 API,核心和快照名称是路径的一部分,而不是查询参数。

curl -X POST https://127.0.0.1:8983/api/cores/techproducts/snapshots/commit1

CREATE 参数

CREATE 操作允许以下参数

async

可选

默认值:无

用于跟踪此操作的请求 ID,该操作将异步处理。

CREATE 响应

响应将包括请求的状态、核心名称、快照名称、索引目录路径、快照生成以及文件名列表。如果状态不是“success”,则会有一条错误消息解释请求失败的原因。

List:列出特定核心的所有快照

您可以使用如下 HTTP 命令触发列表快照命令(将“techproducts”替换为您正在使用的核心的名称)

  • V1 API

  • V2 API

curl https://127.0.0.1:8983/solr/admin/cores?action=LISTSNAPSHOTS&core=techproducts&commitName=commit1

使用 v2 API,核心名称显示在路径中,而不是作为查询参数。

curl https://127.0.0.1:8983/api/cores/techproducts/snapshots

LIST 参数

LIST 操作允许以下参数

async

可选

默认值:无

用于跟踪此操作的请求 ID,该操作将异步处理。

LIST 响应

响应将包括请求的状态和核心的所有现有快照。如果状态不是“success”,则会有一条错误消息解释请求失败的原因。

DELETE:删除快照

您可以使用如下 HTTP 命令触发删除快照(将“techproducts”替换为您正在使用的核心的名称)

  • V1 API

  • V2 API

curl https://127.0.0.1:8983/solr/admin/cores?action=DELETESNAPSHOT&core=techproducts&commitName=commit1

使用 v2 API,核心和快照名称是路径的一部分,而不是查询参数。

curl -X DELETE https://127.0.0.1:8983/api/cores/techproducts/snapshots/commit1

DELETE 参数

DELETE 操作允许以下参数

async

可选

默认值:无

用于跟踪此操作的请求 ID,该操作将异步处理。

DELETE 响应

响应将包括请求的状态、核心名称以及已删除的快照的名称。如果状态不是“success”,则会有一条错误消息解释请求失败的原因。

备份/还原存储库

Solr 提供存储库抽象,允许用户将数据备份和还原到各种不同的存储系统。例如,在本地文件系统(例如,EXT3)上运行的 Solr 集群可以将备份数据存储在同一磁盘上、远程网络挂载的驱动器上、HDFS 中,甚至一些流行的“云存储”提供商中,具体取决于所选的“存储库”实现。Solr 开箱即用地提供了多种不同的存储库实现(LocalFileSystemRepositoryHdfsBackupRepositoryGCSBackupRepositoryS3BackupRepository),并允许用户根据需要为自己的存储系统创建插件。也可以创建一个 DelegatingBackupRepository,它委托给另一个 BackupRepository,并在其上添加或修改一些行为。

用户可以在其 solr.xml 文件中定义任意数量的存储库。上述备份和还原 API 允许用户在运行时通过 repository 参数选择他们要使用的定义。如果未指定 repository 参数,则默认使用本地文件系统存储库。

存储库由嵌套在 <backup> 父标签下的 <repository> 标签定义。所有 <repository> 标签都必须具有 name 属性(定义用户稍后可以引用以选择此存储库的标识符)和一个 class 属性(包含实现该存储库的完整 Java 类名)。它们还可能具有布尔值 default 属性,该属性在最多一个存储库定义上可以为 true<repository> 标签下的任何子项都将作为额外的配置传递给存储库,允许存储库读取其自己的特定于实现的配置。

下面提供了有关 Solr 提供的每个存储库实现的信息。

默认情况下,所有存储库实现都会在将索引文件复制到目标位置之前验证其完整性。但是,可以通过设置可选配置属性 verifyChecksum 来禁用此完整性检查。

verifyChecksum

可选

默认值:true

定义备份存储库是否应在将索引文件复制到目标位置之前检查其完整性。设置 false 以禁用校验和验证,以便以不同的方式验证完整性,例如,如果文件已加密。

LocalFileSystemRepository

LocalFileSystemRepository 在可访问文件系统上的任何位置存储和检索备份文件。文件可以存储在“本地”磁盘上,或者存储在看起来对文件系统是本地的网络挂载驱动器上。

希望结合使用网络驱动器和 LocalFileSystemRepository 的 SolrCloud 管理员应注意使驱动器在每个 Solr 节点上的相同位置可用。严格来说,该挂载只需要出现在进行备份(或还原)的节点和当前充当“监督者”的节点上。但是,由于“监督者”角色通常会在群集中的节点之间移动,因此通常建议将备份驱动器统一添加到所有节点。

任何未明确提供 repository 参数或在 solr.xml 中指定默认值的备份和还原命令都默认使用 LocalFileSystemRepository 实例。

LocalFileSystemRepository 接受以下配置选项

location

可选

默认值:无

用于备份存储和检索的有效文件路径(Solr 在本地可以访问)。当用户在其备份或还原 API 命令中未提供 location 参数时,用作回退。

下面提供了一个使用此属性的配置示例。

<backup>
  <repository name="local_repo" class="org.apache.solr.core.backup.repository.LocalFileSystemRepository">
    <str name="location">/solr/backup_data</str>
  </repository>
</backup>

HdfsBackupRepository

从 HDFS 目录存储和检索备份文件。

这是通过 hdfs Solr 模块提供的,需要在使用前启用。

HdfsBackupRepository 接受以下配置选项

solr.hdfs.buffer.size

可选

默认值:4096 千字节

用于将数据传输到 HDFS 和从 HDFS 传输数据的缓冲区的大小(以字节为单位)。在内存允许的情况下,使用较大的缓冲区通常可以获得更好的吞吐量。

solr.hdfs.home

必需

默认值:无

格式为 hdfs://<host>:<port>/<hdfsBaseFilePath> 的 HDFS URI,将 Solr 指向 HDFS 群集以存储(或检索)备份文件。

solr.hdfs.permissions.umask-mode

可选

默认值:无

在 HDFS 中创建文件时使用的权限 umask。

location

可选

默认值:无

HDFS 群集上的有效目录路径,用于备份存储和检索。当用户在其备份或还原 API 命令中未提供 location 参数时,用作回退。

下面提供了一个使用这些属性的配置示例

<backup>
  <repository name="hdfs" class="org.apache.solr.hdfs.backup.repository.HdfsBackupRepository" default="false">
    <str name="solr.hdfs.home">hdfs://some_hdfs_host:1234/solr/backup/data</str>
    <int name="solr.hdfs.buffer.size">8192</int>
    <str name="solr.hdfs.permissions.umask-mode">0022</str>
    <str name="location">/default/hdfs/backup/location</str>
  </repository>
</backup>

GCSBackupRepository

在 Google Cloud Storage (“GCS”) 存储桶中存储和检索备份文件。

这是通过 gcs-repository Solr 模块提供的,使用前需要启用该模块。

GCSBackupRepository 接受以下选项进行整体配置:

gcsBucket

可选

默认值:请参见描述

用于读取和写入所有备份文件的 GCS 存储桶。如果未指定,GCSBackupRepository 将使用 GCS_BUCKET 环境变量的值。如果这两个值都不存在,则默认使用值 solrBackupsBucket

gcsCredentialPath

可选

默认值:请参见描述

本地文件系统(Solr 可访问)上指向 Google Cloud 服务帐户密钥文件的路径。如果未指定,GCSBackupRepository 将使用 GCS_CREDENTIAL_PATH 环境变量的值。如果这两个值都不存在,并且 Solr 在 GCP 内部运行,则 GCS 客户端将尝试使用 GCP 的 “Compute Engine 元数据服务器” 或 工作负载身份功能进行身份验证。如果这两个值都不存在,并且 Solr 在 GCP 外部运行,它将无法进行身份验证,并且任何备份或还原操作都将失败。

location

可选

默认值:无

在给定的 GCS 存储桶中用于备份存储和检索的有效“目录”路径。(GCS 使用平面存储模型,但 Solr 的备份功能以近似于分层目录存储的方式命名 Blob。)当用户未在其备份或还原 API 命令中提供 location 参数时,用作回退。

除了这些用于整体配置的属性外,GCSBackupRepository 还允许用户详细控制用于与 GCS 通信的客户端。这些属性可能不会引起大多数用户的兴趣,但对于那些希望微调性能或受网络不稳定影响的用户可能很有价值。

GCSBackupRepository 接受以下高级客户端配置选项:

gcsWriteBufferSizeBytes

可选

默认值:16777216 字节 (16 MB)

向 GCS 发送数据时使用的缓冲区大小(以字节为单位)。

gcsReadBufferSizeBytes

可选

默认值:2097152 字节 (2 MB)

从 GCS 复制数据时使用的缓冲区大小(以字节为单位)。

gcsClientHttpConnectTimeoutMillis

可选

默认值:2000 毫秒

GCS 客户端发出的所有 HTTP 请求的连接超时时间(以毫秒为单位)。可以使用 0 请求无限超时。负整数或根本不指定值将导致使用默认值。

gcsClientHttpReadTimeoutMillis

可选

默认值:20000 毫秒

在已建立的连接上读取数据的读取超时时间(以毫秒为单位)。可以使用 0 请求无限超时。负整数或根本不指定值将导致使用默认值。

gcsClientMaxRetries

可选

默认值:10

操作失败时重试的最大次数。GCS 客户端将重试操作,直到达到此值,或者所有尝试的总时间超过 gcsClientMaxRequestTimeoutMillis。可以使用 0 指定不应进行重试。

gcsClientMaxRequestTimeoutMillis

可选

默认值:30000 毫秒

在所有失败操作的重试中花费的最大时间。GCS 客户端将重试操作,直到达到此超时时间,或者直到 gcsClientMaxRetries 次尝试失败。

gcsClientHttpInitialRetryDelayMillis

可选

默认值:1000 毫秒

失败的 HTTP 请求首次重试之前的延迟时间(以毫秒为单位)。此值还会影响后续的重试 - 有关更多信息,请参见下面的 gcsClientHttpRetryDelayMultiplier 说明。如果 gcsClientMaxRetries0,则忽略此属性,因为不进行任何重试。

gcsClientHttpRetryDelayMultiplier

可选

默认值:1.0

一个浮点乘数,用于缩放每次连续重试失败的 HTTP 请求之间的延迟。此数字越大,重试延迟的复合和缩放速度越快。

Under the covers, the GSC client uses an exponential backoff strategy between retries, governed by the formula: . The first retry will have a delay of , the second a delay of , the third a delay of , and so on.

如果未指定,则默认使用值 1.0,确保在每次重试尝试之间使用 gcsClientHttpInitialRetryDelayMillis

gcsClientHttpMaxRetryDelayMillis

可选

默认值:30000 毫秒

失败的 HTTP 请求的重试尝试之间的最大延迟时间(以毫秒为单位)。这通常用于限制多次尝试中发生的重试延迟的指数增长。有关在不受此最大值限制的情况下如何计算每个延迟的更多信息,请参见上面的 gcsClientHttpRetryDelayMultiplier 说明。

gcsClientRpcInitialTimeoutMillis

可选

默认值:10000 毫秒

在 RPC 请求超时之前等待的时间(以毫秒为单位)。此值还会影响后续的重试 - 有关更多信息,请参见下面的 gcsClientRpcTimeoutMultiplier 说明。如果 gcsClientMaxRetries0,则忽略此属性,因为不进行任何重试。

gcsClientRpcTimeoutMultiplier

可选

默认值:1.0

一个浮点乘数,用于缩放每次连续尝试失败的 RPC 请求的超时时间。此数字越大,超时时间的复合和缩放速度越快。

Under the covers, the GSC client uses an exponential backoff strategy for RPC timeouts, governed by the formula: . The first retry will have a delay of , the second a delay of , the third a delay of , and so on.

如果未指定,则默认使用值 1.0,确保在每次 RPC 尝试时使用 gcsClientRpcInitialTimeoutMillis

gcsClientRpcMaxTimeoutMillis

可选

默认值:30000 毫秒

失败的 RPC 请求的重试尝试的最大超时时间(以毫秒为单位)。这通常用于限制多次尝试中发生的超时时间的指数增长。有关在不受此最大值限制的情况下如何计算每个超时时间的更多信息,请参见上面的 gcsClientRpcTimeoutMultiplier 说明。

下面可以看到使用整体和 GCS 客户端属性的配置示例

<backup>
  <repository name="gcs_backup" class="org.apache.solr.gcs.GCSBackupRepository" default="false">
    <str name="gcsBucket">solrBackups</str>
    <str name="gcsCredentialPath">/local/path/to/credential/file</str>
    <str name="location">/default/gcs/backup/location</str>

    <int name="gcsClientMaxRetries">5</int>
    <int name="gcsClientHttpInitialRetryDelayMillis">1500</int>
    <double name="gcsClientHttpRetryDelayMultiplier">1.5</double>
    <int name="gcsClientHttpMaxRetryDelayMillis">10000</int>
  </repository>
</backup>

S3BackupRepository

在 Amazon S3 存储桶中存储和检索备份文件。

这是通过 s3-repository Solr 模块提供的,使用前需要启用该模块。

此插件使用 默认的 AWS 凭证提供程序链,因此请确保正确设置了凭证(例如,通过环境变量或在 ~/.aws/credentials 中等)。

使用 S3 存储库的 location 选项有一些细微差别。location 选项指定用于存储备份信息的子目录。

位置格式

当使用备份和还原集合 API 调用时,location 选项可以通过多种方式表示:

  • dir/in/bucket

  • /dir/in/bucket

  • s3:/dir/in/bucket

  • s3://dir/in/bucket

    以上所有选项都将解析为 S3 存储桶中的同一目录:dir/in/bucket

预先创建

在可以使用该位置执行任何备份操作之前,该位置必须已存在于您的 S3 存储桶中。

请注意,您在 S3 中创建的目录不能以 / 开头,因为 locations 会去除任何 / 前缀(如“位置格式”中所示)。

空位置

如果您不想使用存储桶中的子目录来存储备份,则可以使用以下任何位置选项:/s3:/s3://。但是,位置选项是强制性的,如果您尝试在没有位置选项的情况下执行备份操作,您将收到错误。

下面可以看到启用 S3 备份和还原的配置示例

<backup>
  <repository name="s3" class="org.apache.solr.s3.S3BackupRepository" default="false">
    <str name="s3.bucket.name">my-s3-bucket</str>
    <str name="s3.region">us-west-2</str>
  </repository>
</backup>

S3BackupRepository 接受以下选项(在 solr.xml 中)进行整体配置:

s3.bucket.name

可选

默认值:无

用于读取和写入所有备份文件的 S3 存储桶。可以通过设置 S3_BUCKET_NAME 环境变量来覆盖。

s3.profile

可选

默认值:无

一个配置文件,用于从配置文件加载 AWS 设置。配置文件允许为多个 S3 存储库设置独立的设置。可以通过设置 AWS_PROFILE 环境变量或 -Daws.profile 系统属性来覆盖。有关设置每个配置文件的更多信息,请参阅 AWS Java SDK 文档

s3.region

可选

默认值:无

配置您的存储桶所在的有效的 Amazon S3 区域字符串。您必须具有此存储桶的读取和写入权限。有关区域的完整列表,请参考 S3 文档。可以通过设置 S3_REGION 环境变量或在 AWS 配置文件中设置区域来覆盖。

s3.endpoint

可选

默认值:无

显式的 S3 端点。在使用 AWS S3 时,正常操作下不需要(S3 客户端可以从 s3.region 推断出端点)。如果使用模拟 S3 框架并希望显式覆盖 S3 请求的路由位置(例如使用 S3Mock 时),此参数很有用。可以通过设置 S3_ENDPOINT 环境变量来覆盖。

您可以使用 s3.endpoint 选项将此 BackupRepository 与与 s3 兼容的端点一起使用。请注意,并非所有与 s3 兼容的端点都可与 S3BackupRepository 一起使用。Minio 是一个与 s3 兼容的端点的示例,它不适用于 S3BackupRepository。S3BackupRepository 仅保证与 AWS S3 和 S3Mock 兼容。

s3.proxy.url

可选

默认值:无

如果需要,S3 客户端将请求路由通过的代理 URL。该 URL 应包含 <scheme>://<hostname>:<port>,但是如果缺少,则可以推断端口和方案可能

如果使用,这将覆盖设置的所有系统代理设置。无需禁用 s3.proxy.useSystemSettings 选项。如果您需要使用代理 usernamepasswordnonProxyHosts,请使用下面列出的系统属性。

s3.proxy.useSystemSettings

可选

默认值:true

默认情况下,如果设置了系统代理设置,则在与 S3 服务器通信时使用系统代理设置。支持的代理系统属性是:

  • http.proxyHost

  • http.proxyPort

  • http.nonProxyHosts

  • http.proxyUser

  • http.proxyPassword

s3.retries.disable

可选

默认值:false

禁用所有 S3 操作的重试。不建议这样做。

S3 客户端配置

AWS Java 开发工具包提供了多种方式来设置 S3 客户端的配置。Solr S3Repository 允许通过以下方式设置这些配置:

  • 环境变量

  • Java 系统属性

  • AWS 配置文件(可能每个配置文件都有)

这些选项包括:

  • 区域

  • 访问密钥

  • 重试

    • 重试模式 (LEGACY, STANDARD, ADAPTIVE)

    • 最大尝试次数