ES群集爆火之实际成产中的性能优化

                   ES群集爆火之实际成产中的性能优化
   在近一两年来,Es群集应用还是比较广泛的,大部分都用来日志收集,也就是市面上比较火的elk,实现日志收集分析的一套完整系统,Elasticsearch(ES)本身是一个基于Lucene构建的开源、分布式、RESTful接口的全文搜索引擎。Elasticsearch还是一个分布式文档数据库,其中每个字段均可被索引,而且每个字段的数据均可被搜索,可以在极短的时间内存储、搜索和分析大量的数据,一般用于各种阅读类网站高级搜索这块,和比较大的文章各种常用文章的一个缓存,可以极大的加速文章返应速度,增加用户的一个体验感受。不扯这些没用的哪,和大伙来点实际的吧,下面纯属是个人的一些小小的经验之谈(如有不妥,请勿怪)。
   ES群集的搭建过程我就不多说了,百度一下基本上都是有。下面我说一下,再生产中常用的一些性能上面的优化吧! 
   Elasticsearch7.4.2版本的为例。

在我看来,如果了解Elasticsearch本身作为有个分布式文档数据库,主要是利用内存来实现一个高效,大量数据缓存的一个分析以及搜索(众所周知,将数据缓存在内存中比在磁盘中,当数据被调用的时候要快的多,这也就是为啥后面几乎每个软件,都有本身的一个缓存机制的原因,把常用数据滞留再内存中,可以大大提高数据调取速度,增大用户的体验感受),所以对于ES群集来说内存是至关重要的主要还是进行内存相关配置。
注意: Elasticsearch 默认采用的是Lucene,至于为什么es采用这个,原因可能是因为Lucene是一个成熟的、高性能的、可扩展的、轻量级的,而且功能强大的搜索引擎包。

我们可以了解一下Lucene:
Lucene的设计目的是把底层OS里的数据缓存到内存中。Lucene的段是分别存储到单个文件中的,这些文件都是不会变化的,所以很利于缓存,同时操作系统也会把这些段文件缓存起来,以便更快的访问。Lucene的性能取决于和OS的交互,如果你把所有的内存都分配给Elasticsearch,不留一点给Lucene,那你的全文检索性能会很差的。所以标准建议还是各占一半

剩下常用一些参数优化整理:

  1. swapoff -a #禁用swapping,开启服务器虚拟内存交换功能会对es产生致命的打击,因为当JVM开始写入交换空间时(swapping)ElasticSearch性能会低下。
  2. 配置JVM锁住内存:
    在elasticsearch.yml配置: bootstrap.mlockall: true
    #设置这个属性为true来锁定内存,同时也要允许elasticsearch的进程可以锁住内存
  3. 关闭data节点服务器的http功能
    针对ElasticSearch集群中的所有数据节点,不用开启http服务。将其中的配置 参数这样设置:http.enabled: false。
    同时不要安装head, bigdesk, marvel等监控插件,保证data节点服务器只需处理创建/更新/删除/查询索引数据等操作。
  4. 内存设置(系统内存的50%)
    修改配置文件:
    jvm.options主要是进行内存相关配置,官方建议分配给es的内存不要超出系统内存的50%,预留一半给Lucene,因为Lucene会缓存segment数据提升检索性能;内存配置不要超过32g,如果你的服务器内存没有远远超过64g,那么不建议将es的jvm内存设置为32g,因为超过32g后每个jvm对象指针的长度会翻倍,导致内存与cpu的开销增大。(机器配置32G内存服务器节点上也基本不跑其他服务,建议配置16G)
    -Xms16g
    -Xmx16g
  5. 设置Discovery
    设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点.默认为1,对于大的集群来说,可以设置大一点的值(2-4)
    discovery.zen.minimum_master_nodes: 1
    #设置群集主机生成阈值,来判定群集时候可用。
  6. 探查的超时时间,默认3秒,提高一点以应对网络不好的时候,防止脑裂
    discovery.zen.ping.timeout: 3s
    #可以适当的高点,以免数据太多调取时间超过该值产生误判。
  7. 这是一个集群中的主节点的初始列表,当节点(主节点或者数据节点)启动时使用这个列表进行探测
    discovery.zen.ping.unicast.hosts: [“host1”, “host2:port”]
    8.因 out of memory错误避免过于频繁的查询时集群假死
    ①设置es的缓存类型为Soft Reference,它的主要特点是据有较强的引用功能.只有当内存不够的时候,才进行回收这类内存,因此在内存足够的时候,它们通常不被回收.另外,这些引用对象还能保证在Java抛出OutOfMemory异常之前,被设置为null.它可以用于实现一些常用图片的缓存,实现Cache的功能,保证最大限度的使用内存而不引起OutOfMemory.在es的配置文件加上index.cache.field.type: soft即可.

②设置es最大缓存数据条数和缓存失效时间,通过设置index.cache.field.max_size: 50000来把缓存field的最大值设置为50000,设置index.cache.field.expire: 10m把过期时间设置成10分钟.

index.cache.field.max_size: 50000
index.cache.field.expire: 10m
index.cache.field.type: soft

  1. 使用head等插件监控集群信息,需要打开以下配置项:
    http.cors.enabled: true
    http.cors.allow-origin: “*”
    http.cors.allow-credentials: true

注意:ES群集也并不是JVM内存越大,搜索的越快的,它是有内存上线限制(32GB限制)。意思就是即便你有足够的内存,也尽量不要超过32G,因为它浪费了内存,降低了CPU的性能,还要让GC应对大内存。至于原因你们可以去了解一下再java中指针这个概念。当然如果你有128G,你可以再单台主机上创建两个节点,每个节点jVM分配32G,也就是说64G内存给ES的堆内存,剩下的64G给Lucene。
但是注意如果选择两台上安装两个节点你需要配置:
cluster.routing.allocation.same_shard.host:true
#这会防止同一个shard的主副本存在同一个物理机上(因为如果存在一个机器上,副本的高可用性就没有了)

谢谢对大伙有所帮助!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值