ELASTIC的备份与恢复
前言
elasticsearch官方并没有提供合适的备份工具,然而生产场景中备份却是的确需要的。
本文介绍了使用自己写的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); }
索引增量备份
#!/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 &
<?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的备份与恢复相关推荐
- 白话Elasticsearch72_利用HDFS备份与恢复ES生产集群的数据
文章目录 概述 官方指导 hadoop hdfs分布式文件存储系统介绍 hdfs环境搭建 基于snapshot+hdfs进行数据备份 0.es集群数据备份的必要性 1.ES数据备份储存如何选择? 2. ...
- 2021年大数据ELK(一):集中式日志协议栈Elastic Stack简介
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 一.简介 二.ELK 协议栈介绍及体系结构 三.集中式日志协议栈 ...
- 【Elastic Stack(一)】Elastic Stack简介
如果你没有听说过Elastic Stack,那你一定听说过ELK.实际上ELK是三款软件的简称,分别是Elasticsearch.Logstash.Kibana组成,在发展的过程中,又有新成员Beat ...
- exchange2003备份与恢复
exchange2003备份与恢复 owa 访问的是在线访问方式.连接到服务器里的访问邮箱,操作邮件是在服务器上. 先发一邮件 永久删除,直接从服务器里把此邮件删除掉. 删除之后.服务器里已没有此邮件 ...
- Xtrabackup实现数据的备份与恢复
Xtrabackup介绍 Xtrabackup是由percona开源的免费数据库热备份软件,它能对InnoDB数据库和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份同样需要加表锁): ...
- Elastic Job从单点到高可用、同城主备、同城双活
以下文章来源方志朋的博客,回复"666"获面试宝典 来源:https://jaskey.github.io/blog/2020/05/25/elastic-job-timmer-a ...
- Elastic Search 介绍和基本概念
Elastic Search 特点 Elastic Search 可能是是当下最火的搜索引擎中间件了.为什么这么火呢?主要是因为他有几大绝艺: 快速.无论什么时候,你需要向 ES 查询你的数据,都能够 ...
- R语言glmnet交叉验证选择(alpha、lambda)拟合最优elastic回归模型:弹性网络(elasticNet)模型选择最优的alpha值、模型最优的lambda值,最终模型的拟合与评估
R语言glmnet交叉验证选择(alpha参数和lambda参数)拟合最优elastic回归模型:弹性网络(elasticNet)模型选择最优的alpha值.弹性网络(elasticNet)模型最优的 ...
- elastic stack中的Beats是什么?
elastic stack中的Beats是什么? elastic stack栈涉及到以下⼏个组件 beats:⽤于轻量级⽇志采集,⽀持⽂件采集,系统数据采集,特定中间件数据采集等 logstash:⽤ ...
最新文章
- Express应用配置端口
- 《大规模Scrum:More with LeSS》访谈
- 天涯htmlcss基础框架
- tab-pane 怎么家点击事件_有好转?辛巴燕窝事件新进展曝光。二子爷老婆首次回应银行行长送奥迪!二子爷分析小样你家老铁太精...
- SQL Server 2008不能修改表的解决方法
- Nginx的upstream_response_time
- WWW 2021 | 融合先验知识的BERT注意力模型
- SAP UI5 数据绑定之高级技巧 - Type System
- Linux下的绘图(流程图、UML、mindmap)工具
- 根据中文修改英文翻译,重新生成英文翻译文件(保证原有文件的顺序不变)
- Qt5 for linux离线安装工具下载地址
- 电脑合上盖子不锁屏_笔记本电脑合上盖子或台式机离开后黑屏是“休眠”还是“睡眠”...
- 数据库系统概论-数据库安全性
- 微信公众号是html页面吗,微信公众号网页开发
- 网络渗透就业学习路线
- 微软手机远程桌面使用
- 台式计算机能不能安装蓝牙驱动,win7电脑蓝牙驱动怎么安装,详细教您怎么安装...
- 精准测分:基于函数调用关系链的用例消振算法(上帝视角)
- TPLINK路由器配置桥接过程
- 中科院计算机专业,中科院计算所博士平均年薪都超过50万了,计算机专业真是可以无脑选的那种...
热门文章
- php用重写算出圆柱体的体积,圆柱的体积
- graphpad 折线图横坐标比例_GraphPad Prism绘制剂量反应曲线
- 剑指Offer #02 替换空格(字符串处理)
- mysql 时间取日期函数_mysql 获取当前日期函数及时间格式化参数详解
- 如何在ubuntu下安装detectron2_Anaconda中安装Cascade RCNN(Detectron)的若干问题
- 我慌了,纠删码是什么?我被面试官问蒙了
- Serverless 工程实践 | Serverless 应用优化与调试秘诀
- 函数计算是如何工作的?
- 从零开始入门 K8s | 可观测性:监控与日志
- Golang 在阿里集团调度集群管理系统 Sigma 中的实践