You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于elasticsearch-dump配置Elasticsearch每日增量备份恢复流程

实现Elastic Cloud到本地Docker ES的每日增量备份(覆盖目标修改)

前置准备

  • 确保源(Elastic Cloud)和目标(本地Docker ES)的ES版本兼容,避免版本差异导致同步报错
  • 目标ES要么开启自动创建索引,要么先用首次全量导出的映射初始化好目标索引结构
  • 给源ES建一个只读权限的账号,目标ES建一个读写权限的账号,用于同步操作

核心方案:基于时间戳的增量同步 + 定时任务

1. 第一次全量同步(初始化)

先用elasticsearch-dump做一次全量同步,把所有现有数据和映射导到本地:

# 同步映射
elasticdump \
  --input=https://<云账号>:<云密码>@<Cloud ES端点>:9243/<索引名> \
  --output=http://<本地账号>:<本地密码>@localhost:9200/<索引名> \
  --type=mapping

# 同步全量数据
elasticdump \
  --input=https://<云账号>:<云密码>@<Cloud ES端点>:9243/<索引名> \
  --output=http://<本地账号>:<本地密码>@localhost:9200/<索引名> \
  --type=data \
  --overwrite=true

同步完成后,记录当前时间到本地文件(比如/opt/es_sync/last_sync_time.txt):

date -u +"%Y-%m-%dT%H:%M:%SZ" > /opt/es_sync/last_sync_time.txt

2. 每日增量同步逻辑

后续每天只同步上次同步时间之后的新数据/更新数据,用range查询过滤增量,同时用--overwrite=true覆盖目标端相同_id的文档:

LAST_SYNC=$(cat /opt/es_sync/last_sync_time.txt)
CURRENT_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")

# 先同步映射(如果源端有字段新增)
elasticdump \
  --input=https://<云账号>:<云密码>@<Cloud ES端点>:9243/<索引名> \
  --output=http://<本地账号>:<本地密码>@localhost:9200/<索引名> \
  --type=mapping

# 同步增量数据
elasticdump \
  --input=https://<云账号>:<云密码>@<Cloud ES端点>:9243/<索引名> \
  --output=http://<本地账号>:<本地密码>@localhost:9200/<索引名> \
  --searchBody="{\"query\": {\"range\": {\"@timestamp\": {\"gt\": \"$LAST_SYNC\"}}}}" \
  --type=data \
  --overwrite=true

# 更新同步时间
echo "$CURRENT_TIME" > /opt/es_sync/last_sync_time.txt

注意:如果你的文档用的不是@timestamp作为更新时间,换成自定义的updated_at之类的字段即可。

3. 定时自动化(Linux/macOS用cron)

编辑crontab添加每日凌晨2点的定时任务:

crontab -e

添加如下内容(替换成你的实际参数):

0 2 * * * /bin/bash -c '
  LAST_SYNC=$(cat /opt/es_sync/last_sync_time.txt 2>/dev/null || echo "1970-01-01T00:00:00Z")
  CURRENT_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
  # 同步映射
  elasticdump --input=https://<云账号>:<云密码>@<Cloud ES端点>:9243/<索引名> --output=http://<本地账号>:<本地密码>@localhost:9200/<索引名> --type=mapping
  # 同步增量数据
  elasticdump --input=https://<云账号>:<云密码>@<Cloud ES端点>:9243/<索引名> --output=http://<本地账号>:<本地密码>@localhost:9200/<索引名> --searchBody="{\"query\": {\"range\": {\"@timestamp\": {\"gt\": \"$LAST_SYNC\"}}}}" --type=data --overwrite=true
  echo "$CURRENT_TIME" > /opt/es_sync/last_sync_time.txt
' >> /var/log/es_sync.log 2>&1

Windows环境可以用「任务计划程序」来执行这个脚本。

备选方案:Elastic跨集群复制(CCR)

如果你的Elastic Cloud是白金版及以上许可,直接用ES原生的CCR更省心:

  • 在Cloud端把目标索引设为领导者索引
  • 在本地Docker ES上创建追随者索引,指向Cloud的领导者索引
  • CCR会自动增量同步,且追随者索引默认只读,所有更新只能来自源端,自动覆盖目标端的修改
  • 优势:无需手动写脚本,可靠性高;缺点:需要高版本许可

验证同步效果

同步后可以用以下命令验证:

# 查看源ES文档数
curl -u <云账号>:<云密码> https://<Cloud ES端点>:9243/<索引名>/_count?pretty

# 查看本地ES文档数
curl -u <本地账号>:<本地密码> http://localhost:9200/<索引名>/_count?pretty

随机抽几个文档的_id,对比两端内容是否一致。

内容的提问来源于stack exchange,提问作者user352290

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:13:14