首页 > 代码库 > Elasticsearch 快照和恢复

Elasticsearch 快照和恢复

摘要: 在Elasticsearch中的可以创建快照,它创建单个索引或整个群集到一个远程的存储库中。在以前的版本中,系统只支持共享存储的快照创建,最新的版本可以通过插件支持更多的方式。在执行快照操作前,需要在Elasticsearch中进行注册快照仓库。

    在Elasticsearch中的可以创建快照,它创建单个索引或整个群集到一个远程的存储库中。在以前的版本中,系统只支持共享存储的快照创建,最新的版本可以通过插件支持更多的方式。在执行快照操作前,需要在Elasticsearch中进行注册快照仓库。注册仓库的设置需要执行仓库类型,例如:

请求:PUT /_snapshot/my_backup

参数:

{
  "type": "fs",
  "settings": {
        ... repository specific settings ...
  }
}

    当注册后,可以通过查询来得到之前注册的信息。当然系统也支持用逗号分开来查询多个注册,支持通配符查询多个注册,甚至可以使用_all查询所有注册。

请求:GET /_snapshot/my_backup

返回值:

{
  "my_backup": {
    "type": "fs",
    "settings": {
      "compress": "true",
      "location": "/mount/backups/my_backup"
    }
  }
}

    共享文件系统存储("type": "fs")使用共享文件系统来存储快照。为了注册共享的文件系统存储库,必须将同一个共享文件系统安装到所有主节点和数据节点上相同的位置上。这个位置(或它的父目录)必须在所有主节点数据节点上设置path.repo参数。假设共享文件系统安装在/mount/backups/my_backup目录下,在elasticsearch.yml文件中的设置应增加:

path.repo: ["/mount/backups", "/mount/longterm_backups"]

备注:path.repo设置支持微软Windows UNC路径,只要服务器名和共享名称进行正确的设置,例如:

path.repo: ["\\\\MY_SERVER\\Snapshots"]

    只有当所有的节点都重新启动后,使用以下面的命令可以为名称为my_backup的共享文件系统库进行快照和恢复,例如:

请求:PUT http://localhost:9200/_snapshot/my_backup

参数:

{
    "type": "fs",
    "settings": {
        "location": "/mount/backups/my_backup",
        "compress": true
    }
}

    系统支持相对路径的,如果存储位置指定为相对路径,则不需要写具体的全路径,例如:

请求:PUT http://localhost:9200/_snapshot/my_backup

参数:

{
    "type": "fs",
    "settings": {
        "location": "my_backup",
        "compress": true
    }
}

系统支持一下参数:

location:快照位置,必须要有。

compress:打开快照文件的压缩。压缩仅适用于元数据文件,数据文件不进行压缩。默认为true。

chunk_size:如果需要可以把大的文件分解成不同的快照。块的大小可以指定字节例如1G,10m,5K。默认值为null表示无限的块大小。

max_restore_bytes_per_sec:使每个节点的恢复的速度。默认为40MB每秒。

max_snapshot_bytes_per_sec:每个节点生成的快照的速度。默认为40MB每秒。

readonly:使存储库只读。默认为false。

只读仓库

    URL仓库("type": "url")被用在共享文件系统库中创建只读方式数据仓库。在url参数中指定指向共享的文件系统存储库的根节点,支持以下设置:

url:强制性的快照位置。

     url参数支持以下协议:"http", "https", "ftp", "file" , "jar",在http:, https:, and ftp: 这些协议中,可以支持白名单,白名单的设置在 repositories.url.allowed_urls 参数中,例如:

repositories.url.allowed_urls: ["http://www.example.org/root/*", "https://*.mydomain.com/*?*#*"]

存储库可以通过插件支持更多的方式,比如:

AWS云插件的S3存储库,Hadoop的HDFS插件环境,Azure云存储库插件。

    当一个存储库被注册时,它立即被验证在所有主节点和数据节点上,以确保它在群集中的所有节点上都可以使用。验证参数可用于在注册或更新存储库时显式禁用,例如:

请求:PUT /_snapshot/s3_repository?verify=false

参数:

{
  "type": "s3",
  "settings": {
    "bucket": "my_s3_bucket",
    "region": "eu-west-1"
  }
}

验证过程也可以通过运行以下命令来手动执行:

POST /_snapshot/s3_repository/_verify

它返回一个节点列表,如果验证过程失败,则会成功验证或错误消息。

本文由赛克 蓝德(secisland)原创,转载请标明作者和出处。

快照

    一个存储库可以包含同一个群集的多个快照。快照在集群内的名称是唯一的。在一个库中创建名称为snapshot_1快照可以执行下面的命令:

