十三、ES备份恢复

摘要:
参考材料:官方数据2.官方备份和恢复1.环境准备。我使用了三台服务器、两台es和一个nfs主机名服务IPes01es10.154.0.110es02es10.154.0111nsnfs10.154.0.1122。安装nfs。在10.154.0.112上安装nfs。将不详细描述该过程。

一、备份恢复方案

ES支持两种备份恢复方案,第一种是官方的工具snapshot,第二种是第三方工具elasticsearch-dump。

snapshot工具

  • 官方提供的工具,也叫快照备份;
  • 备份原理是需要一台存储服务器,这里使用nfs存储服务器,并将其挂载到各个节点上,snapshot工具会将每台ES数据分开备份在nfs服务器上。
  • 备份数据无法直接查看,需要恢复后才能查看;

elasticsearch-dump工具

  • 第三方工具;
  • 备份可以存储在本地,也可以存储在第三方存储服务器上;
  • 备份数据可以直接查看,是json格式的。

参考资料:官方资料

二、官方备份恢复

1、环境准备

我这里使用三台服务器,两台es,一台nfs

主机名服务IP
es01es10.154.0.110
es02es10.154.0.111
nfsnfs10.154.0.112

2、安装nfs

在10.154.0.112这台服务器上安装nfs,过程就不详细说了。

yum install -y nfs-utils -y
systemctl enable rpcbind
systemctl enable nfs
systemctl start rpcbind
systemctl start nfs

检查所有服务器,需要保证所有服务器的elasticsearch用户的uid号一致,gid号也一致。

id elasticsearch

#如果不一致,使用如下方法改为一致
systemctl stop elasticsearch
userdel elasticsearch
groupadd -g 1001 elasticsearch
useradd -u 1000 -g elasticsearch -s /sbin/nologin -M elasticsearch

我这里的gid是1001,uid是1000,也就是说这三台服务器的elasticsearch用户的uid必须为1000,gid必须为1001;
可以查看/etc/passwd文件找到未使用的uid跟gid号。

编辑nfs配置文件

#这里的anonuid就是elasticsearch用户的uid,anongid就是它的gid
vim /etc/exports
/data/es 10.154.0.0/24(rw,sync,all_squash,anonuid=1000,anongid=1001)

创建挂载目录

mkdir -p /data/es
chown -R elasticsearch.elasticsearch /data/es/

查看挂载情况

$ systemctl reload nfs

#查看共享目录情况
$ showmount -e 10.154.0.112
Export list for 10.154.0.112:
/data/es 10.154.0.0/24

挂载nfs共享目录
在es01跟es02服务器上执行挂载nfs目录命令

mkdir -p /data/backup
yum -y install nfs-utils
mount -t nfs 10.154.0.112:/data/es /data/backup
df -h

#永久挂载
vim /etc/fstab
10.154.0.112:/data/es /data/backup nfs defaults,_netdev 0 0

其他资料:取消挂载

3、snapshot备份

1)全部备份

编辑es01,es02的配置文件

#在最后添加一行如下命令,注意冒号后面有一个空格
vim /etc/elasticsearch/elasticsearch.yml 
path.repo: ["/data/backup"]

重启es服务器,因为做了集群,先重启从es服务器,再重启主es服务器

systemctl restart elasticsearch

创建存储快照空间

PUT /_snapshot/my_fs_backup #指定存储库名
{
  "type": "fs",
  "settings": {
    "location": "/data/backup/my_fs_backup", #存储路径
    "compress":true  #是否压缩
  }
}

GET /_snapshot/my_fs_backup #查看快照信息

此时会发现es01跟es02的/data/backup/目录下多出一个my_fs_backup文件夹,该文件夹此时是空的,因为我们还没有执行备份。

给所有索引创建快照

PUT /_snapshot/my_fs_backup/snapshot_1?wait_for_completion=true

效果如下
十三、ES备份恢复第1张

此时我们再来看看/data/backup/my_fs_backup文件夹里都有什么
十三、ES备份恢复第2张

index-0文件可以使用jq查看,除此之外大部分文件是无法直接查看的。
十三、ES备份恢复第3张

jq工具可以让json格式的数据看起来更加的美观便于我们查看,关于安装jq,需要配置epel源
然后执行yum -y install jq安装即可

2)备份指定索引

前面说了备份全部索引,这里讲一下备份指定索引

PUT /_snapshot/my_fs_backup/snapshot_2?wait_for_completion=true
{
  "indices": "linux,linux76",
  "ignore_unavailable": true,
  "include_global_state": false
}
  • 这里使用的是之前创建的存储快照空间my_fs_backup
  • 创建的是名为snapshot_2的快照
  • 只备份了linux,linux76这两个索引

3) 创建以时间命名的快照

