文章目录
- 前言
- [Elasticsearch 数据备份完整指南](#Elasticsearch 数据备份完整指南)
-
- 一、环境信息
- 二、配置步骤(已完成)
-
- [1. 修改 ES 配置](#1. 修改 ES 配置)
- [2. 设置目录权限](#2. 设置目录权限)
- [3. 注册快照仓库](#3. 注册快照仓库)
- [4. 验证仓库](#4. 验证仓库)
- 三、手动创建快照
- 四、设置每天凌晨1点自动备份
- 五、常用管理命令
- 六、恢复数据
- 七、查看备份文件
- 八、重要概念说明
-
- [1. 增量备份](#1. 增量备份)
- [2. 快照保留策略](#2. 快照保留策略)
- [3. 恢复时选择哪个快照?](#3. 恢复时选择哪个快照?)
- [4. 查看快照包含的内容](#4. 查看快照包含的内容)
- 九、添加新索引到备份
- 十、验证备份成功
- 十一、注意事项
- [Elasticsearch 自动备份定时任务执行问题总结](#Elasticsearch 自动备份定时任务执行问题总结)
- 总结
前言
es数据备份
Elasticsearch 数据备份完整指南
根据我们的实际操作,以下是你成功配置的 ES 单节点备份方案。
一、环境信息
| 项目 | 值 |
|---|---|
| ES 节点 IP | 192.168.0.110 |
| ES 版本 | 9.2.6 |
| 集群名称 | bztc-elasticsearch |
| 备份目录 | /home/elasticsearch/es-back |
| 仓库名称 | es_backup_repo |
二、配置步骤(已完成)
1. 修改 ES 配置
编辑 /etc/elasticsearch/elasticsearch.yml,添加:
yaml
path.repo: ["/home/elasticsearch/es-back"]
重启 ES:
bash
sudo systemctl restart elasticsearch
2. 设置目录权限
bash
sudo chown -R elasticsearch:elasticsearch /home/elasticsearch/es-back
sudo chmod 755 /home/elasticsearch/es-back
3. 注册快照仓库
bash
curl -X PUT "http://192.168.0.110:9200/_snapshot/es_backup_repo" -H 'Content-Type: application/json' -d'
{
"type": "fs",
"settings": {
"location": "/home/elasticsearch/es-back",
"compress": true
}
}'
4. 验证仓库
bash
curl -X POST "http://192.168.0.110:9200/_snapshot/es_backup_repo/_verify"
三、手动创建快照
备份所有 bztc_cloud_* 开头的索引(推荐)
bash
curl -X PUT "http://192.168.0.110:9200/_snapshot/es_backup_repo/snapshot_20260423" -H 'Content-Type: application/json' -d'
{
"indices": "bztc_cloud_*",
"ignore_unavailable": true,
"include_global_state": false
}'
备份指定索引
bash
curl -X PUT "http://192.168.0.110:9200/_snapshot/es_backup_repo/snapshot_20260423" -H 'Content-Type: application/json' -d'
{
"indices": "index1,index2,index3",
"ignore_unavailable": true,
"include_global_state": false
}'
等待备份完成
加 ?wait_for_completion=true 参数会等待直到备份完成:
bash
curl -X PUT "http://192.168.0.110:9200/_snapshot/es_backup_repo/snapshot_20260423?wait_for_completion=true" -H 'Content-Type: application/json' -d'
{
"indices": "bztc_cloud_*",
"ignore_unavailable": true,
"include_global_state": false
}'
四、设置每天凌晨1点自动备份
bash
curl -X PUT "http://192.168.0.110:9200/_slm/policy/daily_backup" -H 'Content-Type: application/json' -d'
{
"schedule": "0 0 1 * * ?",
"name": "<daily-backup-{now/d}>",
"repository": "es_backup_repo",
"config": {
"indices": ["bztc_cloud_*"],
"ignore_unavailable": true,
"include_global_state": false
},
"retention": {
"expire_after": "30d",
"min_count": 7,
"max_count": 50
}
}'
策略说明
| 参数 | 值 | 含义 |
|---|---|---|
schedule |
0 0 1 * * ? |
每天凌晨1点执行 |
indices |
["bztc_cloud_*"] |
备份所有以 bztc_cloud_ 开头的索引 |
expire_after |
30d |
30天后自动删除 |
min_count |
7 |
至少保留7个快照 |
max_count |
50 |
最多保留50个快照 |
自动备份生成的文件命名规则
daily-backup-2026.04.23
daily-backup-2026.04.24
daily-backup-2026.04.25
...
五、常用管理命令
查看操作
bash
# 查看所有快照
curl -X GET "http://192.168.0.110:9200/_snapshot/es_backup_repo/_all"
# 查看指定快照详情
curl -X GET "http://192.168.0.110:9200/_snapshot/es_backup_repo/snapshot_20260423"
# 查看自动备份策略
curl -X GET "http://192.168.0.110:9200/_slm/policy/daily_backup"
# 查看策略执行统计
curl -X GET "http://192.168.0.110:9200/_slm/stats"
# 查看索引列表
curl -X GET "http://192.168.0.110:9200/_cat/indices?v"
手动操作
bash
# 手动执行自动备份策略(测试用)
curl -X POST "http://192.168.0.110:9200/_slm/policy/daily_backup/_execute"
# 删除快照
curl -X DELETE "http://192.168.0.110:9200/_snapshot/es_backup_repo/snapshot_20260423"
# 暂停自动备份
curl -X POST "http://192.168.0.110:9200/_slm/policy/daily_backup/_stop"
# 恢复自动备份
curl -X POST "http://192.168.0.110:9200/_slm/policy/daily_backup/_start"
# 删除备份策略
curl -X DELETE "http://192.168.0.110:9200/_slm/policy/daily_backup"
六、恢复数据
恢复所有备份的索引
bash
curl -X POST "http://192.168.0.110:9200/_snapshot/es_backup_repo/snapshot_20260423/_restore"
恢复指定索引
bash
curl -X POST "http://192.168.0.110:9200/_snapshot/es_backup_repo/snapshot_20260423/_restore" -H 'Content-Type: application/json' -d'
{
"indices": "bztc_cloud_qa_record",
"ignore_unavailable": true
}'
恢复到临时索引(用于查看内容)
bash
curl -X POST "http://192.168.0.110:9200/_snapshot/es_backup_repo/snapshot_20260423/_restore" -H 'Content-Type: application/json' -d'
{
"indices": "bztc_cloud_qa_record",
"rename_pattern": "(.+)",
"rename_replacement": "restored_$1",
"include_global_state": false
}'
查看恢复后的数据
bash
# 查看文档数量
curl -X GET "http://192.168.0.110:9200/restored_bztc_cloud_qa_record/_count"
# 查看前10条文档
curl -X GET "http://192.168.0.110:9200/restored_bztc_cloud_qa_record/_search?pretty&size=10"
删除临时索引
bash
curl -X DELETE "http://192.168.0.110:9200/restored_bztc_cloud_qa_record"
七、查看备份文件
bash
# 查看备份目录
ls -lh /home/elasticsearch/es-back/
# 输出示例:
# index-0 # 索引文件
# index.latest # 最新索引指针
# indices/ # 各索引的分片目录
# meta-xxx.dat # 元数据文件
# snap-xxx.dat # 快照数据文件
八、重要概念说明
1. 增量备份
- 第一次快照:全量备份
- 后续快照:只备份变化的部分(增量)
- 恢复时只需最新的快照即可恢复全部数据
2. 快照保留策略
- 快照会保留 30 天
- 30 天前的快照被自动删除
- 至少保留 7 个,最多保留 50 个
3. 恢复时选择哪个快照?
- 使用最新的快照(日期最大的)即可恢复全部数据
- 不需要逐个恢复中间的快照
- 但中间的快照不能被删除(否则增量链会断)
4. 查看快照包含的内容
快照是物理备份,不能直接查看文档内容。需要:
- 恢复到临时索引
- 用
_searchAPI 查看 - 查看完后删除临时索引
九、添加新索引到备份
由于使用了通配符 bztc_cloud_*,任何以 bztc_cloud_ 开头的新索引都会被自动备份,无需修改配置。
例如以下索引会自动被备份:
bztc_cloud_user_logbztc_cloud_order_infobztc_cloud_new_feature
十、验证备份成功
成功标志:
- 快照状态为
"state":"SUCCESS" "shards":{"total":N,"failed":0,"successful":N}- 备份目录下生成文件
实际成功示例:
json
{
"snapshot": {
"snapshot": "snapshot_20260423",
"state": "SUCCESS",
"shards": {"total": 6, "failed": 0, "successful": 6}
}
}
十一、注意事项
_verify接口必须使用POST方法(全大写)- 快照命名:手动创建用固定名称,自动策略用带日期的动态名称
- 恢复时如果索引已存在,需要先删除或使用
rename_pattern重命名 - 通配符
bztc_cloud_*只匹配该前缀的索引,不会备份系统索引
Elasticsearch 自动备份定时任务执行问题总结
一、问题现象
设置每天凌晨1点自动备份,但实际没有在预期时间执行。
二、根本原因
Elasticsearch 的 SLM(快照生命周期管理)使用的 Cron 表达式基于 UTC 时区,不支持修改时区。
- UTC 时间凌晨 1 点 = 北京时间上午 9 点
- 所以设置
"schedule": "0 0 1 * * ?"会在北京时间上午 9 点执行,而不是凌晨 1 点
三、检查步骤
1. 检查 SLM 服务状态
bash
curl -X GET "http://192.168.0.110:9200/_slm/status"
"operation_mode":"RUNNING"表示正常运行- 如果返回
"STOPPED",执行curl -X POST "http://192.168.0.110:9200/_slm/start"启动
2. 查看策略详情和执行历史
bash
curl -X GET "http://192.168.0.110:9200/_slm/policy/daily_backup"
关键返回字段:
| 字段 | 说明 |
|---|---|
last_success |
上次成功执行的信息(含快照名称、时间) |
next_execution_millis |
下次计划执行的时间戳 |
snapshots_taken |
已创建的快照数量 |
snapshots_failed |
失败数量 |
3. 查看执行统计
bash
curl -X GET "http://192.168.0.110:9200/_slm/stats"
4. 查看所有快照
bash
curl -X GET "http://192.168.0.110:9200/_snapshot/es_backup_repo/_all"
四、解决方案
方案一:接受 UTC 时间(不修改)
- 保持现有配置
"schedule": "0 0 1 * * ?" - 备份会在北京时间上午 9 点执行
- 无需任何修改
方案二:转换为北京时间凌晨1点执行(推荐)
由于 ES 不支持改时区,通过计算时间差实现:
- 北京时间凌晨 1 点 = UTC 时间前一天的 17 点
- 设置 Cron 表达式为
"0 0 17 * * ?"
bash
# 删除旧策略
curl -X DELETE "http://192.168.0.110:9200/_slm/policy/daily_backup"
# 重新创建,使用 UTC 17:00(北京时间次日 01:00)
curl -X PUT "http://192.168.0.110:9200/_slm/policy/daily_backup" -H 'Content-Type: application/json' -d'
{
"schedule": "0 0 17 * * ?",
"name": "<daily-backup-{now/d}>",
"repository": "es_backup_repo",
"config": {
"indices": ["bztc_cloud_*"],
"ignore_unavailable": true,
"include_global_state": false
},
"retention": {
"expire_after": "30d",
"min_count": 7,
"max_count": 50
}
}'
五、时间对照表
| 目标执行时间(北京时间) | 需设置的 UTC Cron |
|---|---|
| 凌晨 00:00 | 0 0 16 * * ? |
| 凌晨 01:00 | 0 0 17 * * ? |
| 凌晨 02:00 | 0 0 18 * * ? |
| 凌晨 03:00 | 0 0 19 * * ? |
| 凌晨 04:00 | 0 0 20 * * ? |
| 凌晨 05:00 | 0 0 21 * * ? |
| 凌晨 06:00 | 0 0 22 * * ? |
| 上午 09:00 | 0 0 1 * * ?(当前配置) |
六、验证修改结果
bash
# 查看策略,确认下次执行时间
curl -X GET "http://192.168.0.110:9200/_slm/policy/daily_backup"
# 手动执行一次测试
curl -X POST "http://192.168.0.110:9200/_slm/policy/daily_backup/_execute"
七、重要原则
- ES 的 Cron 调度统一使用 UTC 时区,无法修改
- 业务预期时间需通过转换对应的 UTC 时间来实现
- 存储的时间字段(如
@timestamp)也以 UTC 存储,查询时由 Kibana 等工具自动转换显示 - 如需更复杂的时区调度(如按美国时间执行),建议使用 Logstash 的调度插件(支持时区参数)
八、常见问题排查表
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| 策略不执行 | SLM 服务未启动 | _slm/start |
| 时间不对 | 时区误解 | 按 UTC 重新计算 |
| 执行失败 | 仓库不可用 | _verify 验证仓库 |
| 快照未生成 | 策略配置错误 | 检查 config.indices 是否正确 |
| 第二天没看到新快照 | 检查 next_execution_millis |
确认时间是否已过 |