elasticsearch 学习笔记之四 快照
一、背景
快照方案是官方提供的标准方案。指定一个快照仓库路径,通过接口调用触发快照,每次快照均是基于上次快照的增量;通过快照还原时,是还原到该快照那刻的数据,之前的变更全部取消。
二、基本用法
1、快照仓库配置
- 进入es 的安装目录下找到 elasticsearch.yml 文件,进行仓库配置,如果要配置多个仓库地址使用逗号隔开:
 
path.repo: /opt/xx/web/xx/elasticsearch.1/data/backup,/opt/es/backup/iotrm
- 每个仓库地址必须和elasticsearch 启动用户是同一个,如 es 启动账号是 es ,分组也是 es,则 这里 /opt/es/backup/iotrm 需要属于es,可以通过命令 chown -R es:es /opt/es/backup 设置
 - 重启es服务
 
2、注册快照仓库
使用 es 的API:PUT _snapshot 进行仓库注册
请求参数
{ "type": "fs", "settings": { "location": "/opt/es/backup/iotrm" } }

遇到的问题
1)如果注册时,注册的 location 地址没有配置在es的 elasticsearch.yml 文件中,会报如下错误

2)如果注册时,注册的location指定的地址与es程序运行的用户和组不一致,会报如下错误

3、指定仓库进行快照备份
使用 es 的API:PUT _snapshot/仓库名/快照名称?wait_for_completion=true 进行快照备份
http://10.19.223.119:9200/_snapshot/iotrm/%3Ciotrm-%7Bnow%7ByyyyMMddHHmmss%7D%7D%3E?wait_for_completion=true 快照名称可以配置时间格式,%3Ciotrm-%7Bnow%7ByyyyMMddHHmmss%7D%7D%3E 实际是:<iotrm-{now{yyyyMMddHHmmss}}>
请求body
{
  "include_global_state": false,    #表示全局信息如集群不备份
  "indices":["iotrm*"],     #备份 iotrm 开头的所有索引数据
  "metadata": {
    "taken_by": "xiaohua",
    "taken_because": "iotrm,backup test"
  }
}
表示将 iotrm 开头的所有索引进行备份
返回内容
    "snapshot": {
        "snapshot": "iotrm-20241203072538",
        "uuid": "idfOxhbCR961R6o3IiKpKQ",
        "version_id": 7100299,
        "version": "7.10.2",
        "indices": [
            "iotrm_xx_2024-09-12",
            "iotrm_xx",
            "iotrm_yy",
            "iotrm_xx$0x00070101_2024-11-30",
            "iotrm_yy_2024-09-12"
        ],
        "data_streams": [],
        "include_global_state": false,
        "metadata": {
            "taken_by": "xiaohua",
            "taken_because": "iotrm,backup test"
        },
        "state": "SUCCESS",
        "start_time": "2024-12-03T07:25:38.909Z",
        "start_time_in_millis": 1733210738909,
        "end_time": "2024-12-03T07:29:24.148Z",
        "end_time_in_millis": 1733210964148,
        "duration_in_millis": 225239,
        "failures": [],
        "shards": {
            "total": 5,
            "failed": 0,
            "successful": 5
        }
    }
}
4、指定某个仓库的某个快照进行还原
使用 es 的API:PUT _snapshot/仓库名/快照名称/_restore ?wait_for_completion=true 进行快照还原
5、查看某个仓库下的所有快照
使用 es 的API:GET_snapshot/仓库名/*
6、快照与恢复
6.1 单个索引快照备份
- 使用 es 的API:PUT _snapshot/仓库名/快照名称?wait_for_completion=true 进行快照备份
 
请求body
{ "include_global_state": false, "indices":["索引名称"], "metadata": { "taken_by": "wangfang5", "taken_because": "iotrm,backup test" } }
- 接口路径参数:快照名称 支持DATE MATH,这里值可以设置为:%3Ciotrm-%7Bnow%7ByyyyMMddHHmmss%7D%7D%3E,表示 <iotrm-{now{yyyyMMddHHmmss}}> ,其中yyyyMMddHHmmss符合Java的DateFormat格式要求。备份出来的快照名称为:iotrm-20241203072538
 
6.2 单个索引快照备份还原
- 使用es的API先将索引关闭:POST /索引名称/_close
 - 使用es的API指定某个快照进行还原:PUT /_snapshot/仓库名/快照名称/_restore?wait_for_completion=true ,如:这里的快照名称可以为:otrm-20241203072538
 
6.3 指定多个索引快照备份
- 使用 es 的API:PUT _snapshot/仓库名/快照名称?wait_for_completion=true 进行快照备份
 
请求 参数
{ "include_global_state": false, "indices":["iotrm*","xres_smartscreen"], #表示还原iotrm开头的索引以及xres_smartscreen "metadata": { "taken_by": "wangfang5", "taken_because": "iotrm,backup test" } }
- 接口路径参数:快照名称 支持DATE MATH,这里值可以设置为:%3Ciotrm-%7Bnow%7ByyyyMMddHHmmss%7D%7D%3E,表示 <iotrm-{now{yyyyMMddHHmmss}}> ,其中yyyyMMddHHmmss符合Java的DateFormat格式要求。备份出来的快照名称为:iotrm-20241203072538
 
6.4 指定多个索引备份还原
- 使用es的API先将索引关闭:POST /索引名称/_close,如:/iotrm*,xres_smartscreen/_close 表示将iotrm开头的索引以及xres_smartscreen关闭
 - 使用es的API指定某个快照进行还原:PUT /_snapshot/仓库名/快照名称/_restore?wait_for_completion=true ,如:这里的快照名称可以为:otrm-20241203072538
 
6.5 所有索引快照备份
- 使用 es 的API:PUT _snapshot/仓库名/快照名称?wait_for_completion=true 进行快照备份
 
请求参数
{ "include_global_state": false, "metadata": { "taken_by": "wangfang5", "taken_because": "iotrm,backup test" } }
- 接口路径参数:快照名称 支持DATE MATH,这里值可以设置为:%3Ciotrm-%7Bnow%7ByyyyMMddHHmmss%7D%7D%3E,表示 <iotrm-{now{yyyyMMddHHmmss}}> ,其中yyyyMMddHHmmss符合Java的DateFormat格式要求。备份出来的快照名称为:iotrm-20241203072538
 
6.6 所有索引恢复
- 使用es的API先将索引关闭:POST /*/_close
 - 使用es的API指定某个快照进行还原:PUT /_snapshot/仓库名/快照名称/_restore?wait_for_completion=true ,如:这里的快照名称可以为:otrm-20241203072538
 