PUT /_snapshot/my_fs_backup/%3Csnapshot-%7Bnow%2Fd%7D%3E

效果如下
十三、ES备份恢复第4张

4、snapshot还原

1) 全部还原

使用全部还原,需要将原来的索引全部删除才能还原,如果有索引冲突,就会报错

#恢复全部索引
POST /_snapshot/my_fs_backup/snapshot_1/_restore

报错如下所示
十三、ES备份恢复第5张

另外如果全备时备份了kibana的索引,恢复时需要关闭kibana服务,因为kibana服务会一直创建.kibana索引并向其写入数据,导致索引冲突。

systemctl stop kibana

#删除所有索引
curl -X DELETE 'http://10.154.0.110:9200/_all'

#全部还原
curl -XPOST 'http://10.154.0.110:9200/_snapshot/my_fs_backup/snapshot_1/_restore'
systemctl start kibana

那么有没有一种方式可以保留原来的索引呢?当然有的,接下来就讲

使用如下命令如果发现有同名索引就会将还原的索引重命名以backup_开头的索引,然后再进行还原。

POST /_snapshot/my_fs_backup/snapshot_1/_restore?wait_for_completion=true
{
  "indices": "*", #还原所有索引
  "ignore_unavailable": true, #是否忽略显示错误,默认false不忽略,true为忽略
  "include_global_state": false,  #是否恢复集群状态,false为不恢复
  "rename_pattern": "(.+)", #触发正则,即发现正在使用的索引跟要还原的索引同名
  "rename_replacement": "backup_$1", #将要还原的同名索引名前加上backup_前缀
  "include_aliases":false
}

2)还原指定索引
还原指定索引并修改副本分片设置

POST /_snapshot/my_fs_backup/snapshot_1/_restore
{
  "indices": "linux,linux76", #只还原linux,linux76索引
  "index_settings":{
    "index.number_of_replicas":1 #将副本分片改为1个
  }
  "ignore_index_settings":[
    "index.refresh_interval"
    ]
}

5、命令总结

snapshot备份还原总结
1、备份类

#创建存储快照空间
PUT /_snapshot/my_fs_backup #指定存储库名
{
  "type": "fs",
  "settings": {
    "location": "/data/backup/my_fs_backup", #存储路径
    "compress":true  #是否压缩
  }
}

#备份全部索引
PUT /_snapshot/my_fs_backup/snapshot_1?wait_for_completion=true

#备份指定索引
PUT /_snapshot/my_fs_backup/snapshot_2?wait_for_completion=true
{
  "indices": "linux,linux76",
  "ignore_unavailable": true,
  "include_global_state": false
}

2、还原类

#恢复全部索引,如果索引冲突会报错
POST /_snapshot/my_fs_backup/snapshot_1/_restore

#恢复全部索引,索引冲突会改名
POST /_snapshot/my_fs_backup/snapshot_1/_restore?wait_for_completion=true
{
  "indices": "*", #还原所有索引
  "ignore_unavailable": true, #是否忽略显示错误,默认false不忽略,true为忽略
  "include_global_state": false,  #是否恢复集群状态,false为不恢复
  "rename_pattern": "(.+)", #触发正则,即发现正在使用的索引跟要还原的索引同名
  "rename_replacement": "backup_$1", #将要还原的同名索引名前加上backup_前缀
  "include_aliases":false
}

#还原指定索引
POST /_snapshot/my_fs_backup/snapshot_1/_restore
{
  "indices": "linux,linux76", #只还原linux,linux76索引
  "index_settings":{
    "index.number_of_replicas":1 #将副本分片改为1个
  }
  "ignore_index_settings":[
    "index.refresh_interval"
    ]
}

3、查询类

#查询快照信息
GET /_snapshot/my_fs_backup/snapshot_1

#查看正在运行的快照
GET /_snapshot/my_fs_backup/_current

#删除快照
DELETE /_snapshot/my_fs_backup/snapshot_1

#删除存储库
DELETE /_snapshot/my_fs_backup

三、第三方工具备份恢复

使用elasticsearch-dump工具需要node环境

1、安装node环境

cd /opt/
wget https://nodejs.org/dist/v12.13.0/node-v12.13.0-linux-x64.tar.xz
tar xf node-v12.13.0-linux-x64.tar.xz
mv node-v12.13.0-linux-x64 node
echo 'export PATH=$PATH:/opt/node/bin'>>/etc/profile
source /etc/profile
npm -v
node -v

2、安装es-dump工具

npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm install elasticdump -g
elasticdump --version

3、使用es-dump备份还原

1) 备份指定索引

$ elasticdump \
--input=http://10.154.0.110:9200/linux \
--output=/data/es_backup/linux.json \
--type=data

2)备份成压缩格式

$ elasticdump \
--input=http://10.154.0.110:9200/linux \
--output=$|gzip > /data/es_backup/linux.json.gz

