关于误删除elasticSearch 索引,怎么能快速找回?
背景
之前公司小王在工作中清理elasticSearch 索引,不小心使用脚本清空了最近使用的重要索引,导致开发无法准确的进行定位生产问题,造成了很大困扰。
当时我们的生产环境中是这样配置日志系统的:服务器 -> filebeat -> kakfa -> logstash -> elasticsearch -> kibana 页面。其中在缓存配置中我们配置了kafka集群。
es 数据丢失之后,我们考虑使用拉去kafka 集群中的存储的消息,让它重新消费一边,更换消费组,从头开始进行消费 配置 auto_offset_reset => "earliest" 设定。
具体实践如下:
logstash.conf配置
如下配置是我测试通过的
input {
	kafka {
		bootstrap_servers => ["192.168.39.23:9082,192.168.39.24:9082,192.168.39.25:9082"]         topics_pattern  => ["MY_REPORT_TOPIC_.*"]
        client_id => "logstash-1"
        group_id => "logstash_to_elastic2"	# 这里的组要更新一下,原先是logstash_to_elastic
        auto_offset_reset => "earliest"		# 这里设定消费模式为从头开始消费,也就是从最初开始消费
        consumer_threads => 1
        decorate_events => true
        codec => "json"
	}
}
output {
	elasticsearch {
		hosts => "http://192.168.39.27:9200"
        index => "logtype-%{[logType]}"
        document_id => "%{[@metadata][kafka][topic]}-%{[@metadata][kafka][partition]}-%{[@metadata][kafka][offset]}"
	}
}
重点说下读取kafka的配置:
bootstrap_servers:kafka集群地址
topics_pattern:我这里是通配的前缀为”MY_REPORT_TOPIC_”的topic,注意后面跟的是.*,不要忘了这个点,正则的语法,通配所有字符用的
client_id:自定义的客户端id
group_id:自定义组id,两个消费者同时消费同一组会造成其中一个无法消费,但是只要创建多个partition就可以了,即组内消费者数量和分区数相同就都可以消费了,这样一个组内所有消费者能够分担负载
auto_offset_reset:
- earliest
当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费 - latest
当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据 - none
topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常 
由于我有些历史数据要消费,所以设置为earliest从头读的
consumer_threads:一般最佳配置是同一个组内consumer个数(或线程数)等于topic的分区数,如果大于分区数会造logstash进程闲置,否则一个进程访问多个分区。如果有多个Logstash实例,那就让实例个数 * consumer_threads等于分区数即可
如何避免重复消费
数据写入到Kafka时没有重复,但后续流程可能因为网络抖动、传输失败等导致重试造成数据重复。如何解决呢?不需要依赖业务数据就可以去重。去重的原理也很简单,利用es document id即可。
对于es,如果写入数据时没有指定document id,就会随机生成一个uuid,如果指定了,就使用指定的值。对于需要去重的场景,我们指定document id即可。
在output elasticsearch中可以通过document_id字段指定document id,我们需要构造出一个”uuid”能惟一标识kafka中的一条数据,这个非常简单:<topic>+<partition>+<offset>,这三个值的组合就可以唯一标识kafka集群中的一条数据。
input kafka插件也已经帮我们把消息对应的元数据信息记录到了@metadata(Logstash的元数据字段,不会输出到output里面去)字段里面:
- [@metadata][kafka][topic]:索引信息
 - [@metadata][kafka][consumer_group]:消费者组信息
 - [@metadata][kafka][partition]:分区信息
 - [@metadata][kafka][offset]:offset信息
 - [@metadata][kafka][key]:消息的key(如果有的话)
 - [@metadata][kafka][timestamp]:时间戳信息(消息创建的时间或者broker收到的时间)
 