三、示例
1、备份 以特定字符串开头的所有索引的数据(包括索引数据 settings/mapping/template 以及 文档数据) ---- 快照备份
第一次触发快照全量备份

示例中 备份出来的快照名为:iotrm-20241203072538
2830345的文档数据第一份全量备份耗时3分钟左右
第二次触发快照备份

示例中 备份出来的快照名为:iotrm-20241203085518
总共文档数据 2832160 ,但是第二次快照备份仅需36秒(因此是增量快照备份)
第三次触发快照备份

示例中 备份出来的快照名为:iotrm-20241203091239
总共文档数据 2834155,但是第三次快照备份仅需36秒(因此是增量快照备份)
2、还原 以特定字符串开头的所有索引的数据备份的数据(包括索引数据 settings/mapping/template 以及 文档数据) ---- 快照还原
快照有三个:iotrm-20241203072538、iotrm-20241203085518、iotrm-20241203091239
1)删除 iotrm 开头的所有索引下的所有文档数据 场景下进行还原
第一次还原 iotrm-20241203072538
http://10.19.214.13:9200/_snapshot/iotrm/iotrm-20241203072538/_restore?wait_for_completion=true

总共 2821980 条文档数据,还原需要 4 分钟左右
第二次还原 iotrm-20241203085518
先通过 es API 接口:http://10.19.214.13:9200/iotrm*/_close 关闭所有开头的索引
再通过 es API 接口:http://10.19.214.13:9200/_snapshot/iotrm/iotrm-20241203085518/_restore?wait_for_completion=true 还原数据到 快照版本 iotrm-2024120308551

