在 Mapping 里面,将 dynamic 参数设置成 strict 可以拒绝索引包含未知字段的文档。 此条 Tips 由 medcl 贡献。

logstash爬数据库总是异常,数据重复

Logstash | 作者 weiliao | 发布于2016年08月09日 | 阅读数:7920

大神们好~ 小弟最近在用ELK及其插件抓取oracle数据库里头的数据,成功抓取数据,但是统计了一下Kibana里头的数据量大约是实际数据库里头的20倍。我惊呆了。很多其实是一样的数据,不过timestamp以及_id不一样,kibana就按不同的数据显示了。谷歌了一下logstash 数据重复问题,还真发现了不少同样的问题。看了下其他问题的答案,大概是因为logstash retry逻辑问题导致爬取数据库的时候同一条数据爬了好多遍。
1、各位有什么好的建议清洗重复数据吗?
2、ELK是根据_id字段来判断两条数据之前是否是同一条吗?答案:通过_uid来判断,_uid = _type#_id
3、如果真按strglee的方法来清洗数据,那么有个问题通过设置Mapping来自定义_id,我现在是按logstash默认的配置,每天生成一个索引,那我岂不是每天都要修改下新索引的Mapping?有什么好的办法解决吗?答案1:,可以通过设定模板,使符合格式的的索引都用自定义模板。答案2:答案1的方法已经过时了,在es2.0版本已被废弃,通过在logstash[/url] output里添加一句 document_id = "%{log_id}"可将数据库里的主键log_id定义为_id,从而避免数据重复。非常感谢@strglee的耐心答复。
4、昨天本来以为已经彻底解决了。谁知道数据还是重复了。原因还是logstash的问题,不过这次量小了好多,一般也就重复两次。利用3不是已经能够确保同一type下数据唯一性了吗?是这样的呀,不过那是在同一个索引下,要完全确定一条数据应该是_index#_type#_id。我按的是logstash默认的规则,每天会自动新建一个索引。如果logstash在不同日期内爬取(比如23:00~次日1:00,logstash很有可能在这两个时间内爬取了同一条数据),那同一条数据就到了不同的索引下了,所以即使他_type#_id一致,但仍然重复了。有什么办法解决吗?
5、(2016-8-18更新)解决了数据重复问题(参考http://www.cnblogs.com/licongyu/p/5383334.html),通过参数配置,记录主键位置(use_column_value => true   tracking_column => BUG_ID   record_last_run => true),现在又碰到新问题,数据缺失,大概少了15%的数据。推测logstash query数据库的时候失败了,但是还是更新了主键位置(BUG_ID)。是不是该更新logstash 5.0了。或者启用beats。答案:在反复谷歌加试验之后,网上并未有此类问题,试验也无效。最终我发现数据库里头的数据就是缺失的。。。。我真是XXX。发现问题——确认问题存在——寻找问题触发条件——寻找解决方案
 
 
总结:先看官方文档!!logstash-input-jdbc官方文档里头早就提到了可以通过数据库主键记录sql query的位置。我真是作死,已弃疗。
已邀请:

strglee

赞同来自: weiliao medcl

在mapping里面设置_id由文档中id 字段生成:
PUT /my_index
{
"mappings": {
"my_type": {
"_id": {
"path": "doc_id"
},
"properties": {
"doc_id": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}

要回复问题请先登录注册