前言

elasticsearch官方并没有提供合适的备份工具,然而生产场景中备份却是的确需要的。

本文介绍了使用自己写的php脚本以及第三方工具来进行索引的备份,恢复以及删除等操作。

全量备份

elasticdump --input  http://127.0.0.1:9200/logstash-postback --output  logstash-postback_2017.01.17.json --limit 1000
elasticdump安装方法在下面

恢复

命令例子
elasticdump --input logstash-postback_2017.01.14.json --output http://127.0.0.1:9200/logstash-postback --limit 1000
详解
elasticdump命令需要单独安装。
--input 是指定输入,可指定文件,或需要备份的es集群。
--output是指定输出,可指定文件,或需要备份的es集群。
logstash-postback_2017.01.14.json  是指定的已备份的文件。
 http://127.0.0.1:9200/logstash-postback  是指定的要恢复数据的elastictic集群,IP加端口加索引名。注意,索引名是不带时间的。
--limit 1000 一次导入一千条数据,加快进度。
elasticdump命令安装
yum install npm
npm install elasticdump -g
命令安装完毕,可以测试。
可能会报出nodejs的版本之类的错误,你需要升级一下版本。
npm install -g n
n stable
至此可以使用。

删除索引

 php delete.php --index http://127.0.0.1:9200/<index> --start 2017-01-01 --end 2017-01-02  
--start 选择删除这个索引中指定日期的内容
--end 不传则默认删除一天,也就是start的那天
<index> 要删除的索引名
cat delete.php
<?php
date_default_timezone_set('Asia/Shanghai');$longopts  = array('index:','query:','start:','end:',
);
$options = getopt('a', $longopts);if(!isset($options['index'])) {fwrite(STDERR, "index必须设置索引地址\n");exit(1);
}$components = parse_url($options['index']);
if(!isset($components['path'])) {fwrite(STDERR, 'index不可为空');exit(1);
}$host  = "{$components['scheme']}://{$components['host']}:{$components['port']}";
$index = basename($components['path']);$query = isset($options['query']) ? $options['query'] : '{"query":{"match_all":{}}}';
if(isset($options['start'])) {$start_time = strtotime($options['start']);$start = date('Y-m-d', $start_time).'T00:00:00+0800';if(isset($options['end'])) {$end_time = strtotime($options['end']);$end = date('Y-m-d', $end_time).'T00:00:00+0800';} else {$end = date('Y-m-d', $start_time+86400).'T00:00:00+0800';}$field = strpos($index, 'analysis')!==false ? 'create_time' : 'date';$query = '{"size":1000,"_source":false,"query":{"filtered":{"filter":{"range":{"'.$field.'":{"gte":"'.$start.'","lt":"'.$end.'"}}}}}}';
}$scroll_id = null;
$retry     = 0;
$num       = 0;
while(true) {if(is_null($scroll_id)) {$result = post("{$host}/{$index}/_search?scroll=2m", $query);} else {$result = get("{$host}/_search/scroll?scroll=2m&scroll_id={$scroll_id}");}$json = json_decode($result, true);if(!isset($json['_scroll_id'])) {fwrite(STDERR, "查询失败:索引-{$index} 起始-{$start}  截止-{$end}\n");sleep(5);$retry++;if($retry>10) {exit(4);}}$scroll_id = $json['_scroll_id'];$bulk = [];foreach($json['hits']['hits'] as $row) {unset($row['_score']);$bulk[] = json_encode(['delete'=>$row]);$num++;}if(count($json['hits']['hits'])==0){break;}$check = post("{$host}/_bulk", implode("\n", $bulk)."\n");fwrite(STDOUT, "{$num}\n");usleep(100000);
}echo "deleted:{$num}\n";function get($url)
{$handle = curl_init();//curl_setopt($handle, CURLOPT_POST, 1);curl_setopt($handle, CURLOPT_HEADER, 0);curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);curl_setopt($handle, CURLOPT_URL, $url);//curl_setopt($handle, CURLOPT_POSTFIELDS, $data);return curl_exec($handle);
}function post($url, $data)
{$handle = curl_init();curl_setopt($handle, CURLOPT_POST, 1);curl_setopt($handle, CURLOPT_HEADER, 0);curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);curl_setopt($handle, CURLOPT_URL, $url);curl_setopt($handle, CURLOPT_POSTFIELDS, $data);return curl_exec($handle);
}

