1、ES调优手段 1.1、设计阶段调优 ES数据区分热、温、冷三个阶段 ES索引按月滚动生成 mapping设置合理的数据类型是否需要分词 使用别名管理索引??? 1.2、数据写入优化 1> 单条写入改为多条数据写入 2> 自动生成ID 3> 索引刷盘时间,index.refresh_interval: 30s; 默认1s改为30s,减少刷盘频次 4> 设置副本数为0 5> 设置segment段大小,参数如下: indices.memory.index_buffer_size: 20% (最大堆内存百分比) indices.memory.min_index_buffer_size: 96mb (最小缓存大小) 6> 设置节点之间的故障检测配置,例如以下elasticsearch.yml配置: discovery.zen.fd.ping_timeout: 120s discovery.zen.fd.ping_retries: 6 discovery.zen.fd.ping_interval: 30s 1.3 查询优化 1、分片数合理评估 1>集群总分片数建议控制在5w以内,单个索引的规模控制在 1TB 以内,单个分片大小控制在30 ~ 50GB ,docs数控制在10亿内,如果超过建议滚动; 2>分片的数量通常建议小于或等于ES 的数据节点数量,最大不超过总节点数的2倍,通过增加分片数可以提升并发; 3>分片数越多长尾效应越明显,所以并不是越多越好,在搜索场景合理控制分片数也可以提升性能。 2、mapping设计 1> 合理设置index:false,store:false,doc_values:false 2> 长字段增加序列化和高亮开销,但字段长度不能高于65536(short?),超长配置: ignore_above 忽略超长的数据 3> 合理设置keyword类型,使用倒排索引 4> 合理使用fields属性,对于text字段设置子字段为keyword,支持text和keyword两种功能。 "city": {"type":"text","fields":{"raw":{"type":"keyword"}}} "sort": {"city.raw": "asc"} 5> 字段爆炸:1) 父层级设置 enabled:false 防止子字段mapping,能被行存查出来2) dynamic=runtime 入新字段也会更新 mapping,但是新加入的字段不会被索引,dynamic=strict 不允许新增一个不在 mapping中的字段,dynamic=false (新字段不会被索引,不能作为查询条件,但是能被行存查询出来) 3、查询 Routing 路由优化? 4、查询裁剪 6、fetch性能优化1、字段设置40个,stored,docvalues,source 三种数据性能相同1) 当字段数很少时,低于 40 时,使用 doc_value Fields 拉取,性能最优。分析:如果我们只需要返回其中包含的一小部分字段时,读取并解压这个巨大的_source字段可能会开销很高。2) 当字段超较多时,达到 40 以上时,使用 _source 变为最优。分析:当我们需要非常多或者几乎全部字段时,此时使用 doc_value Fields 可能会有非常多的随机IO。这个时候,读取 _source 一个字段就能够处理全部业务字段。默认stored:false,docvalues:true,source:true设置示例:"properties" : {"_source":{"enabled":false//是否启用source}"field":{"type":"keyword","store":true,//是否存储原始值在storefields中"doc_values"true//是否存储原始值在docvalues中}"excludes":["meta.description","meta.other.*"]}2、内部结构Stored fields 在磁盘上以行的方式放置: 每个文档对应一个行,这个行包含该文档所有的stored fields。Doc values 以列的方式存储. 不同文档的相同字段被连续地存储在一起. 这种存储方式,可以直接访问一个特定的文档的特定字段。Source 与Stored fields方式差不多额外增加了_source字段存储全量json。 7、Force merge优化减少小的segment 8、ES缓存设计 9、聚合优化Metric 聚合 - 计算字段值的求和平均值,Geo-hash,采样等Bucket 聚合 - 将字段值、范围、或者其它条件分组到Bucket中Pipeline 聚合 - 从已聚合数据中进行聚合查询 10、分页查询1、from + size2、滚动翻页(Search Scroll)3、流式翻页(Search After)