elasticsearch优化的点点滴滴
作者:互联网
请看懂上面这个图:
问自己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