索引增量备份

elasticdump增量备份有BUG,无规律的丢数据。
https://github.com/taskrabbit/elasticsearch-dump/issues/243
于是我们自己写了脚本来进行增量备份。
备份脚本分为两个部分,PHP脚本沟通elasticsearch来进行数据读取与备份。SHELL脚本来写作传参与PHP脚本
SHELL脚本如下
#!/bin/bash#如果有参数,则第一个参数为备份日期,否则默认备份昨天数据
if [ -z "$1" ];thenstart=$(date +%Y-%m-%d --date '-1 day 00:00:00')end=$(date +%Y-%m-%d --date 'today 00:00:00')
elsestart=$(date +%Y-%m-%d --date $1)end=$(date +%Y-%m-%d --date "$1 +1 day 00:00:00")
fi#如果是每月1号则加一天,解决时区导致的数据跨索引问题
if [ $(date +%d --date $end) -eq "01" ]
thenend=$(date +%Y-%m-%d --date "$end +1 day 00:00:00")
fiphp esdump.php --input=http://127.0.0.1:9200/logstash-event-$(date +%Y.%m --date $start) --start $start --end $end  2>> backup_error_$start.log | gzip > event/logstash-event-$(date +%Y.%m_%d --date $start).json.gz  2>> backup_error_$start.log &