PUT /_snapshot/my_backup/snapshot_1?wait_for_completion=true

    wait_for_completion参数指定快照初始化后立即返回(默认)还是等待快照完成后返回。在快照初始化时,所有以前的快照信息加载到内存,这意味着创建一个大的库快照可能需要几秒钟(甚至几分钟)。所以有时候wait_for_completion参数设置为false也是需要等待一会的。

    默认情况下所有打开的快照和在集群中开始索引时创建,此行为可以通过指定快照请求中的索引列表来改变,例如:

请求:PUT /_snapshot/my_backup/snapshot_1

参数:

{
  "indices": "index_1,index_2",
  "ignore_unavailable": "true",
  "include_global_state": false
}

    可以使用支持多索引语法的索引参数来指定快照的索引列表。快照请求也支持ignore_unavailable选项,将它设置为true时可以在快照创建过程中把不存在的索引忽略掉。默认情况下,当ignore_unavailable选项不设置或者设置为false的时候,如果不存在索引,索引的快照请求将失败。通过设置include_global_state为false可以防止集群全局状态被被存储为快照的一部分。默认情况下,如果有一个或多个索引没有可用的主分片整个快照会失败,这种行为可以通过设置部分来改变。

    索引快照处理是渐进的。在索引快照的过程中Elasticsearch会分析索引文件的列表是否已存储在存储库中,同时复制上次创建的快照或更改的文件。这允许在一个紧凑形式的存储库中保存多个快照,快照的过程是非阻塞的方式执行。当对索引正在执行快照时所有的索引和搜索操作可以继续执行。然而,快照执行的数据是在快照创建时的时间点确定的,所以在快照过程开始后添加到索引中的记录将不会再快照中出现。在1.2.0之前版本之前,如果群集有迁移或者在索引中初始化分片时会失败,在1.2.0之后,快照的操作会等待这些完成后再操作。一个快照除了创建集群的副本外,还可以存储全局群集元数据,其中包括持久性群集设置和模板。临时设置和注册的快照库不会存储为快照的一部分。

    在任何时间只有一个快照过程在集群中被执行。而一个特定的快照被创建分片时,这分片不能移动到另一个节点,它可能干扰再平衡过程和过滤操作。一次快照完成Elasticsearch只能移动一块到另一个节点(根据当前配置过滤设置和调整算法)。一旦一个快照完成,关于这个快照的信息,可以使用以下命令来获得:

GET /_snapshot/my_backup/snapshot_1

类似的仓库,对多个快照信息可以通过一次进行查询,以及支持通配符,或者用_all查询所有:

GET /_snapshot/my_backup/snapshot_*,some_other_snapshot

    如果一些快照不可用,该命令将失败。布尔参数ignore_unvailable可用于返回所有目前可用的快照。可以使用以下命令查询当前正在运行的快照:

GET localhost:9200/_snapshot/my_backup/_current

快照可以从使用下列命令的存储库中删除:

DELETE /_snapshot/my_backup/snapshot_1

    当快照是从库中删除时,Elasticsearch将删除与快照关联的和其他快照也不使用的所有文件,如果执行快照创建的过程中同时删除快照,则快照创建的过程会停止,同时删除相关的文件。因此,删除快照操作可以用来取消被错误启动的长时间运行快照操作。使用下面的命令可以删除存储库:

DELETE /_snapshot/my_backup

    当一个库被删除,Elasticsearch仅删除存储库的位置的引用,快照本身并没有被删除。

恢复

使用以下命令可恢复快照:

POST /_snapshot/my_backup/snapshot_1/_restore

    默认情况下,快照中的所有索引以及群集状态将被恢复,在恢复include_global_state选项时,可以指定具体的索引和集群状态被恢复。索引的列表支持多索引语法。rename_pattern和rename_replacement选项也可用于重命名索引,可以使用正则表达式,该表达式支持引用原始文本。设置include_aliases为假可以防止相关索引的别名被一起恢复,例如:

请求:POST /_snapshot/my_backup/snapshot_1/_restore

参数:

{
  "indices": "index_1,index_2",
  "ignore_unavailable": "true",
  "include_global_state": false,
  "rename_pattern": "index_(.+)",
  "rename_replacement": "restored_index_$1"
}

    恢复操作可以在一个功能集群上执行。在快照索中有相同数量分片的索引如果是关闭的,则只能恢复。如果索引是关闭的则恢复操作会自动打开索引,如果索引在集群中不存在,恢复操作将会创建新的索引,如果恢复群集状态,则在该群集中不存在的模板将被添加,已恢复的模板会替换为具有相同名称的现有模板。恢复中的设置被添加到现有的设置中。

    部分恢复,默认情况下,如果一个或更多的索引如果没有可用的快照碎片,整个恢复操作将失败。如果一些碎片没有快照,通过设置partial为true,仍可以恢复部分索引。请注意,在这种情况下只有有分片的索引会被正确恢复,没有的索引会建立空的索引。

    在恢复过程中改变索引设置,在恢复过程中大多数索引的设置可以被覆盖。例如,下面的命令将不创建任何副本而切换回默认刷新间隔的恢复索引index_1:

