备份还原 #
快照是集群索引和状态的备份。状态包括集群设置、节点信息、索引设置和分片的信息。
快照有两个主要用途:
从故障中恢复
例如,如果集群运行状况变为红色,则可以从快照恢复红色索引。
从一个群集迁移到另一个群集
例如,如果您要从概念验证迁移到生产集群,您可以拍摄前者的快照并在后者上进行恢复。
关于快照(snapshots) #
快照不是即时的。它们需要时间来完成,并不代表集群的完美时间点视图。当快照正在进行时,您仍然可以为文档编制索引并向集群发出其他请求,但快照中通常不包括新文档和对现有文档的更新。快照包括 Easysearch 启动快照时存在的主碎片。根据快照线程池的大小,快照中可能会在稍微不同的时间包含不同的碎片。
Easysearch 快照是增量的,这意味着它们只存储自上次成功快照以来已更改的数据。频繁快照和不频繁快照之间的磁盘使用率差异通常很小。
换句话说,一周内每小时拍摄一次快照(总共拍摄 168 个快照)可能不会比周末拍摄一个快照占用更多的磁盘空间。此外,拍摄快照的频率越高,完成快照所需的时间越短。一些 Easysearch 用户每半小时拍摄一次快照。
如果需要删除快照,请确保使用 Easysearch API,而不是导航到存储位置并清除文件。集群中的增量快照通常共享大量相同的数据;使用 API 时, Easysearch 仅删除其他快照未使用的数据。 {: .tip }
注册快照存储库 #
在拍摄快照之前,必须“注册”快照存储库。快照存储库只是一个存储位置:共享文件系统、 Amazon S3 、 Hadoop 分布式文件系统(HDFS)、 Azure 存储等。
Shared file system #
- 要将共享文件系统用作快照存储库,请将其添加到
easysearch.yml
:
path.repo: ["/mnt/snapshots"]
在 RPM 和 Debian 安装中,您可以安装文件系统。如果您使用 Docker 安装,请在启动集群之前,将文件系统添加到 docker-compose.yml
中的每个节点:
volumes:
- /Users/jdoe/snapshots:/mnt/snapshots
- T1.然后使用 REST API 注册存储库:
PUT _snapshot/my-fs-repository
{
"type": "fs",
"settings": {
"location": "/mnt/snapshots"
}
}
如果请求成功,Easysearch 的响应很小:
{
"acknowledged": true
}
您可能只需要指定 location
,但下表总结了选项:
Setting | Description |
---|---|
location | 快照的共享文件系统。必选的。 |
chunk_size | 在快照操作期间将大型文件分成块(例如 64mb 、 1gb ),这对于云存储提供商来说很重要,而对于共享文件系统来说则不那么重要。默认值为 null (unlimited)。可选的 |
compress | 是否压缩元数据文件。此设置不会影响数据文件,数据文件可能已被压缩,具体取决于索引设置。默认值为 false 。可选的 |
max_restore_bytes_per_sec | 快照恢复的最大速率。默认值为每秒 40 MB( 40m )。可选的 |
max_snapshot_bytes_per_sec | 快照 s 生成的最大速率。默认值为每秒 40 MB( 40m )。可选的 |
readonly | 存储库是否为只读。当从一个集群( "readonly": false )迁移到另一个集群时( "readonly": true )非常有用。可选的 |
Amazon S3 #
- 将 AWS 访问权限和密钥添加到 Easysearch 密钥库:
sudo ./bin/easysearch-keystore add s3.client.default.access_key
sudo ./bin/easysearch-keystore add s3.client.default.secret_key
- (Optional) 如果您使用的是临时凭据,请添加会话令牌:
sudo ./bin/easysearch-keystore add s3.client.default.session_token
- (Optional) 如果您通过代理连接到 internet,请添加这些凭据:
sudo ./bin/easysearch-keystore add s3.client.default.proxy.username
sudo ./bin/easysearch-keystore add s3.client.default.proxy.password
- (Optional) 将其他设置添加到
easysearch.yml
:
s3.client.default.disable_chunked_encoding: false # Disables chunked encoding for compatibility with some storage services, but you probably don't need to change this value.
s3.client.default.endpoint: s3.amazonaws.com # S3 has alternate endpoints, but you probably don't need to change this value.
s3.client.default.max_retries: 3 # number of retries if a request fails
s3.client.default.path_style_access: false # whether to use the deprecated path-style bucket URLs.
# You probably don't need to change this value, but for more information, see https://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html#path-style-access.
s3.client.default.protocol: https # http or https
s3.client.default.proxy.host: my-proxy-host # the hostname for your proxy server
s3.client.default.proxy.port: 8080 # port for your proxy server
s3.client.default.read_timeout: 50s # the S3 connection timeout
s3.client.default.use_throttle_retries: true # whether the client should wait a progressively longer amount of time (exponential backoff) between each successive retry
- 如果更改了
easysearch.yml
,则必须重新启动集群中的每个节点。否则,您只需要重新加载安全集群设置:
POST _nodes/reload_secure_settings
- 如果您还没有 S3 bucket ,请创建一个。要生成快照,您需要访问 bucket 的权限。以下 IAM 策略是这些权限的示例:
{
"Version": "2022-10-17",
"Statement": [
{
"Action": ["s3:*"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::your-bucket", "arn:aws:s3:::your-bucket/*"]
}
]
}
- 使用 REST API 注册存储库:
PUT _snapshot/my-s3-repository
{
"type": "s3",
"settings": {
"bucket": "my-s3-bucket",
"base_path": "my/snapshot/directory"
}
}
除了 bucket
和 base_path
之外,您可能不需要指定任何内容,但下表总结了选项:
Setting | Description |
---|---|
base_path | 桶中要存储快照的路径(e.g. my/snapshot/directory )。可选择的如果未指定,快照将存储在存储桶根目录中。 |
bucket | S3 桶的名称。必选。 |
buffer_size | 超过阈值的块( chunk_size )应被分割成块( buffer_size )并使用不同的 API 发送到 S3。默认值是两个值中的较小值:100 MB 或 Java 堆的 5% 。有效值介于 5mb 和 5gb 之间。我们不建议更改此选项。 |
canned_acl | S3 有
canned ACLs, repository-s3 插件可以在 s3 中创建对象时将其添加到对象中。默认值为 private 。可选的 |
chunk_size | 在快照操作期间将文件分成块(e.g. 64mb , 1gb ),这对于云存储提供商来说很重要,而对于共享文件系统来说则不那么重要。默认值为 1gb 。可选的 |
client | 在指定客户端设置(e.g. s3.client.default.access_key )时,可以使用除 default 之外的字符串(e.g. s3.client.backup-role.access_key )。如果使用了备用名称,请更改此值以匹配。默认值和推荐值为 default 。可选的 |
compress | 是否压缩元数据文件。此设置不会影响数据文件,数据文件可能已被压缩,具体取决于索引设置。默认值为 false 。可选的 |
max_restore_bytes_per_sec | 快照恢复的最大速率。默认值为每秒 40 MB( 40m )。可选的 |
max_snapshot_bytes_per_sec | 快照拍摄的最大速率。默认值为每秒 40 MB( 40m )。可选的 |
readonly | 存储库是否为只读。当从一个集群( "readonly": false when registering)迁移到另一个集群时( "readonly": true when registering))非常有用。可选的 |
server_side_encryption | 是否加密 S3 存储桶中的快照文件。此设置使用 AES-256 和 S3 托管密钥。请参阅 使用服务器端加密保护数据. 默认值为 false 。可选的 |
storage_class | 指定
S3 存储类用于快照文件。默认值为 standard 。不要使用 glacier 和 deep_archive 存储类。可选的 |
创建快照 #
创建快照时,可以指定两条信息:
- 快照库名称
- 快照名称
以下快照包括所有索引和群集状态:
PUT _snapshot/my-repository/1
您还可以添加请求主体以包括或排除某些索引或指定其他设置:
PUT _snapshot/my-repository/2
{
"indices": "kibana*,my-index*,-my-index-2016",
"ignore_unavailable": true,
"include_global_state": false,
"partial": false
}
Setting | Description |
---|---|
indices | 要包含在快照中的索引。可以使用 , 创建索引列表,使用 * 指定索引模式,使用 - 排除某些索引。不要在项目之间放置空格。默认为所有索引。 |
ignore_unavailable | 如果 indices 列表中的索引不存在,则是否忽略该索引而不是使快照失败。默认值为 false 。 |
include_global_state | 是否在快照中包含群集状态。默认值为 true 。 |
partial | 是否允许部分快照。默认值为 false ,如果一个或多个碎片未能存储,则会导致整个快照失败。 |
如果在拍摄快照后立即请求快照,您可能会看到以下内容:
GET _snapshot/my-repository/2
{
"snapshots": [{
"snapshot": "2",
"version": "6.5.4",
"indices": [
"kibana_sample_data_ecommerce",
"my-index",
"kibana_sample_data_logs",
"kibana_sample_data_flights"
],
"include_global_state": true,
"state": "IN_PROGRESS",
...
}]
}
请注意,快照仍在进行中。如果要在继续之前等待快照完成,请在请求中添加 wait_for_completion
参数。快照可能需要一段时间才能完成,因此请考虑此选项是否适合您的使用情况:
PUT _snapshot/my-repository/3?wait_for_completion=true
快照具有以下状态:
State | Description |
---|---|
SUCCESS | 快照成功存储了所有碎片。 |
IN_PROGRESS | 快照当前正在运行。 |
PARTIAL | 至少有一个碎片未能成功存储。仅当您在拍摄快照时将 partial 设置为 true 时才会发生。 |
FAILED | 快照遇到错误,未存储任何数据。 |
INCOMPATIBLE | 快照与此群集上运行的 Easysearch 版本不兼容。请参阅 冲突和兼容性。 |
如果当前正在拍摄快照,则无法拍摄快照。要检查状态:
GET _snapshot/_status
恢复快照 #
恢复快照的第一步是检索现有快照。要查看所有快照存储库,请执行以下操作:
GET _snapshot/_all
要查看存储库中的所有快照,请执行以下操作:
GET _snapshot/my-repository/_all
然后恢复快照:
POST _snapshot/my-repository/2/_restore
就像拍摄快照时一样,您可以添加请求主体以包括或排除某些索引或指定一些其他设置:
POST _snapshot/my-repository/2/_restore
{
"indices": "console*,my-index*",
"ignore_unavailable": true,
"include_global_state": false,
"include_aliases": false,
"partial": false,
"rename_pattern": "console(.+)",
"rename_replacement": "restored-console$1",
"index_settings": {
"index.blocks.read_only": false
},
"ignore_index_settings": [
"index.refresh_interval"
]
}
设置 | 描述 |
---|---|
indices | 要恢复的索引。可以使用 , 创建索引列表,使用 * 指定索引模式,使用 - 排除某些索引。不要在项目之间放置空格。默认为所有索引。 |
ignore_unavailable | 如果 indices 列表中的索引不存在,则是否忽略该索引而不是使还原操作失败。默认值为 false 。 |
include_global_state | 是否还原群集状态。默认值为 false 。 |
include_aliases | 是否恢复别名及其关联索引。默认值为 true 。 |
partial | 是否允许恢复部分快照。默认值为 false 。 |
rename_pattern | 如果要在还原索引时重命名索引,请使用此选项指定与要还原的所有索引匹配的正则表达式。使用捕获组( () )重用索引名称的部分。 |
rename_replacement | 如果要在恢复索引时重命名索引,请使用此选项指定替换模式。使用 $0 包括整个匹配索引名称,使用 $1 包括第一个捕获组的内容,等等。 |
index_settings | 如果要在还原时更改索引设置,请在此处指定它们。 |
ignore_index_settings | 您可以忽略快照中的某些索引设置,并在还原时使用群集默认值,而不是使用 index_settings 显式指定新设置。 |
冲突与兼容性 #
恢复索引时避免命名冲突的一种方法是使用 rename_pattern
和 rename_replacement
选项。然后,如果需要,可以使用 _reindex
API 将两者结合起来。更简单的方法是在从快照恢复之前删除现有索引。
在从快照还原之前,可以使用 _close
API 关闭现有索引,但快照中的索引必须具有与现有索引相同数量的碎片。
我们建议在从快照恢复之前停止对群集的写入请求,这有助于避免以下情况:
- 您可以删除索引,同时也会删除其别名。
- 对现已删除的别名的写入请求将创建与别名同名的新索引。
- 由于与新索引的命名冲突,快照中的别名无法还原。
快照只能向前兼容一个主要版本。例如,您不能将在 2.x 集群上拍摄的快照还原到 1.x 集群或 6.x 集群,但您可以在 2.x 或 5.x 集群上还原快照。
如果您有一个旧快照,有时可以将其恢复到中间集群中,重新索引所有索引,创建新快照,然后重复,直到达到所需的版本,但您可能会发现只需在新集群上手动索引数据就更容易了。
Security 模块注意事项 #
如果您使用了是安全模块功能,快照还有一些额外的限制:
- 要执行快照和还原操作,用户必须具有内置
manage_snapshots
角色。 - 无法还原包含全局状态或
.security
索引的快照。
如果快照包含全局状态,则在执行还原时必须将其排除。如果快照还包含 .security
索引,请排除它或列出所有其他要包含的索引:
POST _snapshot/my-repository/3/_restore
{
"indices": "-.security",
"include_global_state": false
}
.security
索引包含敏感数据,因此建议在拍摄快照时将其排除。如果确实需要从快照还原索引,则必须在请求中包含管理员证书:
curl -k --cert ./admin.pem --key ./admin-key.pem -XPOST 'https://localhost:9200/_snapshot/my-repository/3/_restore?pretty'