注:代码第18行的logstash-event替换为你要备份的索引名
PHP脚本如下(无需修改)
<?php
date_default_timezone_set('Asia/Shanghai');$longopts  = array('input:','output:','query:','start:','end:',
);
$options = getopt('a', $longopts);if(!isset($options['input'])) {fwrite(STDERR, "input必须设置索引地址\n");exit(1);
}$check = get($options['input'].'/_count');
if($check===false) {fwrite(STDERR, "input索引地址无效:{$options['input']}\n");exit(2);
}$check = json_decode($check, true);
if(!isset($check['count'])) {fwrite(STDERR, "input索引地址无效:{$options['input']}\n");exit(3);
}$components = parse_url($options['input']);
$host  = "{$components['scheme']}://{$components['host']}:{$components['port']}";
$index = basename($components['path']);$query = isset($options['query']) ? $options['query'] : '{"query":{"match_all":{}}}';
if(isset($options['start'])) {$start_time = strtotime($options['start']);$start = date('Y-m-d', $start_time).'T00:00:00+0800';if(isset($options['end'])) {$end_time = strtotime($options['end']);$end = date('Y-m-d', $end_time).'T00:00:00+0800';} else {$end = date('Y-m-d', $start_time+86400).'T00:00:00+0800';}$field = strpos($index, 'analysis')!==false ? 'create_time' : 'date';$query = '{"size":1000,"sort":{"'.$field.'":{"order":"asc"}},"query":{"filtered":{"filter":{"range":{"'.$field.'":{"gte":"'.$start.'","lt":"'.$end.'"}}}}}}';if(strpos($index, 'eventlogs')!==false) {$query = '{"size":1000,"sort":{"'.$field.'":{"order":"asc"}},"query":{"filtered":{"filter":{"bool":{'.'"must":[{"range":{"date":{"gte":"'.$start.'","lte":"'.$end.'"}}}],'.'"must_not":[{"exists": {"field":"nsp3hq"}},{"exists": {"field":"q0i8u1"}},{"exists": {"field":"eyn916"}},{"exists": {"field":"20mqd8"}},'.'{"exists": {"field":"wwbkux"}},{"exists": {"field":"r5ua96"}},{"exists": {"field":"easiz"}},{"exists": {"field":"dexusu"}},{"exists": {"field":"earts"}},'.'{"exists": {"field":"ealu"}},{"exists": {"field":"ealf"}},{"exists": {"field":"eal"}},{"exists": {"field":"ears"}},{"exists": {"field":"ealuf"}},'.'{"exists": {"field":"ealus"}},{"exists": {"field":"eaatf"}},{"exists": {"field":"enail"}},{"exists": {"field":"enuail"}},{"exists": {"field":"test"}}]'.'}}}}}';}
}$scroll_id = null;
$retry     = 0;
$num       = 0;
while(true) {if(is_null($scroll_id)) {$result = post("{$host}/{$index}/_search?scroll=2m", $query);} else {$result = get("{$host}/_search/scroll?scroll=2m&scroll_id={$scroll_id}");}$json = json_decode($result, true);if(!isset($json['_scroll_id'])) {fwrite(STDERR, "查询失败:索引-{$index} 起始-{$start}  截止-{$end}\n");sleep(5);$retry++;if($retry>10) {exit(4);}}$scroll_id = $json['_scroll_id'];foreach($json['hits']['hits'] as $row) {fwrite(STDOUT, json_encode($row)."\n");$num++;}if(count($json['hits']['hits'])==0){break;}usleep(100000);
}//校验条数是否一致
$query = json_decode($query, true);
unset($query['size'], $query['sort']);
$result = post("{$host}/{$index}/_count", json_encode($query));
$json = json_decode($result, true);
if(!isset($json['count']) or intval($json['count'])!==$num) {fwrite(STDERR, "校验失败:索引-{$index} 起始-{$start} 截止-{$end} 记录条数-{$json['count']} 导出条数-{$num}\n");
}function get($url)
{$handle = curl_init();//curl_setopt($handle, CURLOPT_POST, 1);curl_setopt($handle, CURLOPT_HEADER, 0);curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);curl_setopt($handle, CURLOPT_URL, $url);//curl_setopt($handle, CURLOPT_POSTFIELDS, $data);return curl_exec($handle);
}function post($url, $data)
{$handle = curl_init();curl_setopt($handle, CURLOPT_POST, 1);curl_setopt($handle, CURLOPT_HEADER, 0);curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);curl_setopt($handle, CURLOPT_URL, $url);curl_setopt($handle, CURLOPT_POSTFIELDS, $data);return curl_exec($handle);
}

备份时执行shell脚本即可备份昨天的增量数据

谢土豪

如果有帮到你的话,请赞赏我吧!

本文为kerwin原创,转载请注明出处。

http://www.cnblogs.com/kerwinC/p/6296675.html

转载于:https://www.cnblogs.com/kerwinC/p/6296675.html