请求:POST /_snapshot/my_backup/snapshot_1/_restore

参数:

{
  "indices": "index_1",
  "index_settings": {
    "index.number_of_replicas": 0
  },
  "ignore_index_settings": [
    "index.refresh_interval"
  ]}

请注意,一些设置,如index.number_of_shards在恢复操作期间是无法更改的。

    恢复到不同的集群,快照中存储的信息不依赖于特定的群集或群集名称。因此,它有可能恢复从一个群集到另一个群集的快照。仅要求注册存储库中包含快照,并启动恢复过程,新的群集不具有相同的大小或拓扑结构。如果一个集群有的空间比较小,需要考虑的事情有:首先,要确保新的集群有足够的容量来存储快照中的所有索引。在还原的过程中,可以改变索引设置,以减少复制的次数,这可以帮助将快照恢复到较小的群集,也可以选择使用索引参数。在版本1.5.0之前,Elasticsearch没有检查恢复持续的设置使得有可能恢复出错,参数discovery.zen.minimum_master_nodes 禁用一个小集群直到添加所需的主节点数。从版本1.5.0此的设置将被忽略。如果在原始集群的索引被分配到特定的节点,使用过滤分片配置,同样的规则将在新的集群执行。因此,如果新的群集不包含具有已有属性的节点,则该恢复的索引可以被分配,除非这些索引分配设置在恢复操作期间改变,否则不会恢复成功。

快照状态

快照statusedit

使用以下命令可获得当前运行快照的详细状态信息列表:

GET /_snapshot/_status

下面的命令将返回有关当前正在运行的快照的信息。通过指定一个存储库的名称,可以将结果限制为特定的存储库:

GET /_snapshot/my_backup/_status

如果指定了存储库名称和快照标识,该命令将返回给定快照的详细状态信息:

GET /_snapshot/my_backup/snapshot_1/_status

同样支持多个id的查询,例如:

GET /_snapshot/my_backup/snapshot_1,snapshot_2/_status

监控快照恢复过程

    当快照的进度和恢复正在运行有几种方法来监视它们过程。wait_for_completion参数会阻止客户端直到操作完成。这是最简单的方法,可以用来获得有关操作完成的通知。

快照操作还可以定期对快照信息进行监视,例如:

GET /_snapshot/my_backup/snapshot_1

    请注意,快照信息的操作使用相同的资源和线程池作为快照操作。所以,当大的分片被快照会导致快照操作,在返回结果之前在等待可用资源,所以这种会占用很多的时间。为了获得更直接的快照状态的完整信息,可以使用快照状态命令来查询,例如:

GET /_snapshot/my_backup/snapshot_1/_status

    快照信息方法在处理过程中返回快照的基本信息,快照状态返回在快照中每个分片的当前状态。

    在恢复操作时,Elasticsearch的集群通常会进入红色状态。这是因为还原操作开始恢复的索引主要碎片。在这个操作时,主分片变得不可用,这体现在红色状态。一旦碎片恢复完成Elasticsearch是转换为标准的复制过程,创建所需数量的副本这时集群切换到黄色状态。一旦所有所需的复制品被创建,群集切换到绿色状态。群集健康操作仅为恢复过程的高层次状态。通过使用索引恢复和精简api可以获得更详细的恢复过程中的状态。

停止当前正在运行的快照和恢复操作

    快照和恢复操作允许一次只运行一个快照或一次恢复。如果一个当前运行的快照被错误地执行,或者需要很长的时间,可以使用快照删除操作来终止它。快照删除时是会进行检查,如果删除快照正在运行,则停止此次删除。

    还原操作使用标准的分片恢复机制。因此,可以通过删除索引来取消恢复的操作。请注意,在这种情况下所有已删除索引的数据将被从集群中移除。

    快照和恢复操作对集群块的影响,快照和恢复操作都受集群和索引块的影响。例如,注册和注销库需要通过编写全局元数据来进行访问。快照操作需要所有的索引和元数据以及全局元数据都是可读的。恢复操作需要全局元数据是可写的,但是索引水平块将被忽略,因为在恢复的过程中索引是重建的。请注意,存储库内容不是群集的一部分,因此群集块不影响内部存储库操作,例如已注册的存储库中的列表或删除快照。

    赛克蓝德(secisland)后续会逐步对Elasticsearch的最新版本的各项功能进行分析,近请期待。也欢迎加入secisland公众号进行关注。

Elasticsearch 快照和恢复