概述
本文介绍的是Elasticsearch-5.2.0基于hdfs在不用的集群上快速恢复数据。
环境
hadoop集群环境,传送门(https://blog.youkuaiyun.com/bankq/article/details/89379825)
一、ES整合HDFS集群
1、安装repository-hdfs
Elasticsearch-5.2.0安装repository-hdfs,快速在不同集群之间恢复数据
2、下载ES对应的插件版本
3、解压
unzip repository-hdfs-5.2.0.zip
4、移动并修改解压后文件名
mv elasticsearch elasticsearch-5.2.0/plugins/repository-hdfs
5、修改配置文件
vim /es5.2.0/bigdata/elasticsearch-5.2.0/plugins/repository-hdfs/plugin-security.policy
permission java.lang.RuntimePermission "accessDeclaredMembers";
permission java.lang.RuntimePermission "getClassLoader";
permission java.lang.RuntimePermission "shutdownHooks";
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
permission javax.security.auth.AuthPermission "doAs";
permission javax.security.auth.AuthPermission "getSubject";
permission javax.security.auth.AuthPermission "modifyPrivateCredentials";
permission java.util.PropertyPermission "*", "read,write";
permission java.security.AllPermission;
permission javax.security.auth.PrivateCredentialPermission "org.apache.hadoop.security.Credentials * \"*\"", "read";
vim /es5.2.0/bigdata/elasticsearch-5.2.0/config/jvm.options
-Djava.security.policy=file:es5.2.0/bigdata/elasticsearch-5.2.0/plugins/repository-hdfs/plugin-security.policy
6、重新启动es集群
#停止es
kill -SIGTERM `ps -ef | grep Elasticsearch | grep -v grep | awk '{print $2}'`
#启动es
/es5.2.0/bigdata/elasticsearch-5.2.0/bin/elasticsearch -d
7、基于hdfs创建仓库
在kibane插件上面执行
PUT /_snapshot/my_hdfs_repository
{
"type": "hdfs",
"settings": {
"uri": "hdfs://192.168.8.21:8020/",
"path": "elasticsearch/respositories/my_hdfs_repository",
"max_snapshot_bytes_per_sec" : "50mb",
"max_restore_bytes_per_sec" : "50mb"
}
}
#uri 为hadoop集群hdfs的地址。
#conf.dfs.client.read.shortcircuit hdfs短路读取,客户端读hdfs时,datanode会根据blockID从本地磁盘读数据并通过TCP流发送给client端,但是,如果Client与Block位于同一节点,那么client端直接读取本地Block文件即可获取数据,无需通过Datanode的TCP连接发送,这就是短路读取(short-circuit)。
#max_snapshot_bytes_per_sec,这个参数用于指定数据从es灌入仓库的时候,进行限流,默认是20mb/s。
#max_restore_bytes_per_sec,这个参数用于指定数据从仓库中恢复到es的时候,进行限流,默认也是20mb/s。
8、验证
在kibane插件上面执行
#验证
POST /_snapshot/my_hdfs_repository/_verify
验证结果
{
"nodes": {
"avi9bA0AQeG7vHNtJCqPAA": {
"name": "node-5"
},
"JD16f2hASOCp3lXb5BlFRA": {
"name": "node-4"
},
"BtaGkSuWQGG57ApoASPm7w": {
"name": "node-3"
}
}
}
9、备份
对所有open的索引进行snapshotting备份
PUT /_snapshot/my_hdfs_repository/snapshot_1?wait_for_completion=true
wait_for_completion:该参数表示上面执行备份的命令需要等待执行完毕之后返回结果。对运维中的自动化shell脚本,很重要,你的shell脚本里,要比如等待它备份完成了以后,才会去执行下一条命令。
查看备份进程
#查看snapshot备份列表
GET /_snapshot/my_hdfs_repository/snapshot_1
第一次会备份全量的数据,但是接下来的snapshot就是备份两次snapshot之间的增量数据了。数据是增量进入es集群或者从es中删除的,那么每次做snapshot备份的时候,也会自动在snapshot备份中增量增加数据或者删除部分数据。因此这就意味着每次增量备份的速度都是非常快的。
对指定的索引进行snapshotting备份
#对指定的索引进行snapshotting备份
PUT _snapshot/my_hdfs_repository/snapshot_20190418
{
"indices": "poc13,poc8",
"ignore_unavailable": true,
"include_global_state": false,
"partial": true
}
indices:需要备份的索引库,多个库使用“,”分割。
ignore_unavailable:ignore_unavailable如果设置为true的话,那么那些不存在的index就会被忽略掉,不会进行备份过程中。
include_global_state:设置include_global_state为false,可以阻止cluster的全局state也作为snapshot的一部分被备份。
partial:默认情况下,如果某个索引的部分primary shard不可用,那么会导致备份过程失败,那么此时可以将partial设置为true。
snapshot备份列表
#查看所有的备份列表
GET /_snapshot/my_hdfs_repository/_all
删除snapshot备份
#删除snapshot备份
DELETE /_snapshot/my_hdfs_repository/snapshot_1?pretty
10、基于snapshot的数据恢复
全量恢复
POST /_snapshot/my_hdfs_repository/snapshot_1/_restore
恢复指定的索引
POST /_snapshot/my_hdfs_repository/snapshot_3/_restore
{
"indices": "poc8",
"ignore_unavailable": true,
"include_global_state": true
}
#恢复指定的索引,对索引重新命名
POST /_snapshot/my_hdfs_repository/snapshot_14/_restore
{
"indices": "poc14",
"ignore_unavailable": true,
"include_global_state": true,
"rename_pattern": "poc14",
"rename_replacement": "poc15"
}
#监控restore的进度
GET poc8/_recovery
二、定时备份
1、shell脚本编写
备份是通过crond每天凌晨定时执行备份命令,备份最近7天的数据。
脚本逻辑:
1、创建一个保存脚本执行结果的文件,
2、备份前一天的数据
3、备份成功以后删除7天之前的备份
esdatabak.sh
#!/bin/bash
esip=192.168.8.23
esindex=poc14,poc8
esbakfile=/bigdata/bak/es/baklogs
if [ ! -d $esbakfile ]; then
mkdir -p $esbakfile
fi
echo -e "\r\n" >> $esbakfile/bak_es_log.logs
echo -e "\r\n" >> $esbakfile/bak_es_log.logs
echo "=================start====$(date '+%Y-%m-%d %H:%M:%S')=================" >> $esbakfile/bak_es_log.logs
echo " create new snapshot_$(date -d -1day +%Y%m%d) " >> $esbakfile/bak_es_log.logs
#备份新的数据,指定新的索引库
curl -XPUT "http://$esip:9200/_snapshot/my_hdfs_repository/snapshot_$(date -d -1day +%Y%m%d)?wait_for_completion=true&pretty" -d '{
"indices": "'${esindex}'",
"ignore_unavailable": true,
"include_global_state": false,
"partial": true
}' >> $esbakfile/bak_es_log.logs
echo -e "\r\n" >> $esbakfile/bak_es_log.logs
echo -e "\r\n" >> $esbakfile/bak_es_log.logs
echo "delete snapshot_$(date -d -7day +%Y%m%d) " >> $esbakfile/bak_es_log.logs
#删除7天以前的数据
curl -XDELETE "http://$esip:9200/_snapshot/my_hdfs_repository/snapshot_$(date -d -7day +%Y%m%d)?pretty" >> $esbakfile/bak_es_log.logs
echo -e "\r\n" >> $esbakfile/bak_es_log.logs
echo "======================end====$(date '+%Y-%m-%d %H:%M:%S')=======================" >> $esbakfile/bak_es_log.logs
2、crontab的使用
crontab -e
#时间格式:分 时 天 月 星期
10 * */0 * * sh /bigdata/lgt/test/esdatabak.sh >> /bigdata/lgt/test/see.log 2>&1
启动crond,使用root用户
service crond start
查看日志