ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

elasticsearch优化的点点滴滴

2021-06-27 11:30:11  阅读:232  来源: 互联网

标签:index translog merge elasticsearch 点点滴滴 flush 磁盘 优化



请看懂上面这个图:

问自己refresh  flush是什么意思,translog是什么?  文件cache是什么,内存or磁盘?下面的优化参数是小菜一碟。

https://www.jianshu.com/p/15837be98ffd

1、数据刷新优化 flush refesh translog

1、 数据先存到内存buffer中,这时数据不可搜索,同时写事务日志 translog

2、 当 mem buffer满,或者默认每隔1s ,refresh将内存数据生成segment 保存到文件缓存,这时,数据可以被搜索

3、 当translog大到一定的程度,flush是将文件缓存刷新到磁盘,或者每隔30分钟

注意文件缓存(os cache) 也是一块内存

2、JVM参数

为系统内存的75%+

3、系统架构优化 3个master 其他作为data 防止脑裂

4、数据查询优化

5、 索引数据内容优化 比如 索引大的 只保存查询的field到es,其余丢到hbase

https://blog.csdn.net/wwd0501/article/details/78320971

1. index.refresh_interval: "30s"

优化点: 减少刷新频率,降低潜在的写磁盘性能损耗

2. translog优化

优化点: 减少写磁盘的频率

python

{

 "index": {

   "translog": {

     "flush_threshold_size": "1gb",

     "sync_interval": "30s",

     "durability": "async"

   }

 }

}

flush操作的频率是通过translog的大小控制的,当translog大小达到一定值的时候就执行一次flush,对应参数为index.translog.flush_threshold_size,默认值是512mb,

这里调整为1gb,减少flush的次数translog本身是文件,也需要存储到磁盘,它的存储方式通过index.translog.durability和index.translog.sync_interval设定。

index默认情况下,index.translog.durability=request,意为每次请求都会把translog写到磁盘。这种设定可以降低数据丢失的风险,但是磁盘IO开销会较大

这里采用异步方式持久化translog,每隔30秒写一次磁盘

3. index.store.throttle.type: "none"

优化点: 放开merge操作,加快合并,防止因为merge滞后导致index操作被限速

如果不关心查询的性能,可以把index.store.throttle.type设为none,意为不对merge操作限速

这个参数默认配置是针对merge操作限制使用磁盘带宽20MBps

以下设置我认为更合理:https://www.cnblogs.com/technologykai/articles/10899582.html

提升段合并速度:ES 默认对段合并的速度是 20m/s,如果使用了 SSD,我们可以通过以下的命令将这个合并的速度增加到 100m/s。

PUT /_cluster/settings

{

  "persistent" : {

    "indices.store.throttle.max_bytes_per_sec" : "100mb"

  }

}

4. index.merge.scheduler.max_thread_count: 1

优化点: 减少并发并发merge对磁盘的消耗

5. indices.memory.index_buffer_size: "20%"

优化点: 降低被动写磁盘的可能性

6、结论

以上测试可以看到

translog优化禁用的时候集群负载最高,写入性能最差

index refresh操作对写入的性能略有影响

segment merge对写入性能影响非常小

7. index template配置

{

 "order": 0,

 "template": "hy-log-*",

 "settings": {

  "index": {

   "refresh_interval": "30s",

   "number_of_shards": "20",

   "translog": {

    "flush_threshold_size": "1gb",

    "sync_interval": "30s",

    "durability": "async"

   },

   "number_of_replicas": "0"

  }

 },

 "mappings": {

  "_default_": {

   "dynamic_templates": [

    {

     "strings_as_keywords": {

      "mapping": {

       "index": "not_analyzed"

      },

      "match_mapping_type": "string"

     }

    }

   ]

  }

 },

 "aliases": {}

8 压测

按照所有优化项开启的设定,使用python api开启多线程向ES集群发起bulk index请求,同时观察kibana monitor界面,发现index qps达到30w/s,随后集群很快挂掉。

9 优化存储设备

ES 是一种密集使用磁盘的应用,在段合并的时候会频繁操作磁盘,所以对磁盘要求较高,当磁盘速度提升之后,集群的整体性能会大幅度提高。

磁盘的选择,提供以下几点建议:

  1 使用固态硬盘(Solid State Disk)替代机械硬盘。SSD 与机械磁盘相比,具有高效的读写速度和稳定性。

  2 使用 RAID 0。RAID 0 条带化存储,可以提升磁盘读写效率。

  3 在 ES 的服务器上挂载多块硬盘。使用多块硬盘同时进行读写操作提升效率,在配置文件 ES 中设置多个存储路径,如下所示:

path.data:/path/to/data1,/path/to/data2。

避免使用 NFS(Network File System)等远程存储设备,网络的延迟对性能的影响是很大的。

10 禁止swap 

在 ES 中设置。如果上面的方法都不能做到,你需要打开配置文件中的 mlockall 开关,它的作用就是运行 JVM 锁住内存,禁止 OS 交换出去。

在 elasticsearch.yml 配置如下:

bootstrap.mlockall: true

标签:index,translog,merge,elasticsearch,点点滴滴,flush,磁盘,优化
来源: https://blog.csdn.net/weixin_36013896/article/details/118268121

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有