elastisearch专题-如何优化es的写入性能

本文探讨了如何优化Elasticsearch的写入性能,包括客户端的多线程批量写入,服务器端的硬件升级,以及配置调整如降低IO操作、减少CPU和存储开销、实现写入和分片的负载均衡。详细介绍了如调整刷新间隔、优化translog策略、批量写入参数等方法,并提示在追求极致性能时可能牺牲的数据可靠性和搜索实时性。同时,提供了数据写入ES过程的详解,帮助理解优化点。

目标

写入性能优化的目标:增大写的吞吐量,越大越好

可以着手优化的方向

  • 客户端: 多线程,批量写
  • 服务器端:使用更好的硬件配置。观察CPU/IO,线程,堆栈的状况。

细节

服务器端的一些方案

  1. 降低IO操作
    • 使用es自动生成文档的id/ 修改一些es的配置,入refresh interval
  2. 减少CPU和存储的开销
    • 减少不必要的分词,减少不必要的doc_values, 文档中的字段尽量保证同样的顺序以保证压缩率
  3. 尽量实现写入和分片的负载均衡,实现水平扩展
    • shard filtering,write load Balancer
  4. 调整Bulk的线程池和队列
  5. es的默认配置,考虑了数据的可靠性和搜索的实时性,不要盲目修改。一切的优化都要基于高质量的数据建模。

高质量建模的实践

  1. 只需聚合不需要搜索,index设置成false。
  2. 不需要算分,norms设置成false。
  3. 不要对字段使用默认的dynamic mapping,会生成过多的字段,对性能产生较大的影响。
  4. index_options,考虑在创建倒排序索引时,哪些字段需要被加入到道排序索引当中。
  5. 关闭_source,减少IO,合适指标型数据

追求极致的写入速度

牺牲数据的可靠性和搜索的实时性来换取性能,可以在项目数据初始化的时候使用

  1. 牺牲可靠性: 副本数设置成0,写完之后再调整回去
  2. 牺牲搜索的实时性:可以将refresh interval的时间设置的大一些,同时需要考虑将index_buffer_size的数值填大些
  3. 牺牲可靠性,修改transLog的配置

数据写入es的过程

  • refresh,将文档保存在index_buffer中,以refresh_interval为间隔时间,清空buffer,生成segment,segment会先存放在系统的缓存中,并开放搜索,提升搜索的实时性。
  • translog,从名称上可以看出它是个日志文件,它可以帮助es宕机时,segment就算没有写入到磁盘中,重启机器后,数据也是可以恢复的。默认配置,每次请求都会落盘。
  • flush, 删除旧的translog,将segment写入到磁盘当中,更新commit point 并写入磁盘。es自动完成,可以优化的点不多。

translog

降低translog的频率,同时也是会降低容灾能力
* index.translog.durability: 默认是request,每个请求都落盘,设置成async,异步写入
* index.translog.sync_interval, 设置成60秒,每分钟执行一次
* index.translog.flush_threshod_size: 默认是512mb, 可以适当调大,超过这个值时,会触发flash。

bulk,线程池,队列大小

  1. 单个bulk请求体的数据量不要太大,官方建议在5-15MB
  2. bulk请求超时时间要足够长,建议60秒以上
  3. 写入端尽量将数据轮询到不同的节点上

例子
在这里插入图片描述

*
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值