一、elasticsearch-dump(第三方工具)
项目GitHub地址:https://github.com/elasticsearch-dump/elasticsearch-dump
依赖: Node.js(安装及配置环境变量, 步骤略)
安装elasticsearch-dump工具
npm install elasticdump -g
迁移命令示例:
迁移setting、mapping、data 示例↓ elasticdump --input=http://SourceIp:SourcePort/[YourIndex] --output=http://DestinationIp:DestinationPort/[YourIndex] --type=settings --limit=1000 elasticdump --input=http://SourceIp:SourcePort/[YourIndex] --output=http://DestinationIp:DestinationPort/[YourIndex] --type=mapping --limit=1000 elasticdump --input=http://SourceIp:SourcePort/[YourIndex] --output=http://DestinationIp:DestinationPort/[YourIndex] --type=data --limit=1000
命令参数解释:
- –input: 源地址,可为ES集群URL、文件或stdout,可指定索引,url格式为:{protocol}://{host}:{port}/{index},文件格式为: /home/outindex.json
- –output: 目标地址,可为ES集群地址URL、文件或stdout,可指定索引,url格式为:{protocol}://{host}:{port}/{index},文件格式为: /home/outindex.json
- –type: 迁移类型,默认为data,表明只迁移数据,可选settings, analyzer, data, mapping, alias
- –limit: 每批次操作数量, 默认为100, 可以根据需要调整
- 更多参数可通过
elasticdump --help
查看详细说明\
试用场景:elasticsearchdump工具和mysql数据库用于做数据备份的工具mysqldump工具类似,都是逻辑备份,需要将数据一条一条导出后再执行导入,所以适合数据量小的场景下进行迁移。
二、snapshot(自带快照接口)
备份到哪里
- 在创建快照(snapshot)之前,首先需要创建快照仓库(repository),一个仓库里面可以有多个快照。
- 在 Elasticsearch 中通过 repository 定义备份存储类型和位置,存储类型有共享文件系统、AWS 的 S3存储、HDFS、微软 Azure的存储、Google Cloud 的存储等。
- 首先,你要在 elasticsearch.yml 的配置文件中注明可以用作备份路径
path.repo
,如下所示:
path.repo: ["D:\\lkh", "D:\\ES\\elasticsearch\\data\\my_backup"]
- 配置好后,重启elasticsearch,就可以使用 snapshot api 来创建一个 repository 了,如下我们创建一个名为 my_backup 的 repository。
PUT /_snapshot/my_backup { "type": "fs", "settings": { "location": "D:\\ES\\elasticsearch\\data\\my_backup", "compress":"true" } }
- 之后我们就可以在这个 repository 中来备份数据了。
PUT _snapshot/my_backup { "type": "fs", "settings": { "location": "/mount/backups/my_backup", "max_snapshot_bytes_per_sec" : "50mb", "max_restore_bytes_per_sec" : "50mb" } }
- 参数:
my_backup:仓库名称
type:指定仓库的类型是一个共享文件系统
localhost:指定已挂载的设备作为仓库地址
compress:指定是否对快照文件进行压缩. 默认是 true
compress:是否将大文件分解成块,分解成块的单位,例子: 1GB, 10MB, 5KB, 500B,默认:null(不限制)
max_snapshot_bytes_per_sec:当快照数据进入仓库时,这个参数控制这个过程的限流情况。默认每秒 40mb/s
max_restore_bytes_per_sec:当从仓库恢复数据时,这个参数控制什么时候恢复过程会被限流以保障你的网络不会被占满。默认每秒 20mb。
readonly:仓库快照是否时只读,默认:false
如何备份
- 有了 repostiroy 后,我们就可以做备份了,也叫快照,也就是记录当下数据的状态。如下所示我们创建一个名为 snapshot_1 的快照。
PUT /_snapshot/my_backup/snapshot_1?wait_for_completion=true 或者备份某一个索引 PUT _snapshot/my_backup/snapshot_1 { "indices": "elasticsearch-1", "ignore_unavailable": true, "include_global_state": true } wait_for_completion 为 true 是指该 api 在备份执行完毕后再返回结果,否则默认是异步执行的,我们这里为了立刻看到效果,所以设置了该参数,线上执行时不用设置该参数,让其在后台异步执行即可。 执行成功后会返回如下结果,用于说明备份的情况: { "snapshot" : { "snapshot" : "snapshot_1", "uuid" : "Jf-7suADTUCudajaWaiqCg", "version_id" : 6070299, "version" : "6.7.2", "indices" : [ "elasticsearch-1", ".kibana_task_manager", "elasticsearch-1-index", ".kibana_1" ], "include_global_state" : true, "state" : "SUCCESS", "start_time" : "2021-12-13T08:14:36.761Z", "start_time_in_millis" : 1639383276761, "end_time" : "2021-12-13T08:14:37.131Z", "end_time_in_millis" : 1639383277131, "duration_in_millis" : 370, "failures" : [ ], "shards" : { "total" : 8, "failed" : 0, "successful" : 8 } } }
- 返回结果的参数意义都是比较直观的,比如 indices 指明此次备份涉及到的索引名称,由于我们没有指定需要备份的索引,这里备份了所有索引;state 指明状态;duration_in_millis 指明备份任务执行时长等。
- 此时如果去 /mount/backups/my_backup 查看,会发现里面多了很多文件,这些文件其实都是基于 elasticsearch data 目录中的文件生成的压缩存储的备份文件。大家可以通过 du -sh . 命令看一下该目录的大小,方便后续做对比。
- 有了 repostiroy 后,我们就可以做备份了,也叫快照,也就是记录当下数据的状态。如下所示我们创建一个名为 snapshot_1 的快照。
何时备份
- 通过上面的步骤我们成功创建了一个备份,但随着数据的新增,我们需要对新增的数据也做备份,那么我们如何做呢?方法很简单,只要再创建一个快照 snapshot_new 就可以了。
PUT /_snapshot/my_backup/snapshot_new?wait_for_completion=true
- 当执行完毕后,es_backup 目录体积变大了,这说明新数据备份进来了。如果在同一个 repository 中做多次 snapshot 时,Elasticsearch 会检查要备份的数据 segment 文件是否有变化,如果没有变化则不处理,否则只会把发生变化的 segment file 备份下来。这其实就实现了增量备份。
- Elasticsearch 的资深用户应该了解 force merge 功能,即可以强行将一个索引的 segment file 合并成指定数目,这里要注意的是如果你主动调用 force merge api,那么 snapshot 功能的增量备份功能就失效了,因为 api 调用完毕后,数据目录中的所有 segment file 都发生变化了。
- 另一个就是备份时机的问题,虽然 snapshot 不会占用太多的 cpu、磁盘和网络资源,但还是建议大家尽量在闲时做备份。
- 通过上面的步骤我们成功创建了一个备份,但随着数据的新增,我们需要对新增的数据也做备份,那么我们如何做呢?方法很简单,只要再创建一个快照 snapshot_new 就可以了。
如何恢复
- 通过下面的 api,我们可以将 index_1 索引恢复到 restored_index_1 中。这个恢复过程完全是基于文件的,因此效率会比较高。
如果集群中已有快照的索引那就会报索引已存在的错误。POST /_snapshot/my_backup/snapshot_1/_restore? wait_for_completion=true { "indices": "index_1", "rename_replacement": "restored_index_1" } POST _snapshot/my_backup/snapshot_1/_restore { "indices": "elasticsearch-1", "ignore_unavailable": true, "include_global_state": false, "rename_pattern": "elasticsearch-1", "rename_replacement": "restored_elasticsearch-1", "include_aliases": false }
- 参数解释
- partial:false可选,默认:false,如果快照包含一个或多个索引没有所有主碎片可用,则整个还原操作将失败。 如果为true,则允许恢复具有不可用碎片的索引的部分快照。将只恢复快照中成功包含的碎片。所有丢失的碎片将重新创建为空 。
- include_global_state:false 将还原快照中的所有数据流和索引,但不还原群集状态,如果ignore_unavailable:false时,一个索引缺失,快照请求会失败,true 时,在创建快照时会忽略不存在的索引
- include_aliases 是否需要别名,true恢复,false不恢复别名
- 这个rename_pattern 与rename_replacement 支持正则表达式
使用正则表达式:
“rename_pattern”: “test-0(.+)”,
“rename_replacement”: “restored_test_$1”
- 还原数据的时候,修改索引配置
POST /_snapshot/my_backup/snapshot_1/_restore { "indices": "elasticsearch-1", "ignore_unavailable": true, "index_settings": { "index.number_of_replicas": 0 }, "ignore_index_settings": [ "index.refresh_interval" ] } 恢复数据时,把恢复索引的副本数改为0(不需要副本)。
- 恢复到另外一个集群
重复之前的步骤(当前集群开启备份,并重启服务,创建仓库,将快照目录拷贝到另外一台服务器,恢复快照)
- 通过下面的 api,我们可以将 index_1 索引恢复到 restored_index_1 中。这个恢复过程完全是基于文件的,因此效率会比较高。
注意事项
- 快照恢复前需要关掉索引
POST /my_index/_close
开启索引
POST /my_index/_open - 不支持高版本备份恢复到低版本中, 低版本备份恢复到高版本部分支持, 具体情况可访问官网查看详情: https://www.elastic.co/guide/en/elasticsearch/reference/current/snapshot-restore.html
- 快照恢复前需要关掉索引
基本操作命令
// 恢复的指定索引 GET restored_index_3/_recovery // 查看集群里所有索引,可能包括跟你的恢复进程无关的其他分片移动: GET /_recovery/ // 取消一个恢复,你需要删除正在恢复的索引。因为恢复进程其实就是分片恢复,发送一个 删除索引 API 修改集群状态,就可以停止恢复进程: DELETE /restored_index_3 // 获取所有快照信息 GET _snapshot/my_backup/_all // 获取指定快照信息 GET /_snapshot/my_backup/snapshot_2 // 删除快照 DELETE /_snapshot/my_backup/snapshot_2 // 删除多个 DELETE /_snapshot/my_backup/snapshot_2,snapshot_3,snapshot_4 // 通配符删除 DELETE /_snapshot/my_backup/snaps* // 过期快照清理 POST /_snapshot/my_backup/_cleanup
验证集群各个节点是否可以使用这个仓库
POST /_snapshot/my_backup/_verify //返回,说明我3个节点的集群都验证通过 { "nodes" : { "Ex5l_bvGRT2DazMFYO-M3Q" : { "name" : "master" }, "CPiErxiBQOqvG0jINB42YQ" : { "name" : "node-002" }, "-YG6nieCS7y1bvHN4HHHiA" : { "name" : "node-003" } } }
查看指定快照状态
GET /_snapshot/my_backup/snapshot_2/_status
- 分片的状态有以下几种:
- INITIALIZING ->分片在检查集群状态看看自己是否可以被快照。这个一般是非常快的。
- STARTED -> 数据正在被传输到仓库。
- FINALIZING -> 数据传输完成;分片现在在发送快照元数据
- DONE -> 快照完成!
- FAILED -> 快照处理的时候碰到了错误,这个分片/索引/快照不可能完成了。检查你的日志获取更多信息。
- 分片的状态有以下几种:
查看/修改repository信息
GET /_snapshot/my_backup?pretty 可以使用POST 请求,用来修改已经存在的repository POST /_snapshot/my_backup { "type": "fs", "settings": { "location": "D:\\ES", "max_snapshot_bytes_per_sec" : "50mb", "max_restore_bytes_per_sec" : "50mb" } }
其他指令
// 列出所有当前正在运行的快照以及显示他们的详细状态信息 GET /_snapshot/_status?pretty // 查看指定仓库正在运行的快照以及显示他们的详细状态信息 GET /_snapshot/my_backup/_status?pretty //快照名可以通过使用 date_math_expressions 来自动获得,和创建新索引时类 似。注意特殊字符需要 URI 转码处理。 //例如,在名字中使用当前日期,比如 snapshot-2018.05.11,来创建快照,可以 使用如下命令完成: PUT /_snapshot/my_backup/<snapshot-{now/d}> curl -X PUT "localhost:9200/_snapshot/my_backup/ %3Csnapshot-%7Bnow%2Fd%7D%3E"
更多指令及操作详情
参考官方文档: https://www.elastic.co/guide/en/elasticsearch/reference/current/snapshot-restore.html
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 流年 丶!