9 Elasticsearch 篇之集群调优建议

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bingdianone/article/details/86620327

生产环境部署建议

系统设置要到位

遵照官方建议设置所有的系统参数
参见文档 “setup Elasticsearch =》Important System Configuration”

ES设置尽量简介

  1. elasticsearch.yml中尽量只写必备的参数,其他可以通过api动态设置的参数都通过api来设定
  2. 参见文档"Setup Elasticsearch-> Important Elasticsearch Confiquration"
  3. 随着ES的版本升级,很多网络流传的配置参数已经不再支持,因此不要随便复制别人的集群配置参数

elasticsearch.yml中建议设定的基本参数

  • cluster.name
  • node.name
  • node.master / node.data / node.ingest.
  • network.host建议显示指定为内网ip,不要偷懒直接设为0.0.0.0.
  • discovery.zen.ping.unicast.hosts设定集群其他节点地址
  • discovery.zen.minimum_masternodes一般设定为2
  • path.data/path.log

除上述参数外再根据需要增加其他的静态配置参数
动态设定的参数有transient和persistent两种设置,前者在集群重启后会丢失,后者不会,但两种设定都会覆盖elasticsearch.yml中的配置
在这里插入图片描述

关于JVM内存设定

  1. 不要超过31GB
  2. 预留一半内存给操作系统,用来做文件缓存
  3. 具体大小根据该node要存储的数据量来估算,为了保证性能,在内存和数据量间有一个建议的比例
    ----类项目的比例建议在1:16以内
    ----日志类项目的比例建议在1:48~1:96
  4. 假设总数据量大小为1TB , 3个node , 1个副本,那么每个node要存储的数据量为2TB/3=666GB ,即700GB左右,做20%的预留空间,每个node要存储大约850GB的数据
    ----如果是搜索类项目,每个node内存大小为850GB/16=53GB ,大于31GB.31*16=496 ,即每个node最多存储496GB数据,所以需要至少5个node
    ----如果是日志类型项目,每个node内存大小为850GB/48=18GB,因此3个节点足够

写性能优化

ES写数据-refresh

  1. segment写入磁盘的过程依然很耗时,可以借助文件系统缓存的特性,先将segment 在缓存中创建并开放查询来进一步提升实时性,该过程在es中被称为refresh.
  2. refresh之前文档会先存储在一个buffer中, refresh时将buffer中的所有文档清空并生成segment
  3. es默认每1秒执行一次refresh ,因此文档的实时性被提高到1秒,这也是es被称为近实时(Near Real Time)的原因
    在这里插入图片描述

ES写数据-translog

如果在内存中的segment还没有写入磁盘前发生了宕机,那么其中的文档就无法恢复了,如何解决这个问题?

  • es引入translog机制。写入文档到buffer时,同时将该操作写入translog.
  • translog文件会即时写入磁盘(fsync) , 6.x默认每个请求都会落盘,可以修改为每5秒写一次,这样风险便是丢失5秒内的数据,相关配置为index.translog.*
  • es启动时会检查translog文件,并从中恢复数据
    在这里插入图片描述

ES写数据-flush

flush负责将内存中的segment写入磁盘,主要做如下的工作:

  • 将translog写入磁盘
  • 将index buffer清空,其中的文档生成一个新的segment ,相当于一个refresh操作
  • 更新commit point并写入磁盘
  • 执行fsync操作,将内存中的segment写入磁盘
  • 删除旧的translog文件
    在这里插入图片描述

写性能优化

·目标是增大写吞吐量-EPS(Events Per Second)越高越好
·优化方案

  • 客户端:多线程写,批量写
  • ES:在高质量数据建模的前提下,主要是在refresh, translog和flush之间做文章

写性能优化-refresh

·目标为降低refresh的频率

  • 增大refresh_interval ,降低实时性,以增大一次refresh处理的文档数,默认是 1s,设置为-1直接禁止自动refresh
  • 增大index buffer size ,参数为indices.memory.index_buffer _size(静态参数,需要设定在elasticsearch.yml中),默认为10%
    在这里插入图片描述

写性能优化-translog

目标是降低translog写磁盘的频率,从而提高写效率,但会降低容灾能力

  • index.translog.durability设置为async , index.translog.sync_ interval设置需要的大小,比如120s ,那么translog会改为每120s写一次磁盘
  • index.translog.flush_threshold_size默认为512mb ,即translog超过该大小时会触发一次flush ,那么调大该大小可以避免flush的发生
    在这里插入图片描述

写性能优化-flush

目标为降低flush的次数,在6.x可优化的点不多,多为es自动完成
在这里插入图片描述

写性能优化-其他

·副本设置为0,写入完毕再增加
·合理地设计shard数,并保证shard均匀地分配在所有node上,充分利用所有node的资源

  • index.routing.allocation.total_shards_per_node限定每个索引在每个node上可分配的总主副分片数
  • 5个node ,某索引有10个主分片, 1个副本,上述值应该设置为多少?
    • (10+10)/5=4
    • 实际要设置为5个,防止在某个node下线时,分片迁移失败的问题

·主要为index级别的设置优化,以日志场景举例,一般会有如下的索引设定:
在这里插入图片描述

读性能优化

读性能主要受以下几方面影响:

  • 数据模型是否符合业务模型?
  • 数据规模是否过大?
  • 索引配置是否优化?
  • 查询语句是否优化?

读性能优化-数据建模

1、高质量的数据建模是优化的基础

  • 将需要通过script脚本动态计算的值提前算好作为字段存到文档中
  • 尽量使得数据模型贴近业务模型

2、根据不同的数据规模设定不同的SLA

  • 上万条数据与上千万条数据性能肯定存在差异

3、索引配置优化主要包括如下:

  • 根据数据规模设置合理的主分片数,可以通过测试得到最适合的分片数
  • 设置合理的副本数目,不是越多越好

4、查询语句调优主要有以下几种常见手段:

  • 尽量使用Filter上下文,减少算分的场景,由于Filter有缓存机制,可以极大提升查询性能
  • 尽量不使用Script进行字段计算或者算分排序等
  • 结合profile, explain API分析慢查询语句的症结所在,然后再去优化数据模型

如何设定shard数

ES的性能基本是线性扩展的,因此我们只要测出1个Shard的性能指标,然后根据实际性能需求就能算出需要的Shard数。比如单Shard写入eps是10000 ,而线上eps需求是50000 ,那么你需要5个shard, (实际还要考虑副本的情况)

·测试1个Shard的流程如下:

  • 搭建与生产环境相同配置的单节点集群
  • 设定一个单分片零副本的索引
  • 写入实际生产数据进行测试,获取写性能指标
  • 针对数据进行查询请求,获取读性能指标

·压测工具可以采用esrally 简书搜=》三步上手esrally

·压测的流程还是比较复杂,可以根据经验来设定。如果是搜索引擎场景,单Shard大小不要超过15GB ,如果是日志场景,单Shard大小不要超过50GB(Shard越大,查询性能, 越低)

·此时只要估算出你索引的总数据大小,然后再除以上面的单Shard大小也可以得到分片数。

xpack监控功能介绍

X-Pack Monitoring

官方推出的免费集群监控功能
安装:bin / elasticsearch-plugin install x-pack
同时kibana也需要安装 bin / kibana-plugin install x-pack
x-pack自带有一个账号机制

  • vim config/elasticsearch 进入此文件关闭;登录kibana就不会有密码账号了
    在这里插入图片描述

进入kibana中的Monitoring功能

猜你喜欢

转载自blog.csdn.net/bingdianone/article/details/86620327