Elasticsearch不仅提供了索引副本分片功能,还支持索引备份,尤其适合index索引误删或者数据丢失情况的恢复。
具体实现方式是,创建索引备份仓库→备份索引快照到仓库→查询索引备份仓库中快照列表→从备份快照中恢复索引。
三个概念:仓库(repository)、快照(snapshot)、索引(index)
为了方便理解,仓库可以理解为数据库实例,快照理解为数据库database,索引理解为表table。因此可以创建多个仓库,仓库中可以创建多个快照,快照中可以储存多个索引。不过通常只需要创建一个仓库,仓库中定时创建快照,快照储存多个索引数据即可。
如果是从云服务器厂商购买的ES服务,如:阿里云,云厂商已经实现了备份仓库功能,跳过一、二直接看下面第三部分;但如果是自己搭建的Elasticsearch,只有备份过快照仓库才能恢复数据,否则只能面对现实了。
下面从Restful请求方式和kibana可视化两种形式介绍备份的搭建:
一、创建备份仓库
首先在创建仓库前,确保elasticsearch.xml配置文件中指定一个仓库地址:
# 备份仓库位置
path.repo: /data/elasticsearch_data/es_backup
创建仓库,参数信息:
| 快照的位置。必选 |
| 打开快照文件的压缩。压缩仅应用于元数据文件(索引映射和设置)。数据文件未压缩。默认为 |
| 如果需要,可以在快照过程中将大文件分解为多个块。指定块尺寸的值,并且单元,例如: |
| 每个节点的节流恢复速率。默认为 |
| 每个节点的快照速率限制。默认为 |
| 使存储库为只读。默认为 |
以下我的参数具体为:仓库名称(backup_01)、仓库类型(fs)、仓库路径地址(/data/elasticsearch_data/es_backup)、备份速度(50mb)、恢复时的速度(50ms)
PUT _snapshot/backup_01?verify=false&pretty
{
"type":"fs",
"settings":{
"location":"/data/elasticsearch_data/es_backup",
"max_snapshot_bytes_per_sec":"50mb",
"max_restore_bytes_per_sec":"50mb"
}
}
二、创建快照,备份索引
一个仓库可以包含多个快照,快照可以存多个索引、部分索引或者一个单独的索引,还可以给索引指定一个唯一的名字作为备份名。
1.将所有索引备份到快照snapshot_01中,并存储到仓库backup_01下。
PUT _snapshot/backup_01/snapshot_01
2.将指定索引index_1,index_2备份到快照snapshot_01中,并存储到仓库backup_01下。
PUT _snapshot/backup_01/snapshot_01
{
"indices": "index_1,index_2"
}
3.查看仓库backup_01中所有快照
GET _snapshot/backup_01
4.查看快照snapshot_01中所有备份的索引
GET _snapshot/backup_01/snapshot_01
三、恢复数据
根据上面查到快照,确定需要恢复的索引信息后,还原恢复指定索引
1.恢复快照中所有索引
POST _snapshot/backup_01/snapshot_01/_restore
2.恢复快照中指定索引
POST _snapshot/backup_01/snapshot_01/_restore
{
"indices": "index_1"
}
另外可以在命令后面添加?wait_for_completion=true阻塞命令直到恢复完成再返回信息,恢复任务会在后台自动执行下去。
POST _snapshot/backup_01/snapshot_01/_restore?wait_for_completion=true
{
"indices": "index_1"
}