1.集群优化(运维优化)
节点
- 相同角色节点,避免使用较大差异的配置
- 避免使用 “超大杯”服务器(SS服务器:Super Server),128核心,1T的内存,2T的硬盘。不仅会赵成资源浪费,而且可能会降低性能。
- 等量的配置,使用较少的物理机好于使用较多的虚拟机,5台4核16G内存的物理机,10台甚至11台2核8G 的虚拟机,虚拟机本身消耗性能,还涉及数据安全的问题。
- 避免在同一台服务器上部署多个节点。
内存:
- 根据业务量的不同,对内存的需求也不一样,一般生产环境建议不要少于16G的内存,尽量不要超过64G。ES本身非常依赖内存,并且ES对内存消耗比较大,内存对ES的重要性是高于CPU,所以即使你的业务数据量不大,为了保证服务的稳定性。在满足业务的前提下,我们仍要考虑有不少于20% 的冗余性能。一般来说。按照百万级、千万级、亿级数据量的索引,我们分别为每个节点分配16G、32G、64G。** 如果性能不足,最好是横向扩容**。
磁盘:
- 对于ES来说,磁盘可能是最重要的了,以为数据都是存贮在磁盘上的,当然这里说的磁盘指的是磁盘的性能。磁盘性能往往是计算机性能的瓶颈,木桶效应的最短板。ES应用可能要面临不间断,大量的数据读写。生产环境可以把界定啊冷热分离,热节点使用SSD做存储,可以大幅度提高系统的性能;冷数据存储在机械硬盘中,降低成本。关于磁盘阵列使用raid0
cpu:
- cpu 对计算机而言可能是最重要的硬件,对于ES来说他不是最重要的,就是说提升CPU的性能不想提升内存和硬盘收益来的那么直接。服务器的CPU不太需要单核性能,需要的是更多的核心数和线程数,这意味着更高的并发处理能力。
网络:
- ES天生自带分布式属性,并且ES的分布式是基于对等网络,节点与节点之间的通信十分频繁,延迟对于ES的用户体验是致命的,低延迟的网络是非常必要的,因此使用跨地域的多个数据中心方案是不可取的。ES可以容忍集群跨多个机房,可以有多个内网,支持夸AZ部署,但是不能接受跨多个地域构建集群,hdfs+Azure az共享data。一旦发生问题,集群直接GG,维护这样的集群额外成本可能远大于它带来的收益。
集群规划:
- 在集群搭建之前,首先你要考虑清楚,你的ES cluster 的使用目的是什么,主要应用于那些场景,比如是用来存储日志,或者是站内搜索,或者是用于数据的聚合分析,针对不同的应用场景,应该制定不同的优化方案。
- 集群需要多少种配置(内存性、IO、运算性),每一种配置需要多少数量,通常需要和产品运营和运维测试商定。 视业务量和服务器承载能力而定,并且留有一定余量。
- 一个合理的ES 集群配置应该不少于5台节点,3台Master节点,避免脑裂时无法选举出新的master节点的情况,另外可能还需要其他一些单独的节点,比如ELK系统中的kibana、Logstash,ES 节点不要部署其他任何东西除了beats。
集群搭建:
- 重要节点的配置:
- 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 是否是数据节点
- 其他配置(默认是比较合理的,最好不要改的配置)(不充分了解,最好不要改)
- 比如 max_result_window:10000 默认每一页最多10000条数据,为了限制内存的开销。
deep paging 解决方案=>1.scoll;2.search-after;ES 没有银弹的,不可能通过修改一向,或者几项配置一下子提升性能的。
- 比如 max_result_window:10000 默认每一页最多10000条数据,为了限制内存的开销。
- JVM:
- jvm heap默认配置:7.6.2版本默认1GB,这个值是比较小的。
- jvm heap 大小不要超过物理内存的50%,即便你的物理内存特别大,你的堆内存heap最大也不要超过34GB-2GB, 物理内存16GB-64GB(compressed OOP),物理内存32G 16G fielddata 分页 大量使用堆内存,ES基于Lucene,它依赖os cache。
- 如何修改堆内存
- ES启动时 ES_JAVA_OPTS=”-Xms4g-Xmx4g” ./bin/elasticsearch
- jvm.options
- ES_HEAP_SIZE: 环境变量
- 重要节点的配置: