ES 集群优化


1.集群优化(运维优化)

  1. 节点

    1. 相同角色节点,避免使用较大差异的配置
    2. 避免使用 “超大杯”服务器(SS服务器:Super Server),128核心,1T的内存,2T的硬盘。不仅会赵成资源浪费,而且可能会降低性能。
    3. 等量的配置,使用较少的物理机好于使用较多的虚拟机,5台4核16G内存的物理机,10台甚至11台2核8G 的虚拟机,虚拟机本身消耗性能,还涉及数据安全的问题。
    4. 避免在同一台服务器上部署多个节点。
  2. 内存

    1. 根据业务量的不同,对内存的需求也不一样,一般生产环境建议不要少于16G的内存,尽量不要超过64G。ES本身非常依赖内存,并且ES对内存消耗比较大,内存对ES的重要性是高于CPU,所以即使你的业务数据量不大,为了保证服务的稳定性。在满足业务的前提下,我们仍要考虑有不少于20% 的冗余性能。一般来说。按照百万级、千万级、亿级数据量的索引,我们分别为每个节点分配16G、32G、64G。** 如果性能不足,最好是横向扩容**。
  3. 磁盘

    1. 对于ES来说,磁盘可能是最重要的了,以为数据都是存贮在磁盘上的,当然这里说的磁盘指的是磁盘的性能。磁盘性能往往是计算机性能的瓶颈,木桶效应的最短板。ES应用可能要面临不间断,大量的数据读写。生产环境可以把界定啊冷热分离,热节点使用SSD做存储,可以大幅度提高系统的性能;冷数据存储在机械硬盘中,降低成本。关于磁盘阵列使用raid0
  4. cpu:

    1. cpu 对计算机而言可能是最重要的硬件,对于ES来说他不是最重要的,就是说提升CPU的性能不想提升内存和硬盘收益来的那么直接。服务器的CPU不太需要单核性能,需要的是更多的核心数和线程数,这意味着更高的并发处理能力。
  5. 网络:

    1. ES天生自带分布式属性,并且ES的分布式是基于对等网络,节点与节点之间的通信十分频繁,延迟对于ES的用户体验是致命的,低延迟的网络是非常必要的,因此使用跨地域的多个数据中心方案是不可取的。ES可以容忍集群跨多个机房,可以有多个内网,支持夸AZ部署,但是不能接受跨多个地域构建集群,hdfs+Azure az共享data。一旦发生问题,集群直接GG,维护这样的集群额外成本可能远大于它带来的收益。
  6. 集群规划:

    1. 在集群搭建之前,首先你要考虑清楚,你的ES cluster 的使用目的是什么,主要应用于那些场景,比如是用来存储日志,或者是站内搜索,或者是用于数据的聚合分析,针对不同的应用场景,应该制定不同的优化方案。
    2. 集群需要多少种配置(内存性、IO、运算性),每一种配置需要多少数量,通常需要和产品运营和运维测试商定。 视业务量和服务器承载能力而定,并且留有一定余量。
    3. 一个合理的ES 集群配置应该不少于5台节点,3台Master节点,避免脑裂时无法选举出新的master节点的情况,另外可能还需要其他一些单独的节点,比如ELK系统中的kibana、Logstash,ES 节点不要部署其他任何东西除了beats。
  7. 集群搭建:

    1. 重要节点的配置:
      • cluster.name: 集群的名字
      • node.name:节点名字
      • path.data:默认数据的存储位置,不修改,ES_PATH/data,推荐设置到安装目录之外 /var/log
      • path.logs: 如 /var/log/elasticsearch ,别忘了改目录权限(读写)
      • bootstrap.memory.lock:内存锁,生产环境一般无脑设成true,禁用swap空间,如果内存不足的是否,ES会使用Swap空间,性能是非常差。内存小的话,引导检查过不去。
      • network.host:当前节点绑定IP地址
      • http.port:服务端口号,用来 REST api 服务用的。[9200-9299)
      • transport.port :集群中多个节点通信的端口号。节点转发通讯端口[9300-9399)
      • discovery.send_hosts: [“localhost:9200”,”localhost:9201”] 候选节点的IP地址,当前master节点和候选节点的IP地址。
      • cluster.initial_master_nodes: 集群初始化的时候,手动配置一个master节点,可以是IP地址,也可以是节点名称。
      • http.cors.enabled:true
      • http.cors.allow-origin:跳板机的地址
      • node.master:true 是否是候选节点
      • node.data:false 是否是数据节点
    2. 其他配置(默认是比较合理的,最好不要改的配置)(不充分了解,最好不要改)
      • 比如 max_result_window:10000 默认每一页最多10000条数据,为了限制内存的开销。
        deep paging 解决方案=>1.scoll;2.search-after;ES 没有银弹的,不可能通过修改一向,或者几项配置一下子提升性能的。
    3. JVM:
      • jvm heap默认配置:7.6.2版本默认1GB,这个值是比较小的。
      • jvm heap 大小不要超过物理内存的50%,即便你的物理内存特别大,你的堆内存heap最大也不要超过34GB-2GB, 物理内存16GB-64GB(compressed OOP),物理内存32G 16G fielddata 分页 大量使用堆内存,ES基于Lucene,它依赖os cache。
    4. 如何修改堆内存
      • ES启动时 ES_JAVA_OPTS=”-Xms4g-Xmx4g” ./bin/elasticsearch
      • jvm.options
      • ES_HEAP_SIZE: 环境变量

文章作者: TheMoonLight
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 TheMoonLight !
评论
  目录