备份和还原
如果您担心数据丢失,当然您应该担心,您需要一种方法来备份您的 Solr 索引,以便在发生灾难性故障时可以快速恢复。
Solr 提供了两种备份和恢复 Solr 核或集合的方法,具体取决于您如何运行 Solr。如果您运行 SolrCloud 集群,您将使用集合 API。如果您运行用户管理的集群或单节点安装,您将使用复制处理程序。
备份(和快照)捕获已硬提交的数据。使用 同样,使用 |
SolrCloud 集群
SolrCloud 中的备份支持由集合 API提供。这允许在多个分片上生成备份,并恢复到与原始集合相同数量的分片和副本。
SolrCloud 备份/恢复需要在所有节点上以相同的路径挂载的共享文件系统或 HDFS。 |
支持四种不同的 API 命令
用户管理的集群和单节点安装
备份和恢复使用 Solr 的复制处理程序。Solr 默认包含对复制的隐式支持,因此可以使用此 API。但是,可以通过在 solrconfig.xml
中定义自己的复制处理程序来自定义复制处理程序的配置。有关配置复制处理程序的详细信息,请参阅部分 配置 ReplicationHandler。
备份 API
backup
API 需要向 /replication
处理程序发送命令以备份系统。
您可以使用类似这样的 HTTP 命令触发备份(将“gettingstarted”替换为正在使用的核心的名称)
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
操作以查看它是否已完成,如下例所示
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
操作的状态,如下例所示
http://localhost:8983/solr/gettingstarted/replication?command=restorestatus&wt=xml
<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
列出:列出特定核心的所有快照
您可以使用类似这样的 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
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
备份/还原存储库
Solr 提供了一个存储库抽象,允许用户将数据备份和还原到各种不同的存储系统。例如,在本地文件系统(例如 EXT3)上运行的 Solr 集群可以将备份数据存储在同一磁盘上、远程网络挂载驱动器上、HDFS 中,甚至可以存储在一些流行的“云存储”提供商中,具体取决于所选的“存储库”实现。Solr 开箱即用地提供了多种不同的存储库实现(LocalFileSystemRepository
、HdfsBackupRepository
、GCSBackupRepository
和 S3BackupRepository
),并允许用户根据需要为自己的存储系统创建插件。
用户可以在其 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 客户端将重试操作,直到达到此值,或所有尝试花费的时间超过
gcsClientMaxRequestTimeoutMillis
。0
可用于指定不应进行重试。 gcsClientMaxRequestTimeoutMillis
-
可选
默认值:
30000
毫秒在所有对失败操作的重试上花费的最大时间。GCS 客户端将重试操作,直到达到此超时,或直到
gcsClientMaxRetries
尝试失败。 gcsClientHttpInitialRetryDelayMillis
-
可选
默认值:
1000
毫秒以毫秒为单位的时间,在重试首次失败的 HTTP 请求之前延迟。此值还计入后续重试 - 有关更多信息,请参见下面的
gcsClientHttpRetryDelayMultiplier
描述。如果gcsClientMaxRetries
为0
,则忽略此属性,因为不会尝试重试。 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
描述。如果gcsClientMaxRetries
为0
,则忽略此属性,因为不会尝试重试。 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 备份和还原的示例配置
<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.proxy.url
-
可选
默认值:无
S3 客户端的代理 URL,用于根据需要路由请求。该 URL 应包括
<scheme>://<hostname>:<port>
,但如果缺少,则可能会推断出端口和方案。如果使用,这将覆盖任何已设置的系统代理设置。无需禁用
s3.proxy.useSystemSettings
选项。如果您需要使用代理username
、password
或nonProxyHosts
,请使用下面列出的系统属性。 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 配置文件(可能按配置文件)
这些选项包括
-
区域
-
访问密钥
-
重试
-
重试模式(
LEGACY
、STANDARD
、ADAPTIVE
) -
最大尝试次数
-