总共 2832422条文档数据,变更了1万多的数据,还原需要 2 分钟左右
第三次还原 iotrm-20241203091239
先通过 es API 接口:http://10.19.214.13:9200/iotrm*/_close 关闭所有开头的索引
再通过 es API 接口:http://10.19.214.13:9200/_snapshot/iotrm/iotrm-20241203091239/_restore?wait_for_completion=true 还原数据到 快照版本 iotrm-2024120308551

总共 2834510条文档数据,还原需要 2 分钟左右
2)数据变更场景下进行还原

- 删除部分索引及其数据 --- 将iotrm_event_event_acs 开头的所有索引
 - 修改某个文档数据内容 --- 修改 iotrm_event_event_face$0x0002021e$face_2024-12-01 索引下 文档ID为 7jhDf5MBXFMQjG9sKGtY 数据。将其中的 basic.eventType 更改为xxx POST http://10.19.214.13:9200/iotrm_event_event_face%240x0002021e%24face_2024-12-01/_doc/7jhDf5MBXFMQjG9sKGtY/_update
 - 新增某个索引下的2个文档数据 --- iotrm_event_event_face$0x0002021e$face_2024-12-01 索引下 新增文档ID为1和2的数据 POST http://10.19.214.13:9200/iotrm_event_event_face%240x0002021e%24face_2024-12-01/_doc/2/
 - 删除某个索引下的一条文档数据 --- 删除iotrm_event_event_face$0x0002021e$face_2024-12-01 索引下 文档ID为 -zhDf5MBXFMQjG9sP2un 数据 DELETE http://10.19.214.13:9200/iotrm_event_event_face%240x0002021e%24face_2024-12-01/_doc/-zhDf5MBXFMQjG9sP2un
 
还原到快照 iotrm-20241203072538

总共 2821980 条文档数据,还原需要 2 分钟左右
3、备份 所有索引的所有数据(包括索引数据 settings/mapping/template 以及 文档数据) ---- 快照备份
第一次触发快照全量备份

示例中 备份出来的快照名为:all-20241203092245
总共文档数据 2835861 2.0G,第一次全量备份耗时4分钟左右
第二次触发快照全量备份(实际为增量备份)

示例中 备份出来的快照名为:all-20241203111133
总共文档数据 2867875 2.2G,第二次全量备份耗时1分钟左右
第三次触发快照全量备份(实际为增量备份)

示例中 备份出来的快照名为:all-20241203121320
总共文档数据 2875409 2.1G,第三次全量备份耗时1分钟左右
4、还原 所有索引的所有数据备份的数据(包括索引数据 settings/mapping/template 以及 文档数据) ---- 快照还原
有三份全量快照:all-20241203092245、all-20241203111133、all-20241203121320
将数据还原到 all-20241203092245 快照版本
- 通过es API 接口关闭所有索引:http://10.19.214.13:9200/*/_close
 - 通过es API 接口还原快照数据:http://10.19.214.13:9200/_snapshot/all/all-20241203092245/_restore?wait_for_completion=true
 

2854993 条数据,还原耗时4分钟左右
5、还原 所有索引的所有数据备份的数据的部分索引(包括索引数据 settings/mapping/template 以及 文档数据) ---- 快照还原
有1份全量快照 all-20241203124406,还原该快照中的 iotrm_event_illuminancetelemeter 索引数据,该索引在目标es中不存在
- 通过es API 接口关闭索引:http://10.19.214.13:9200/ iotrm_event_illuminancetelemeter/_close
 - 通过es API 接口还原快照数据:http://10.19.214.13:9200/_snapshot/total/all-20241203124406/_restore?wait_for_completion=true
 

2230000 条数据还原需要11.39秒
- 通过es API 接口打开索引:http://10.19.214.13:9200/ iotrm_event_illuminancetelemeter/_open
 
                    
                
                
            
        
浙公网安备 33010602011771号