使用snapshot进行es数据备份

大城市里の小女人 提交于 2020-01-15 04:34:18

一.安装nfs

  • 集群使用sanpshot快照需要共享文件系统,所以要先配置个nfs

1.本人使用的是centos7系统,安装命令如下

#安装nfs服务
yum -y install nfs-utils
#创建nfs共享文件夹
mkdir -p /nfs/backes
#更改文件夹权限为1777,任何人都有权限读写
chmod -R 1777 /nfs/backes
#配置需要共享的目录到 /etc/exports下,xxx.xxx.xxx.xxx为需要共享的对象ip地址
vim /etc/exports

      /nfs/backes 192.168.10.*(rw,sync,no_root_squash)

#使exports的修改生效
exportfs -r          

#关闭selinux防火墙
setenforce 0
#启动服务
service rpcbind start
service nfs start
#设置开机启动
systemctl enable rpcbind
systemctl enable nfs-server 

2.另外2台es服务器的配置

#安装nfs服务
yum -y install nfs-utils
#创建nfs共享文件夹
mkdir -p /nfs/backes
#更改文件夹权限为1777,任何人都有权限读写
chmod -R 1777 /nfs/backes
#查看所指定IP机器,当前已发布的NFS共享目录
[root@esnode /]# showmount -e 192.168.10.248
Export list for 192.168.10.248:
/nfs/backes 192.168.10.*

#将nfs共享文件夹挂载到另外两台es服务器上
mount 192.168.10.248:/nfs/backes /nfs/backes

3.测试是否共享成功

在/nfs/backes文件夹内添加文件,查看其他节点能否查看到
能查询到证明共享成功

二.es操作命令

  • 在 Elasticsearch 中通过 repository 定义备份存储类型和位置,存储类型有共享文件系统、AWS 的 S3存储、HDFS、微软 Azure的存储、Google Cloud 的存储等。
  • 首先,你要在 elasticsearch.yml 的配置文件中注明可以用作备份路径 path.repo ,如下所示:
path.repo: ["/nfs/backes"]

之后重启es

  • 配置好后,就可以使用 snapshot api 来创建一个 repository 了
  • 我是用的es版本是5.6.9的,如果使用的是6.x.x版本的,需要添加-H 'Content-Type: application/json'参数

1.创建快照仓库

  • 其中type选的是仓库类型,location选择的是仓库的存储位置,在url网址后面加"?pretty",会让返回结果以工整的方式展示出来,适用所有操作数据类的url。"?"表示引出条件,"pretty"是条件内容。(不加也可以)
curl -XPUT 'http://ip:9200/_snapshot/my_backup?pretty'  -d'{
  "type": "fs",
  "settings": {
    "location": "/nfs/backes"
  }
}'
  • 上面是5.6.9版本的,如果是6版本以上的,请用下面的命令,添加-H "Content-Type: application/json"参数。
curl -H "Content-Type: application/json" -XPUT 'http://ip:9200/_snapshot/my_back?pretty' -d '{
  "type": "fs",
  "settings": {
    "location": "/nfs/backes"
  }
}'

2.更新仓库配置

  • compress 是否压缩
  • max_snapshot_bytes_per_sec 制作快照的速度,默认20mb/s
  • max_restore_bytes_per_sec 快照恢复的速度,默认20mb/s
curl -XPOST http://ip:9200/_snapshot/my_back -d '{
    "type": "fs",
    "settings": {
        "location": "/nfs/backes",
        "max_snapshot_bytes_per_sec" : "50mb",
        "max_restore_bytes_per_sec" : "50mb",
        "compress" : true
    }
}'
  • 这里需要注意一点是,注册仓库用的是PUT, 而更新仓库设置用的是POST

3.检查仓库信息

curl -XGET $IP:9200/_snapshot/my_back?pretty

输出如下:

{
  "my_back" : {
    "type" : "fs",
    "settings" : {
      "location" : "/nfs/backes/",
      "max_restore_bytes_per_sec" : "50mb",
      "compress" : "true",
      "max_snapshot_bytes_per_sec" : "50mb"
    }
  }
}

4.备份es

curl -XPUT http://ip:9200/_snapshot/my_back/es-node?pretty&wait_for_completion=true

5.查看某仓库下所有快照

curl -XGET "http://ip:9200/_snapshot/my_back/es-node/_all?pretty"

输出如下所示:

{
  "snapshots" : [
    {
      "snapshot" : "es-2019123015",
      "uuid" : "L4B44po9RoKWCH6ieiYGTw",
      "version_id" : 5060999,
      "version" : "5.6.9",
      "indices" : [
        "hr",
        "hr_assistant",
      ],
      "state" : "SUCCESS",
      "start_time" : "2019-12-30T07:34:17.100Z",
      "start_time_in_millis" : 1577691257100,
      "end_time" : "2019-12-30T07:34:27.868Z",
      "end_time_in_millis" : 1577691267868,
      "duration_in_millis" : 10768,
      "failures" : [ ],
      "shards" : {
        "total" : 130,
        "failed" : 0,
        "successful" : 130
      }
    }
  ]
}

6.从仓库中删除一个快照

curl -X DELETE "http://ip:9200/_snapshot/my_back/es-node"

三.es备份脚本

#!/bin/bash

IP=http://192.168.10.248
filename=es-`date +%Y%m%d%H`
es_backup_dir=/nfs/backes
es_backup_gz=/nfs/backes/es_back
logs=/nfs/backes/log
#index=

#创建仓库
curl -XPUT $IP:9200/_snapshot/my_back -d '{"type": "fs","settings": {"location": "/nfs/backes/"}}'
if [ $? -eq 0 ]; then
 echo -e '\n仓库创建成功\n'
else
 echo -e '\n仓库创建失败\n'
exit 1
fi

#更新仓库配置,制作和恢复快照的速度,压缩
curl -XPOST $IP:9200/_snapshot/my_back -d '{"type":"fs","settings":{"location":"/nfs/backes/","max_snapshot_bytes_per_sec":"50mb","max_restore_bytes_per_sec":"50mb","compress":true}}'

#检查仓库信息
echo -e '\n仓库配置信息:\n'
curl -XGET $IP:9200/_snapshot/my_back?pretty

#间隔5秒
sleep 3

#判断目录是否存在,不存在则创建
if [ ! -d "$es_backup_dir" ]; then
  mkdir -p "$es_backup_dir"
else
 cd "$es_backup_dir"
fi

#修改为任何人可写权限
chmod -R 1777 $es_backup_dir
cd $es_backup_dir

#判断文件是否存在
if [ ! -f "$logs" ]; then
  touch "$logs"
else
 rm -rf "$logs"
 touch "$logs"
fi

chmod -R 777 $logs

#备份指定索引
#curl -XPUT $IP:9200/_snapshot/my/$filename '{"indices":"$index"}'

echo -e '\n正在备份中,请稍后...\n'

#开始备份
aaa=`curl -XPUT $IP:9200/_snapshot/my_back/$filename?pretty&wait_for_completion=true`
echo "$aaa" >> $logs
sleep 5

#过滤log文件里是否有error字段,如果有输出备份失败,没有输出成功
if [ `grep -c "error" $logs` -eq "0" ]; then
  echo -e '\nes data backup success!\n'
else
  echo -e '\nes data backup failure!\n'
fi
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!