设置参数 `node.name` 可以自定义 Elasticsearch 节点的名字。 此条 Tips 由 medcl 贡献。

怎样有效解决0点数据写新索引时的性能问题?

Elasticsearch | 作者 wangxinrong | 发布于2019年12月23日 | 阅读数:3642

我的集群每天会根据日期创建一百多个新的索引。
并且有些索引写入的日志来自于很多个不同的应用程序,它们字段各不相同,mapping不是一次写入就固定下来,而是在一段时间内会频繁地更新。

现在我遇到的问题是,虽然已经预创建了第二天的索引,但每天0点,当所有数据都往新日期的索引里写时,集群还是经常卡住,数据在一段时间内无法写入,报 failed to process cluster event (put-mapping) within 30s 错误。

看错误提示,应该是这段时间各种不同的日志写入索引,索引的mapping字段在不停地更新,导致master处理不过来,写日志到es的进程在比较长的时间内无法写日志,从而导致一系列问题。

针对这种情况,我能想到的是对所有mapping,也按照前一天的配置,预先做设置,但这样如果索引模板中的mapping配置发生变化,也没办法及时更新。不知道有没有什么好的思路去解决。
已邀请:

kennywu76 - Wood

赞同来自: everything laoyang360 tongyuebin shyshy

日志系统最好不要用动态mapping,规模越大,带来的问题越多。 一方面每写入一个新字段都会引起集群更新状态,对于规模较大的集群,因为状态数据比较大,master会处理不过来,造成数据一段时间无法写入; 另外一方面字符型数据默认都是创建成一个keyword类型和一个text类型,而往往只会用到其中一个类型,甚至有些根本就不会做检索和聚合, 这样大大提高了数据写入的开销,磁盘空间也会有非常大的浪费。
 
我们对于日志数据的mapping是设置"dynamic": "false",不允许动态创建的。 所以新增的字段初始接入的时候是无法检索的,需要用户在我们提供的UI上自助为新字段定义类型,新类型才会被写入mapping里。  
匿名用户

匿名用户

赞同来自: tongyuebin

变态啊,频繁的更新mapping?
 
为什么要频繁的更新mapping啊?更新策略是什么呢?
 
什么时候更新?
 
根据数据自动更新吗?
 
数据中增加一个字段,mapping对应加一个?
数据少一个字段,mapping对应少一个?
 
 

wangxinrong

赞同来自:

不是我在更新啊,是每次写入数据,如果一个文档中有新的字段,es会自动处理的,现在就是写入太多这个操作次数太多。
匿名用户

匿名用户

赞同来自:

你们的业务本身存在问题,还能让业务数据,随便的增加字段?那我加几万个字段也行了?

Charele - Cisco4321

赞同来自:

这种报错是因为master在提交putMapping的状态更新任务时,节点来不及处理引起的。
 
不知道你用的是什么方式把日志插到ES里的?
你可以试着把超时设长一点看看,比如5分种。

God_lockin

赞同来自:

那些新来的field真的需要吗?可以考虑用dynamic_mapping把所有规定之外的字段全都index:false试试

wangxinrong

赞同来自:

我们这个业务是确实需要的,之前每个应用自定义格式的日志单独放一个索引,现在索引已经很多了,所以有些索引是多个应用共同写入的,这些应用格式各不相同,所以每个应用写入时都会导致当天新创建的索引字段有变化。

wangxinrong

赞同来自:

目前我把日志中一些频繁记录mapping_update的索引配置了模板,在mapping里指定了已有的字段,观察下来有明显改善,不过这样要定期去设置修改模板,似乎也不是一个好办法。
匿名用户

匿名用户

赞同来自:

每天晚上把当天的索引字段,跟昨天的比对,把合并的字段做为最新的去创建,每天都取并集,这样就不用手工维护了。

要回复问题请先登录注册