3)备份分词器跟数据

$ elasticdump \
--input=http://10.154.0.110:9200/linux \
--output=/data/es_backup/linux_mapping.json \
--type=mapping

$ elasticdump \
--input=http://10.154.0.110:9200/linux \
--output=/data/es_backup/linux.json \
--type=data

4)还原指定索引

#调换一下备份时input跟ouput的位置即可
$ elasticdump \
--input=/data/es_backup/linux.json \
--output=http://10.154.0.110:9200/linux \
--type=data

4、批量备份脚本

这里通过awk去除了前面带点的系统索引,如.kibana等索引,相当于只备份用户索引


#!/bin/bash
es_addr=10.154.0.110
es_port=9200
index_list=`curl -s ${es_addr}:${es_port}/_cat/indices|awk '$3!~/^\./{print $3}'`

for index in $index_list
do 
  elasticdump --input=http://${es_addr}:${es_port}/${index} --output=/data/${index}.json --type=data
done

备份全部索引版本

#!/bin/bash
es_addr=10.154.0.110
es_port=9200
index_list=`curl -s ${es_addr}:${es_port}/_cat/indices|awk '{print $3}'`

for index in $index_list
do 
  elasticdump --input=http://${es_addr}:${es_port}/${index} --output=/data/${index}.json --type=data
done

5、带密码认证的导出

导出

elasticdump \
--input=http://tz:tz110@10.154.0.110:9200/linux \
--output=/data/es_backup/linux.json \
--type=data

导入

elasticdump \
--input=/data/es_backup/linux.json \
--output=http://tz:tz110@10.154.0.110:9200/linux \
--type=data

tz是用户名,tz110是密码;
导出的还是明文json文件,未被加密;
导入可以不写用户名密码一样可以导入;
感觉没啥用!

6、注意事项

1、如果恢复时,数据冲突了,冲突的数据会被覆盖
2、如果原来的索引存在备份文件里没有的数据,会被保留下来

7、来个实验

接下来做个实验,创建linux索引并向其插入数据,结果如下
十三、ES备份恢复第6张

注意此时的linux索引有504个文档,括号里的1008表示linux索引有一个副本,副本分片加主分片的文档数一共1008个文档

执行备份
十三、ES备份恢复第7张

查看备份文件行数,如下图所示,有504行,每行表示一个文档,即一条数据,这跟es-head显示的结果相同
十三、ES备份恢复第8张

可以看到备份文件是明文的数据
十三、ES备份恢复第9张

参考资料
老男孩教育_day106_视频

免责声明:文章转载自《十三、ES备份恢复》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Windows进程通信(IPC)之共享内存移动端图片缩放插件Pinchzoom.js下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

NFS配置使用

NFS配置使用 目录 NFS配置使用 一、概述 二、NFS服务器端安装和配置 2.1.服务端安装 2.2.服务端配置 2.3.防火墙安全配置 2.3.1.方案一、关闭防火墙或对内网所有端口开放 2.3.2.方案二、防火墙不关闭,开放指定端口号 2.4.启动NFS服务 三、NFS客户端安装和配置 3.1.客户端安装 3.2.客户端配置 3...

Linux grep命令 -- 三剑客老三

常用选项   -E :开启扩展(Extend)的正则表达式。   -i :忽略大小写(ignore case)。   -v :反过来(invert),只打印没有匹配的,而匹配的反而不打印。   -n :显示行号   -w :被匹配的文本只能是单词,而不能是单词中的某一部分。   -c :显示总共有多少行被匹配到了,而不是显示被匹配到的内容,注意如果同时使用...

信息检索导论学习笔记 --第一章 布尔检索

信息检索(informagto retrieval) 是从大规模非结构化数据(通常是文本)的集合中找出满足用户信息需求的资料 文档document 所有文档组成“文档集“(collection), 有时也称“语料库”(corpus) 查询(query) 相关的(relevant) 正确率(precision): 返回结果中 真正和信息需求相关的文档所占比例...

Linux环境下非root用户安装Python3

安装python-3.8.1: 系统环境:Centos 7 在python官网上下载相应的Linux版本:https://www.python.org/downloads/source/。这里首先安装Python-3.8.1,下载,解压: wget https://www.python.org/ftp/python/3.8.1/Python-3.8.1.t...

linux下调试C程序

正文:==================GDB是一个强大的命令行调试工具。大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本。UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能。于是UNIX下的软件比Windows下的软件更能...

在Linux下安装ADT

现在网络上的好像都是旧版的,我也写一下。 首先说一下eclipse的版本。我们知道,Java EE是企业版,我前面下载Eclipse时还考虑我使用Java SE能否使用。其实可以! 第一步:点开Install New Software来安装插件 第二步:在type or select a site的地方写下: https://dl-ssl.google...