es数据备份

文章目录


前言

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. 查看快照包含的内容

快照是物理备份,不能直接查看文档内容。需要:

  1. 恢复到临时索引
  2. _search API 查看
  3. 查看完后删除临时索引

九、添加新索引到备份

由于使用了通配符 bztc_cloud_*,任何以 bztc_cloud_ 开头的新索引都会被自动备份,无需修改配置。

例如以下索引会自动被备份:

  • bztc_cloud_user_log
  • bztc_cloud_order_info
  • bztc_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}
  }
}

十一、注意事项

  1. _verify 接口必须使用 POST 方法(全大写)
  2. 快照命名:手动创建用固定名称,自动策略用带日期的动态名称
  3. 恢复时如果索引已存在,需要先删除或使用 rename_pattern 重命名
  4. 通配符 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"

七、重要原则

  1. ES 的 Cron 调度统一使用 UTC 时区,无法修改
  2. 业务预期时间需通过转换对应的 UTC 时间来实现
  3. 存储的时间字段(如 @timestamp)也以 UTC 存储,查询时由 Kibana 等工具自动转换显示
  4. 如需更复杂的时区调度(如按美国时间执行),建议使用 Logstash 的调度插件(支持时区参数)

八、常见问题排查表

问题 可能原因 解决方法
策略不执行 SLM 服务未启动 _slm/start
时间不对 时区误解 按 UTC 重新计算
执行失败 仓库不可用 _verify 验证仓库
快照未生成 策略配置错误 检查 config.indices 是否正确
第二天没看到新快照 检查 next_execution_millis 确认时间是否已过

总结

相关推荐
aXin_ya2 小时前
微服务第六天 es继续了解
大数据·elasticsearch·搜索引擎
源码之家2 小时前
计算机毕业设计:Python雪球网股票数据采集与可视化系统 Flask框架 数据分析 可视化 大数据 大模型 爬虫(建议收藏)✅
大数据·python·机器学习·数据挖掘·数据分析·flask·课程设计
小白学大数据2 小时前
企业精准数据分析双路径对比:运营商大数据与 Python 爬虫技术选型与实践
大数据·开发语言·爬虫·python·数据分析
Elastic 中国社区官方博客2 小时前
使用 Elastic Observability 和 MCP 的 Agentic 驱动 Kubernetes 调查
数据库·elasticsearch·搜索引擎·云原生·容器·kubernetes·全文检索
前端若水2 小时前
Git 仓库管理命令完全指南(超级详细版)
大数据·git·elasticsearch
中电金信2 小时前
中电金信X四川农商银行打造分布式核心系统建设样板
大数据·人工智能
yiruwanlu2 小时前
特色美食赋能乡村文旅设计:经典案例落地路径深度解析
大数据·人工智能·python
黎阳之光2 小时前
黎阳之光:以视频孪生硬核实力,抢抓交通科技新机遇
大数据·人工智能·算法·安全·数字孪生
juniperhan2 小时前
Flink 系列第15篇:Flink 侧输出(Side Output)详解及实践
java·大数据·分布式·flink