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_pattern和rename_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
这个接口会显示每个分片的进度。我经常用它来估算剩余时间。如果某个分片卡住了,多半是网络问题或者磁盘满了。
FAILED或PARTIAL,立刻发告警。别等到第二天才发现备份失败了。
删除旧快照:
DELETE _snapshot/my_backup/snapshot_20240101
快照多了会占空间。我建议保留最近7天的全量快照,再保留最近30天的增量快照。太老的就删掉。
好了,快照与恢复的核心操作就这些。说白了就是:注册仓库、创建快照、恢复快照、监控状态。把这四步走顺了,数据安全就有保障了。