Loading

Elasticsearch:Snapshot

我们可以对整个Elasticsearch集群或集群中的部分索引/数据流拍摄快照,从而实现数据的备份。

快照仓库(snapshot repository)

在创建快照前,我们必须注册一个可以存放快照的仓库snapshot repository。snapshot repository既可以是本地仓库,也可以是云服务商通过对象存储技术(Object-based Storage)提供的远程仓库,如Amazon S3, HDFS, Microsoft Azure,和Google Cloud Storage等。如果在多个集群中注册同一快照存储库,则应当只有一个集群具有对该仓库的读写权限,仓库对其他集群应设置为只读。

我们可以通过Snapshot and restore APIs创建、查看或删除快照仓库,也可以在Elastic Cloud的管理界面直接手动操作。

20210308145624

快照生命周期管理(SLM)

当我们创建了一个快照仓库后,便可以通过Snapshot and restore APIs手动为集群中的索引或数据流创建快照了。但在实际应用中,我们往往需要Elasticsearch能够每隔一段时间便自动拍摄快照,这便是快照生命周期管理SLM(Snapshot Lifecycle Management)策略的作用。

PUT /_slm/policy/nightly-snapshots
{
  "schedule": "0 30 1 * * ?",          // 每天的1:30分拍摄快照(UTC时间)
  "name": "<nightly-snap-{now/d}>",    // 快照名称以nightly-snap-开头,以拍摄日期结尾
  "repository": "my_repository",       // 快照存放于名为my_repository的快照仓库中
  "config": { 
    "indices": ["*"]                   // 对所有索引/数据流拍摄快照
  },
  "retention": {                       // 快照的保留策略与上方快照创建任务的执行无关,但仅对SLM创建的快照有效,不会作用于手动创建的快照上
    "expire_after": "30d",             // 每个快照保留30天
    "min_count": 5,                    // 快照最少保留5个(若不足5个,则即使超过30天也不会删除)
    "max_count": 50                    // 快照最多保留50个(若超过50个,则即使不足30天也会删除)
  }
}

在Elastic Cloud创建SLM策略则更加方便:

20210308145949

20210308150115

当集群中索引的写入量很大时,SLM通常与ILM搭配使用。想象一个场景:需要保留索引中近三年的数据,但大多数情况下只需查询近两个月的数据。针对这种情况,我们可以将索引ILM策略中的Delete动作设置为每隔60天执行一次,同时SLM策略为每隔55天(小于60即可)拍摄一次快照,保留快照的最大数量为365*3/55,即20个。这样的话,近60天内的索引都将保存在集群中可供搜索。而一旦我们需要查询更久远的数据,只需恢复对应时间的快照即可。

同样,我们可以使用API查看SLM策略的执行情况:

GET /_slm/stats

// 返回
{
  "retention_runs": 13,                           // 快照保留策略执行的次数
  "retention_failed": 0,                       
  "retention_timed_out": 0, 
  "retention_deletion_time": "1.4s",              // 执行快照保留策略时删除快照的总用时
  "retention_deletion_time_millis": 1404,
  "policy_stats": [
    {
      "policy": "daily-snapshots",
      "snapshots_taken": 1,                       // daily-snapshots策略下创建的快照数
      "snapshots_failed": 1,
      "snapshots_deleted": 0, 
      "snapshot_deletion_failures": 0 
    }
  ],
  "total_snapshots_taken": 1,                     // 所有策略创建的总快照数
  "total_snapshots_failed": 1,
  "total_snapshots_deleted": 0, 
  "total_snapshot_deletion_failures": 0 
}

可搜索快照(Searchable snapshot)

创建

为不经常被搜索的索引创建可搜索快照,可以节省维护分片副本所消耗的资源,同时也能确保搜索性能不会太差。可以通过Mount snapshot API创建一个与可搜索快照相关联(mount)的索引,例如:

POST /_snapshot/<repository>/<snapshot>/_mount
{
  "index": "my_docs",                // 快照中被关联的索引
  "renamed_index": "docs",           // 新创建的集群中的索引
  "index_settings": { 
    "index.number_of_replicas": 0    // 对新索引的设置
  }
}

当新索引创建成功后,其分片所在节点会开始从快照仓库中同步数据。当数据同步完毕后,节点无需再次访问快照仓库而是使用本地的数据来响应搜索请求,因此索引的搜索性能并不会降低太多。默认情况下,与可搜索快照关联的索引副本数为0。如果为了提高搜索性能,可以修改索引设置中的index.number_of_replicas参数来增加副本数。

恢复

当存放与可搜索快照关联的索引的节点故障后,索引将被Elasticsearch重新分配到其他健康节点上。与创建索引时相同,节点可以直接从存储快照的仓库中恢复数据,这便是该类索引不需要副本也能保持高可用的原因。

使用

通常,可搜索快照的应用场景有以下两种:

  • 手动使用Mount snapshot API创建一个新索引,从而让快照中被关联的索引可搜索;
  • 对于已存在的索引,配置ILM策略使其进入Cold阶段时,自动执行Searchable Snapshot动作。该动作将为该索引创建一个可搜索快照,并与之相关联。

如果可搜索快照中包含了多个索引,那么在将快照与索引关联前,最好先clone一个只包含需要搜索的索引的快照,然后再进行关联操作。这样做的好处是每个索引都关联了一份独立的快照,方便分别对其进行生命周期管理。否则,只要快照被删除,那么所有与之关联的索引都会失去高可用性。

另外,建议在关联操作前,将索引每个分片都强制合并(force-merge)为一个segment,这样节点同步快照中的数据时会减少许多资源消耗。

posted @ 2021-03-12 01:04  koktlzz  阅读(657)  评论(0编辑  收藏  举报