备份还原
> 文档中心 > 文档中心 > INFINI Easysearch > 功能手册 > 管理模块 > 备份还原

备份还原 #

快照是集群索引和状态的备份。状态包括集群设置、节点信息、索引设置和分片的信息。

快照有两个主要用途:

  • 从故障中恢复

    例如,如果集群运行状况变为红色,则可以从快照恢复红色索引。

  • 从一个群集迁移到另一个群集

    例如,如果您要从概念验证迁移到生产集群,您可以拍摄前者的快照并在后者上进行恢复。

关于快照(snapshots) #

快照不是即时的。它们需要时间来完成,并不代表集群的完美时间点视图。当快照正在进行时,您仍然可以为文档编制索引并向集群发出其他请求,但快照中通常不包括新文档和对现有文档的更新。快照包括 Easysearch 启动快照时存在的主碎片。根据快照线程池的大小,快照中可能会在稍微不同的时间包含不同的碎片。

Easysearch 快照是增量的,这意味着它们只存储自上次成功快照以来已更改的数据。频繁快照和不频繁快照之间的磁盘使用率差异通常很小。

换句话说,一周内每小时拍摄一次快照(总共拍摄 168 个快照)可能不会比周末拍摄一个快照占用更多的磁盘空间。此外,拍摄快照的频率越高,完成快照所需的时间越短。一些 Easysearch 用户每半小时拍摄一次快照。

如果需要删除快照,请确保使用 Easysearch API,而不是导航到存储位置并清除文件。集群中的增量快照通常共享大量相同的数据;使用 API 时, Easysearch 仅删除其他快照未使用的数据。 {: .tip }

注册快照存储库 #

在拍摄快照之前,必须“注册”快照存储库。快照存储库只是一个存储位置:共享文件系统、 Amazon S3 、 Hadoop 分布式文件系统(HDFS)、 Azure 存储等。

Shared file system #

  1. 要将共享文件系统用作快照存储库,请将其添加到 easysearch.yml
path.repo: ["/mnt/snapshots"]

在 RPM 和 Debian 安装中,您可以安装文件系统。如果您使用 Docker 安装,请在启动集群之前,将文件系统添加到 docker-compose.yml 中的每个节点:

volumes:
  - /Users/jdoe/snapshots:/mnt/snapshots
  1. T1.然后使用 REST API 注册存储库:
   PUT _snapshot/my-fs-repository
   {
     "type": "fs",
     "settings": {
       "location": "/mnt/snapshots"
     }
   }

如果请求成功,Easysearch 的响应很小:

{
  "acknowledged": true
}

您可能只需要指定 location ,但下表总结了选项:

SettingDescription
location快照的共享文件系统。必选的。
chunk_size在快照操作期间将大型文件分成块(例如 64mb1gb ),这对于云存储提供商来说很重要,而对于共享文件系统来说则不那么重要。默认值为 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 #

  1. 将 AWS 访问权限和密钥添加到 Easysearch 密钥库:
   sudo ./bin/easysearch-keystore add s3.client.default.access_key
   sudo ./bin/easysearch-keystore add s3.client.default.secret_key
  1. (Optional) 如果您使用的是临时凭据,请添加会话令牌:
   sudo ./bin/easysearch-keystore add s3.client.default.session_token
  1. (Optional) 如果您通过代理连接到 internet,请添加这些凭据:
   sudo ./bin/easysearch-keystore add s3.client.default.proxy.username
   sudo ./bin/easysearch-keystore add s3.client.default.proxy.password
  1. (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
  1. 如果更改了 easysearch.yml ,则必须重新启动集群中的每个节点。否则,您只需要重新加载安全集群设置:
   POST _nodes/reload_secure_settings
  1. 如果您还没有 S3 bucket ,请创建一个。要生成快照,您需要访问 bucket 的权限。以下 IAM 策略是这些权限的示例:
{
  "Version": "2022-10-17",
  "Statement": [
    {
      "Action": ["s3:*"],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::your-bucket", "arn:aws:s3:::your-bucket/*"]
    }
  ]
}
  1. 使用 REST API 注册存储库:
   PUT _snapshot/my-s3-repository
   {
     "type": "s3",
     "settings": {
       "bucket": "my-s3-bucket",
       "base_path": "my/snapshot/directory"
     }
   }

除了 bucketbase_path 之外,您可能不需要指定任何内容,但下表总结了选项:

SettingDescription
base_path桶中要存储快照的路径(e.g. my/snapshot/directory )。可选择的如果未指定,快照将存储在存储桶根目录中。
bucketS3 桶的名称。必选。
buffer_size超过阈值的块( chunk_size )应被分割成块( buffer_size )并使用不同的 API 发送到 S3。默认值是两个值中的较小值:100 MB 或 Java 堆的 5% 。有效值介于 5mb5gb 之间。我们不建议更改此选项。
canned_aclS3 有 canned ACLsrepository-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 。不要使用 glacierdeep_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
}
SettingDescription
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

快照具有以下状态:

StateDescription
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_patternrename_replacement 选项。然后,如果需要,可以使用 _reindex API 将两者结合起来。更简单的方法是在从快照恢复之前删除现有索引。

在从快照还原之前,可以使用 _close API 关闭现有索引,但快照中的索引必须具有与现有索引相同数量的碎片。

我们建议在从快照恢复之前停止对群集的写入请求,这有助于避免以下情况:

  1. 您可以删除索引,同时也会删除其别名。
  2. 对现已删除的别名的写入请求将创建与别名同名的新索引。
  3. 由于与新索引的命名冲突,快照中的别名无法还原。

快照只能向前兼容一个主要版本。例如,您不能将在 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'