|NO.Z.00065|——————————|BigDataEnd|——|Hadoop&ElasticSearch.V02|——|ELK.v02|Logstash|ES集群规划调优.V2|ES集群调优|
一、ES集群调优策略
### --- ES集群调优策略
~~~ JavaBBSELK日志平台中Elasticsearch实例节点数不到10个,
~~~ 考虑到资金投入、当前及未来一定时间内数据的增量情况等,
~~~ 研发和运维团队在竭尽所能的通过调优方式保证Elasticsearch正常高效运转。
~~~ 接下来,从Index(写)和Search(读)两个方面给大家分享调优经验
二、Index(写)调优
### --- Index(写)调优
~~~ JavaBBS论坛的职位数据和简历数据,首先都是进入MySQL集群的,
~~~ 从MySQL的原始表里面抽取并存储到ES 的Index,而MySQL的原始数据也是经常在变化的,
~~~ 所以快速写入Elasticsearch、以保持Elasticsearch和MySQL的数据及时同步也是很重要的。
### --- 副本数置0
~~~ 如果是集群首次灌入数据,可以将副本数设置为0,写入完毕再调整回去,
~~~ 这样副本分片只需要拷贝,节省了索引过程。
PUT /my_index/_settings
{
"number_of_replicas": 0
}

### --- 自动生成doc ID
~~~ 通过Elasticsearch写入流程可以看出,如果写入doc时如果外部指定了id,
~~~ 则Elasticsearch会先尝试读取原来doc的版本号,以判断是否需要更新。
~~~ 这会涉及一次读取磁盘的操作,通过自动生成doc ID可以避免这个环节。
### --- 合理设置mappings
~~~ 将不需要建立索引的字段index属性设置为not_analyzed或no。
~~~ 对字段不分词,或者不索引,可以减少很多运算操作,降低CPU占用。
~~~ 尤其是binary类型,默认情况下占用CPU非常高,而这种类型进行分词通常没有什么意义。
~~~ 减少字段内容长度,如果原始数据的大段内容无须全部建立 索引,则可以尽量减少不必要的内容。
~~~ 使用不同的分析器(analyzer),不同的分词器在索引过程中 运算复杂度也有较大的差异。
### --- 调整_source字段
~~~ source 字段用于存储 doc 原始数据,对于部分不需要存储的字段,
~~~ 可以通过 includes excludes过滤,或者将source禁用,
~~~ 一般用于索引和数据分离,这样可以降低 I/O 的压力,不过实际场景中大多不会禁用_source。
### --- 对analyzed的字段禁用norms
~~~ Norms用于在搜索时计算doc的评分,如果不需要评分,则可以将其禁用:
"title": {
"type": "string",
"norms": {
"enabled": false
}
### --- 调整索引的刷新间隔
~~~ 该参数缺省是1s,强制ES每秒创建一个新segment,
~~~ 从而保证新写入的数据近实时的可见、可被搜索到。
~~~ 比如该参数被调整为30s降低了刷新的次数,把刷新操作消耗的系统资源释放出来给index操作使用。
~~~ 这种方案以牺牲可见性的方式,提高了index操作的性能。
PUT /my_index/_settings
{
"index" : {
"refresh_interval": "30s"
}
}

### --- 批处理
~~~ 批处理把多个index操作请求合并到一个batch中去处理,和mysql的jdbc的bacth有类似之处。
~~~ # 如图:
~~~ 比如每批1000个documents是一个性能比较好的size。
~~~ 每批中多少document条数合适,受很多因素影响而不同,

三、Search(读)调优
### --- Search(读)调优
~~~ 在存储的Document条数超过10亿条后,如何进行搜索调优。
### --- 数据分组
~~~ ES用来存储日志,日志的索引管理方式一般基于日期的,基于天、周、月、年建索引。
~~~ # 如下图,基于天建索引:
~~~ 当搜索单天的数据,只需要查询一个索引的shards就可以。
~~~ 当需要查询多天的数据时,需要查询多个索引的shards。
~~~ 这种方案其实和数据库的分表/分库/分区查询方案相比,思路类似/小数据范围查询而不是大海捞针。

### --- 使用Filter替代Query
~~~ 在搜索时候使用Query,需要为Document的相关度打分。
~~~ 使用Filter,没有打分环节处理,做的事情更少,而且filter理论上更快一些。
~~~ 如果搜索不需要打分,可以直接使用filter查询。
~~~ 如果部分搜索需要打分,建议使用'bool'查询。
~~~ 这种方式可以把打分的查询和不打分的查询组合在一起使用,如:
GET /_search
{
"query": {
"bool": {
"must": {
"term": {
"user": "kimchy"
}
},
"filter": {
"term": {
"tag": "tech"
}
}
}
}
}

### --- ID字段定义为keyword
~~~ 一般情况,如果ID字段不会被用作Range 类型搜索字段,都可以定义成keyword类型。
~~~ 这是因为keyword会被优化,以便进行terms查询。
~~~ Integers等数字类的mapping类型,会被优化来进行range类型搜索。
~~~ 将integers改成keyword类型之后,搜索性能大约能提升30%。
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
bdv025-elk
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」