3、Elasticsearch快照与恢复:注册快照仓库、创建快照、恢复快照、监控快照状态

快照,说白了就是给ES数据拍个照片。

你想想看,生产环境跑着几十TB的数据,万一哪个索引被误删了,或者集群出了故障,没有备份那真是欲哭无泪。我个人习惯,每周至少做一次全量快照,每天做增量。这玩意儿救过我不少次。

3.1 注册快照仓库

做快照之前,得先告诉ES:你的备份放哪儿?这个“地方”就是仓库。

ES支持多种仓库类型,最常用的是共享文件系统(Shared Filesystem)和S3对象存储。我建议生产环境用S3,省心、可靠。本地测试可以用文件系统。

注册一个文件系统仓库:

PUT _snapshot/my_backup
{
  "type": "fs",
  "settings": {
    "location": "/mount/backups/my_backup",
    "compress": true,
    "max_snapshot_bytes_per_sec": "50mb",
    "max_restore_bytes_per_sec": "50mb"
  }
}

这里要注意,location路径必须在所有ES节点的path.repo配置中声明过。否则会报错。我曾经因为忘记配这个,折腾了半小时。

注册一个S3仓库:

PUT _snapshot/my_s3_backup
{
  "type": "s3",
  "settings": {
    "bucket": "my-es-backup-bucket",
    "region": "us-east-1",
    "base_path": "es_snapshots",
    "compress": true
  }
}

用S3需要安装repository-s3插件。嗯,这里要注意,插件装完后要重启节点。

我的小技巧: 注册仓库时,建议把compress设为true。虽然会多消耗一点CPU,但能省下30%-50%的存储空间。对于大索引,效果很明显。

3.2 创建快照

仓库注册好了,就可以拍照片了。

创建快照有两种方式:全量快照和增量快照。ES的增量快照是自动的——它只备份自上次快照以来发生变化的数据段。你不需要手动指定。

创建全集群快照:

PUT _snapshot/my_backup/snapshot_20240101
{
  "indices": "*",
  "ignore_unavailable": true,
  "include_global_state": false
}

创建指定索引的快照:

PUT _snapshot/my_backup/snapshot_20240101
{
  "indices": "logs-2024.01.*,users",
  "ignore_unavailable": true,
  "include_global_state": false
}

我个人习惯,从不备份全局状态(include_global_state: false)。为什么呢?因为全局状态包含模板、设置等,恢复时容易和现有集群冲突。我只备份数据,模板单独管理。

避坑指南: 快照名称不要重复。如果你用同一个名字创建两次,第二次会失败。我曾经在自动化脚本里忘了加时间戳,结果半夜告警响个不停。

3.3 恢复快照

恢复快照,就是把照片还原成实物。

恢复操作很简单,但有几个坑要避开。

恢复整个快照:

POST _snapshot/my_backup/snapshot_20240101/_restore
{
  "indices": "*",
  "ignore_unavailable": true,
  "include_global_state": false,
  "rename_pattern": "(.+)",
  "rename_replacement": "restored_$1"
}

恢复部分索引:

POST _snapshot/my_backup/snapshot_20240101/_restore
{
  "indices": "logs-2024.01.01,logs-2024.01.02",
  "ignore_unavailable": true,
  "include_global_state": false,
  "rename_pattern": "logs-(.+)",
  "rename_replacement": "restored_logs_$1"
}

为什么要用rename_patternrename_replacement?你想想看,如果直接恢复,会把原来的索引覆盖掉。万一恢复错了,数据就丢了。我习惯给恢复的索引加个restored_前缀,确认没问题后再手动切换。

重要提醒: 恢复快照时,目标索引必须关闭或不存在。如果索引已经存在且处于打开状态,恢复会失败。你可以先删除索引,或者用重命名的方式恢复到新索引。

3.4 监控快照状态

快照创建和恢复都是异步操作。你不能发了请求就干等着,得监控状态。

查看所有快照:

GET _snapshot/my_backup/_all

查看单个快照状态:

GET _snapshot/my_backup/snapshot_20240101/_status

返回结果里,state字段是关键。常见状态有:

状态 含义
IN_PROGRESS 正在执行中
SUCCESS 已完成
FAILED 失败了,看原因
PARTIAL 部分成功,部分分片失败

查看正在运行的快照:

GET _snapshot/my_backup/snapshot_20240101/_status

这个接口会显示每个分片的进度。我经常用它来估算剩余时间。如果某个分片卡住了,多半是网络问题或者磁盘满了。

我的监控方案: 写一个定时脚本,每5分钟检查一次快照状态。如果发现FAILEDPARTIAL,立刻发告警。别等到第二天才发现备份失败了。

删除旧快照:

DELETE _snapshot/my_backup/snapshot_20240101

快照多了会占空间。我建议保留最近7天的全量快照,再保留最近30天的增量快照。太老的就删掉。

注意: 删除快照时,ES会自动清理不再被引用的数据段。但如果你手动删除了仓库里的文件,那ES就不知道哪些数据该清理了。千万别手贱去删仓库目录。

好了,快照与恢复的核心操作就这些。说白了就是:注册仓库、创建快照、恢复快照、监控状态。把这四步走顺了,数据安全就有保障了。