如何基于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
相关产品推荐
相关产品推荐

