1、序言

Elasticsearch默认配置是数据持久化的,就是ES会定时地把缓存数据刷新到硬盘,从而达到数据持久化地效果。在生产环境中,ES的数据持久化是必须的,防止出现断电时数据的丢失。固然,除了数据持久化外,咱们也是得作到数据备份的,防止出现数据损坏时没法恢复数据的状况。

下面开始介绍ES的数据备份和恢复。

2、ES环境

在开始ES的数据备份和恢复以前,咱们得确保服务器的ES环境时搭建好的,这里就很少作介绍了,如有不懂的能够查看这篇ES入门文章了解下:
https://blog.csdn.net/qq_15092079/article/details/81411334。

在搭建ES环境中须要注意的几点:

  • JDK的安装配置,ES的启动时依赖于JDK的
  • 须要另外建立个用户来启动ES,root用户是不能启动ES的
  • 启动时的vm.max_map_count的报错问题
  • ES默认是只能让本机访问,若须要远程访问还需修改文件elasticsearch.yml的network.host
  • kibana数据可视化界面的安装

3、备份数据

3.1 配置文件elasticsearch.yml

在配置文件config/elasticsearch.yml 中添加一行数据,设置ES备份的快照数据存储路径。如果没有此目录则须要自行建立。配置好后,须要重启ES

path.repo: ["/usr/local/elasticsearch/snapshot"]

3.2 建立仓库

其实就是在ES库中建立一个备份存储的目的仓库,这里以仓库名称为 backup 为例,有以下两种方式。

1)在linux服务器上执行如下命令。

curl  -H "Content-Type: application/json" -XPUT -u elastic:xxx http://ES的IP:9200/_snapshot/backup -d '{"type": "fs","settings": {"location": "/usr/local/elasticsearch/snapshot"}}'

2)在kibana的Dev Tools开发工具中调用接口。

PUT _snapshot/backup{  "type": "fs",  "settings": {    "location": "data_bk",    "compress": true,    "max_snapshot_bytes_per_sec" : "50mb",    "max_restore_bytes_per_sec" : "50mb"  }}

调用参数说明:

compress,是否压缩,默认为是。
max_snapshot_bytes_per_sec,每一个节点快照速率。默认40mb/s。
max_restore_bytes_per_sec,节点恢复速率。默认40mb/s。
返回结果以下,则说明建立成功。

{    "acknowledged": true}

3.3 删除备份数据

在备份数据以前,最好是先根据备份数据的名称删除原来已经备份好的数据。相同名称的备份数据是不能重复备份的。

这里以备份数据的名称为 bk_20190926 为例,后面的执行都以此为例,有以下两种方式。
1)在linux服务器上执行如下命令。

curl -XDELETE http://ES的ip:端口/_snapshot/backup/bk_20190926

2)在kibana的Dev Tools开发工具中调用接口。

DELETE _snapshot/backup/bk_20190926

返回结果以下,则说明删除成功。

{    "acknowledged": true}

3.4 开始备份数据

备份数据一样是与删除数据同样,直接调用ES的接口实现的,有以下两种方式。
1)在linux服务器上执行如下命令。

curl -XPUT http://ES的ip:端口/_snapshot/backup/bk_20190926?wait_for_completion=true

2)在kibana的Dev Tools开发工具中调用接口。

PUT _snapshot/backup/bk_20190926?wait_for_completion=true

返回结果以下,则说明已经备份成功。

{    "snapshot": {        "snapshot": "bk_20190926",        "uuid": "K4fze5eGSvOwot_xWtz0Hw",        "version_id": 6050399,        "version": "6.5.3",        "indices": [            "first_index"        ],        "include_global_state": true,        "state": "SUCCESS",        "start_time": "2019-09-27T05:36:39.398Z",        "start_time_in_millis": 1569562599398,        "end_time": "2019-09-27T05:36:39.723Z",        "end_time_in_millis": 1569562599723,        "duration_in_millis": 325,        "failures": [],        "shards": {            "total": 5,            "failed": 0,            "successful": 5        }    }}

同时,能够在ES所在的服务器的目录/usr/local/elasticsearch/snapshot/data_bk下查看到增长了不少文件,这些就是备份数据所需的文件。

3.5 查看备份数据

备份完数据后,直接在服务器上能够看到这些备份的文件,可是这些文件并非一眼就能看出你备份了哪些数据的,此时你能够经过调用ES的接口来查看你备份了哪些数据。一样有两种方式调用。
1)在linux服务器上执行如下命令。

curl -XGET http://ES的ip:端口/_snapshot/backup/_all

2)在kibana的Dev Tools开发工具中调用接口。

GET _snapshot/backup/_all

返回结果以下,你备份了多少快照均可以在这里看到,snapshots列表的最后一个元素就是你最近备份的快照。

{    "snapshots": [        {            "snapshot": "bk_20190926",            "uuid": "K4fze5eGSvOwot_xWtz0Hw",            "version_id": 6050399,            "version": "6.5.3",            "indices": [                "first_index"            ],            "include_global_state": true,            "state": "SUCCESS",            "start_time": "2019-09-27T05:36:39.398Z",            "start_time_in_millis": 1569562599398,            "end_time": "2019-09-27T05:36:39.723Z",            "end_time_in_millis": 1569562599723,            "duration_in_millis": 325,            "failures": [],            "shards": {                "total": 5,                "failed": 0,                "successful": 5            }        }    ]}

4、恢复数据

数据备份好了,若是真的出现了不可逆的数据损坏状况,此时就能够进行数据恢复了。

4.1 备份data文件夹

data文件夹其实就是当前ES的数据存储地,防止恢复数据出现异常,先把ES目录下面的data目录备份一下。

tar -cvf data-20190626.tar.gz data

4.2 清空数据

恢复数据以前,先把当前ES的数据清空掉。有以下两种方式。

(1)在linux服务器上执行如下命令。

curl -XDELETE http://ES的ip:端口/_all

(2)在kibana的Dev Tools开发工具中调用接口。

DELETE _all

返回结果以下,则说明清空数据成功。

{    "acknowledged": true}

4.3 恢复数据

恢复数据一样有以下两种方式操做。

(1)在linux服务器上执行如下命令。

curl -XPOST http://ES的ip:端口/_snapshot/backup/bk_20190926/_restore

(2)在kibana的Dev Tools开发工具中调用接口。

POST _snapshot/backup/bk_20190926/_restore

返回结果以下,则说明恢复数据成功。

{    "accepted": true}

至此,ES的数据备份和恢复就介绍完啦!

5、总结

这里只是讲解了手动的操做ES的数据备份和恢复,在程序里面咱们同样能够经过调用ES的接口来进行数据备份和恢复,例如经过java程序来定时天天进行ES地数据备份,而后删除昨天或前天的备份数据,只保留一份或两份备份数据,以此来节约磁盘空间。