备份和还原

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

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

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

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

SolrCloud 集群

SolrCloud 中的备份支持由集合 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 示例
http://localhost:8983/solr/gettingstarted/replication?command=backup

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

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

备份请求还可以采用以下附加参数

位置

可选

默认值:无

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

名称

可选

默认值:无

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

numberToKeep

可选

默认值:无

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

存储库

可选

默认值:无

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

commitName

可选

默认值:无

使用 CREATESNAPSHOT 命令获取快照时使用的提交的名称。

备份状态

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

状态 API 示例
http://localhost: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命令,后跟要还原的备份名称。

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

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

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

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

位置

可选

默认值:无

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

名称

可选

默认值:无

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

存储库

可选

默认值:无

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

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

一次只能对一个核心进行一个restore调用。在正在进行还原操作时,后续还原调用将抛出异常。

还原状态 API

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

状态 API 示例
http://localhost: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>

状态值可以是“正在进行”、“成功”或“失败”。如果失败,则响应中还将发送一个“异常”。

创建:创建快照

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

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

V1 API

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

V2 API

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

curl -X POST http://localhost:8983/api/cores/techproducts/snapshots/commit1

创建参数

CREATE 操作允许以下参数

async

可选

默认值:无

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

创建响应

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

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

您可以使用类似这样的 HTTP 命令触发列表快照命令(用您正在使用的核心的名称替换“techproducts”)

V1 API

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

V2 API

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

curl http://localhost:8983/api/cores/techproducts/snapshots

LIST 参数

LIST 操作允许使用以下参数

async

可选

默认值:无

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

LIST 响应

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

DELETE:删除快照

您可以使用类似这样的 HTTP 命令触发删除快照(用您正在使用的核心的名称替换“techproducts”)

V1 API

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

V2 API

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

curl -X DELETE http://localhost:8983/api/cores/techproducts/snapshots/commit1

DELETE 参数

DELETE 操作允许使用以下参数

async

可选

默认值:无

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

DELETE 响应

响应将包括请求的状态、核心名称和已删除快照的名称。如果状态不是“成功”,错误消息将解释请求失败的原因。

备份/还原存储库

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

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

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

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

LocalFileSystemRepository

LocalFileSystemRepository 在可访问的文件系统上的任何位置存储和检索备份文件。文件可以存储在“本地”磁盘上,也可以存储在对文件系统显示为本地的网络挂载驱动器上。

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

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

LocalFileSystemRepository 接受以下配置选项

位置

可选

默认值:无

用于备份存储和检索的有效文件路径(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 中传输数据的缓冲区大小(以字节为单位)。缓冲区越大,通常能获得更好的吞吐量,具体取决于内存允许情况。

solr.hdfs.home

必需

默认值:无

格式为 hdfs://<host>:<port>/<hdfsBaseFilePath> 的 HDFS URI,用于指示 Solr 在 HDFS 集群中存储(或检索)备份文件。

solr.hdfs.permissions.umask-mode

可选

默认值:无

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

位置

可选

默认值:无

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 外部运行,它将无法进行身份验证,并且任何备份或还原操作都将失败。

位置

可选

默认值:无

给定 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 客户端将重试操作,直到达到此值,或所有尝试花费的时间超过 gcsClientMaxRequestTimeoutMillis0 可用于指定不应进行重试。

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 中等)。

location 选项与 S3 存储库一起使用时有一些细微差别。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 设置的配置文件。配置文件允许为多个 S3Repository 设置独立的设置。可以通过设置 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 是一个与 S3BackupRepository 不兼容的兼容 S3 的终结点的示例。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 SDK 提供了许多为 S3 客户端设置配置的方法。Solr S3Repository 允许通过以下方式设置这些配置

  • 环境变量

  • Java 系统属性

  • AWS 配置文件(可能按配置文件)

这些选项包括

  • 区域

  • 访问密钥

  • 重试

    • 重试模式(LEGACYSTANDARDADAPTIVE

    • 最大尝试次数