建议
索引设计角度:
- 避免一个索引有过多的分片
- 控制单个分片的大小:search 20GB, log 40GB
- force merge 只读索引,较少segment数量
- 尽可能 Denormalize(反规范化) 数据,从而获取最佳的性能
- 不使用嵌套类型对象,使用 Nested 类型的数据。查询速度会慢几倍
- 不使用父子关系类型对象,使用 Parent / Child 关系。查询速度会慢几百倍
查询语句角度
- 尽量将数据先行计算,然后将数据保存在es中,避免查询时使用脚本计算
- 尽量使用Filter Context, 利用缓存机制,减少不必要的算分
- 结合profile,explain API 查询慢查询原因,持续优化数据模型
- 避免使用通配符(*)开头的查询,如wildCard模糊查询。有什么方案可以替代模糊查询呢?
建议
- 降低IO操作
- 降低IO频率,如增大refresh频率的间隔时间
- 降低CPU和存储的开销
- 减少不必要的分词,dov_value/fielddata, 文档的字段尽量保证相同的顺序,可以提高文 档的压缩率
- 尽可能做到写入和分片的负载均衡,实现水平扩展
- 关闭无关的功能
- 只需要聚合不需要搜索, Index 设置成 false
- 不需要算分, Norms设置成false
- 关闭_source, 减少IO操作,适合指标型数据
- 不要对字符串使用默认的 dynamic mapping。字段 数量过多,会对性能产生比较大的影响
- Index_options 控制在创建倒排索引时,哪些内容 会被添加到倒排索引中。优化这些设置,一定程度 可以节约 CPU
- 暂时性的牺牲可靠性和实时性来提高数据写入速度
- 牺牲可靠性:副本分片数设置成0,写入完毕再调整回去;修改transLog的配置
- Index.translog.durability:默认是 request,每个请求都落盘。设置成 async,异步写入
- Index.translog.sync_interval 设置为 60s,每分钟执行一次
- Index.translog.flush_threshod_size: 默认 512 mb,可以适当调大。 当 translog 超过该值,会触发 flush
- 牺牲搜索实时性:增加refresh Interval的时间
* Refresh Interval:增大refresh_interval
* 增大静态配置参数 indices.memory.index_buffer_size,默认10%会触发refresh
- 牺牲可靠性:副本分片数设置成0,写入完毕再调整回去;修改transLog的配置
怎么在保证es在高写入的情况下,不产生查询延时