因此就有了上面的配置:
document_id => "%{[@metadata][kafka][topic]}-%{[@metadata][kafka][partition]}-%{[@metadata][kafka][offset]}"
decorate_events:只有当decorate_events选项配置为true的时候,上面的[@metadata](https://github.com/metadata)才会记录那些元数据,否则不会记录。而该配置项的默认值是false,即不记录
												
											关于误删除elasticSearch 索引,怎么能快速找回?的更多相关文章
- Elasticsearch索引(company)_Centos下CURL增删改
		
目录 返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html 1.Elasticsearch索引说明 a. 通过上面几篇博客已经将Elastics ...
 - Elasticsearch索引和文档操作
		
列出所有索引 现在来看看我们的索引 GET /_cat/indices?v 响应 health status index uuid pri rep docs.count docs.deleted st ...
 - Elasticsearch索引原理
		
转载 http://blog.csdn.net/endlu/article/details/51720299 最近在参与一个基于Elasticsearch作为底层数据框架提供大数据量(亿级)的实时统计 ...
 - Elasticsearch入门教程(三):Elasticsearch索引&映射
		
原文:Elasticsearch入门教程(三):Elasticsearch索引&映射 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文 ...
 - 带你走进神一样的Elasticsearch索引机制
		
更多精彩内容请看我的个人博客 前言 相比于大多数人熟悉的MySQL数据库的索引,Elasticsearch的索引机制是完全不同于MySQL的B+Tree结构.索引会被压缩放入内存用于加速搜索过程,这一 ...
 - ES3:ElasticSearch 索引
		
ElasticSearch是文档型数据库,索引(Index)定义了文档的逻辑存储和字段类型,每个索引可以包含多个文档类型,文档类型是文档的集合,文档以索引定义的逻辑存储模型,比如,指定分片和副本的数量 ...
 - ElasticSearch 索引 剖析
		
ElasticSearch index 剖析 在看ElasticSearch权威指南基础入门中关于:分片内部原理这一小节内容后,大致对ElasticSearch的索引.搜索底层实现有了一个初步的认识. ...
 - Elasticsearch 索引、更新、删除文档
		
一.Elasticsearch 索引(新建)一个文档的命令: curl XPUT ' http://localhost:9200/test_es_order_index/test_es_order_t ...
 - Elasticsearch 索引的全量/增量更新
		
Elasticsearch 索引的全量/增量更新 当你的es 索引数据从mysql 全量导入之后,如何根据其他客户端改变索引数据源带来的变动来更新 es 索引数据呢. 首先用 Python 全量生成 ...
 
随机推荐
- macOS warning emoji render bug
			
macOS warning emoji render bug ️ macOS render bug Apple Color Emoji fonts install old version fonts ...
 - text to JSON
			
text to JSON GeoLocaltion API https://www.cnblogs.com/xgqfrms/p/13283680.html https://repl.it/@xgqfr ...
 - Taro 版本
			
Taro 版本 https://taro-docs.jd.com/taro/versions.html 1.x 1.3.34 https://taro-docs.jd.com/taro/docs/1. ...
 - js showOpenFilePicker showSaveFilePicker showDirectoryPicker API
			
选择文件,获取文件句柄 btn.addEventListener("click", async (e) => { try { const hFiles = await win ...
 - HGAME apache
			
HGAME apache Linux下六十四位可执行文件 IDA找主函数 输入长度为35的字符串,经过一次函数处理,之后if条件函数的返回值为1,就能判定输入就是flag 函数sub_1447的参数 ...
 - Word带数学公式发布博客
			
Word公式编辑器无法直接上传博客,一个一个的转换LaTeX还要加$,十分麻烦. 下面是我昨天摸索出来的办法.作为博客新人,这个问题困扰我一晚上,能解决我也是非常高兴的. 如果各位前辈有好方法的话,请 ...
 - scrapy 运行逻辑
			
爬虫的步骤:发送请求获得响应→解析并提取数据→保存数据 我们沿用这个朴素的逻辑去理解scrapy 一.发送请求获得响应 1.爬虫发送请求request到引擎 2.引擎将请求request传递给调度器s ...
 - Java如何保证文件落盘?
			
本文转载自Java如何保证文件落盘? 导语 在之前的文章Linux/UNIX编程如何保证文件落盘中,我们聊了从应用到操作系统,我们要如何保证文件落盘,来确保掉电等故障不会导致数据丢失.JDK也封装了对 ...
 - 阿里云linux安装nginx,亲测有效
			
系统平台:CentOS release 6.6 (Final) 64位. 一.安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c++ libtoo ...
 - Vue脚手架中默认的margin怎么清除
			
问题情景:开发中发现我的项目四周有白边,但是并没有设置样式 问题原因:vue脚手架中静态文件夹public中的index.html造成的 解决方案:找到vue脚手架中index.html页面,设置ma ...