ELASTIC的备份与恢复相关推荐

  1. 白话Elasticsearch72_利用HDFS备份与恢复ES生产集群的数据

    文章目录 概述 官方指导 hadoop hdfs分布式文件存储系统介绍 hdfs环境搭建 基于snapshot+hdfs进行数据备份 0.es集群数据备份的必要性 1.ES数据备份储存如何选择? 2. ...

  2. 2021年大数据ELK(一):集中式日志协议栈Elastic Stack简介

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 一.简介 二.ELK 协议栈介绍及体系结构 三.集中式日志协议栈 ...

  3. 【Elastic Stack(一)】Elastic Stack简介

    如果你没有听说过Elastic Stack,那你一定听说过ELK.实际上ELK是三款软件的简称,分别是Elasticsearch.Logstash.Kibana组成,在发展的过程中,又有新成员Beat ...

  4. exchange2003备份与恢复

    exchange2003备份与恢复 owa 访问的是在线访问方式.连接到服务器里的访问邮箱,操作邮件是在服务器上. 先发一邮件 永久删除,直接从服务器里把此邮件删除掉. 删除之后.服务器里已没有此邮件 ...

  5. Xtrabackup实现数据的备份与恢复

    Xtrabackup介绍 Xtrabackup是由percona开源的免费数据库热备份软件,它能对InnoDB数据库和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份同样需要加表锁): ...

  6. Elastic Job从单点到高可用、同城主备、同城双活

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源:https://jaskey.github.io/blog/2020/05/25/elastic-job-timmer-a ...

  7. Elastic Search 介绍和基本概念

    Elastic Search 特点 Elastic Search 可能是是当下最火的搜索引擎中间件了.为什么这么火呢?主要是因为他有几大绝艺: 快速.无论什么时候,你需要向 ES 查询你的数据,都能够 ...

  8. R语言glmnet交叉验证选择(alpha、lambda)拟合最优elastic回归模型:弹性网络(elasticNet)模型选择最优的alpha值、模型最优的lambda值,最终模型的拟合与评估

    R语言glmnet交叉验证选择(alpha参数和lambda参数)拟合最优elastic回归模型:弹性网络(elasticNet)模型选择最优的alpha值.弹性网络(elasticNet)模型最优的 ...

  9. elastic stack中的Beats是什么?

    elastic stack中的Beats是什么? elastic stack栈涉及到以下⼏个组件 beats:⽤于轻量级⽇志采集,⽀持⽂件采集,系统数据采集,特定中间件数据采集等 logstash:⽤ ...

最新文章

  1. Express应用配置端口
  2. 《大规模Scrum:More with LeSS》访谈
  3. 天涯htmlcss基础框架
  4. tab-pane 怎么家点击事件_有好转?辛巴燕窝事件新进展曝光。二子爷老婆首次回应银行行长送奥迪!二子爷分析小样你家老铁太精...
  5. SQL Server 2008不能修改表的解决方法
  6. Nginx的upstream_response_time
  7. WWW 2021 | 融合先验知识的BERT注意力模型
  8. SAP UI5 数据绑定之高级技巧 - Type System
  9. Linux下的绘图(流程图、UML、mindmap)工具
  10. 根据中文修改英文翻译,重新生成英文翻译文件(保证原有文件的顺序不变)
  11. Qt5 for linux离线安装工具下载地址
  12. 电脑合上盖子不锁屏_笔记本电脑合上盖子或台式机离开后黑屏是“休眠”还是“睡眠”...
  13. 数据库系统概论-数据库安全性
  14. 微信公众号是html页面吗,微信公众号网页开发
  15. 网络渗透就业学习路线
  16. 微软手机远程桌面使用
  17. 台式计算机能不能安装蓝牙驱动,win7电脑蓝牙驱动怎么安装,详细教您怎么安装...
  18. 精准测分:基于函数调用关系链的用例消振算法(上帝视角)
  19. TPLINK路由器配置桥接过程
  20. 中科院计算机专业,中科院计算所博士平均年薪都超过50万了,计算机专业真是可以无脑选的那种...

热门文章

  1. php用重写算出圆柱体的体积,圆柱的体积
  2. graphpad 折线图横坐标比例_GraphPad Prism绘制剂量反应曲线
  3. 剑指Offer #02 替换空格(字符串处理)
  4. mysql 时间取日期函数_mysql 获取当前日期函数及时间格式化参数详解
  5. 如何在ubuntu下安装detectron2_Anaconda中安装Cascade RCNN(Detectron)的若干问题
  6. 我慌了,纠删码是什么?我被面试官问蒙了
  7. Serverless 工程实践 | Serverless 应用优化与调试秘诀
  8. 函数计算是如何工作的?
  9. 从零开始入门 K8s | 可观测性:监控与日志
  10. Golang 在阿里集团调度集群管理系统 Sigma 中的实践