Elasticsearch 5.6 性能优化

1.关闭data结点的http功能

针对ElasticSearch集群中的所有数据节点,不用开启http服务。将其中的配置 参数这样设置:http.enabled: false,同时也不要安装head, bigdesk, marvel等监控 插件,这样保证data节点服务器只需处理创建/更新/删除/查询索引数据等操作。http功能可以在非数据节点服务器上开启,上述相关的监控插件也安装到这些服 务器上,用于监控ElasticSearch集群状态等数据信息。可以提高服务性能及数据安全

2.最小主节点数量

正常情况下,集群中的所有节点,应该对主节点的选择是一致的,即一个集群中只有一个选举出来的主节点。然而,在某些情况下,比如网络通信出现问题、主节点因为负载过大停止响应等等,就会导致重新选举主节点,此时可能会出现集群中有多个主节点的现象,即节点对集群状态的认知不一致,称之为脑裂现象。为了尽量避免此种情况的出现,可以通过discovery.zen.minimum_master_nodes来设置最少可工作的候选主节点个数,建议设置为(候选主节点数 / 2) + 1, 比如,当有三个候选主节点时,该配置项的值为(3/2)+1=2,也就是保证集群中有半数以上的候选主节点。

  候选主节点的设置方法是设置node.mater为true

3.指定集群及节点名字

Elasticsearch 默认启动的集群名字叫 elasticsearch,部署时修改默认名字,防止其它实例不小心加入集群。

Elasticsearch 会在节点启动的时候随机给它指定一个名字,这些名字是在启动的时候产生的,每次启动节点, 它都会得到一个新的名字。这会使日志变得很混乱,因为所有节点的名称都是不断变化的。因此需要手动指定每个节点 名字,方便跟踪,排查问题

4.一台服务器上最好只部署一个Node

一台物理服务器上可以启动多个Node服务器节点(通过设置不同的启动port),但一台服务器上的CPU,内存,硬盘等资源毕竟有限,从服务器性能考虑,不建议一台服务器上启动多个node节点。

5.预留一半内存给Lucene使用

一个常见的问题是配置堆太大。你有一个64 GB的机器,觉得JVM内存越大越好,想给Elasticsearch所有64 GB的内存。

 内存对于Elasticsearch来说绝对是重要的,用于更多的内存数据提供更快的操作。而且还有一个内存消耗大户-Lucene。

Lucene的设计目的是把底层OS里的数据缓存到内存中。Lucene的段是分别存储到单个文件中的,这些文件都是不会变化的,所以很利于缓存,同时操作系统也会把这些段文件缓存起来,以便更快的访问。

Lucene的性能取决于和OS的交互,如果你把所有的内存都分配给Elasticsearch,不留一点给Lucene,那你的全文检索性能会很差的。

最后标准的建议是把50%的内存给elasticsearch,剩下的50%也不会没有用处的,Lucene会很快吞噬剩下的这部分内存。

文件系统缓存是为了缓冲磁盘的IO操作。至少确保有一半机器的内存保留给操作系统,而不是JAVA JVM占用了全部内存

5.多个path.data

如果磁盘空间和IO性能是Elasticsearch的瓶颈的话,使用多个IO设备(通过设置多个path.data路径)存储shards,能够增加总的存储空间和提升IO性能。

如果您添加多个驱动器来提高一个单独索引的性能,可能帮助不大,因为 大多数节点只有一个分片和这样一个积极的驱动器。多个数据路径只是帮助如果你有许多索引/分片在单个节点上。如果需要更高级的、稳健的、灵活的配置, 可使用软磁盘阵列( software RAID )的软件,而不是多个数据路径的功能。

6.集群恢复配置

当你集群重启时,几个配置项影响你的分片恢复的表现。 首先,我们需要明白如果什么也没配置将会发生什么。

想象一下假设你有 10 个节点,每个节点只保存一个分片,这个分片是一个主分片或者是一个副本分片,或者说有一个有 5 个主分片/1 个副本分片的索引。有时你需要为整个集群做离线维护(比如,为了安装一个新的驱动程序), 当你重启你的集群,恰巧出现了 5 个节点已经启动,还有 5 个还没启动的场景。

假设其它 5 个节点出问题,或者他们根本没有收到立即重启的命令。不管什么原因,你有 5 个节点在线上,这五个节点会相互通信,选出一个 master,从而形成一个集群。 他们注意到数据不再均匀分布,因为有 5 个节点在集群中丢失了,所以他们之间会立即启动分片复制。

最后,你的其它 5 个节点打开加入了集群。这些节点会发现 它们 的数据正在被复制到其他节点,所以他们删除本地数据(因为这份数据要么是多余的,要么是过时的)。 然后整个集群重新进行平衡,因为集群的大小已经从 5 变成了 10。在整个过程中,你的节点会消耗磁盘和网络带宽,来回移动数据,因为没有更好的办法。对于有 TB 数据的大集群, 这种无用的数据传输需要 很长时间 。如果等待所有的节点重启好了,整个集群再上线,所有的本地的数据都不需要移动。

此时我们需要指定  gateway.recover_after_nodes,gateway.recover_after_nodes,gateway.recover_after_master_nodes,gateway.recover_after_data_nodes等参数,具体参照 官网本地网关配置

7.内存优化

 Elasticsearch默认堆内存为1.9 GB,对于实际应用,显然不够,不建议使用默认配置。

设置Elasticsearch的内存又两种方案,最简单的方法是设置一个环境变量为ES_HEAP_SIZE。当服务器启动时,它将读取此环境变量并相应设置内存。命令如下:

export ES_HEAP_SIZE=8g

另外一种方法则是在启动ES的时候,设置。

./bin/elasticsearch -Xmx8g -Xms8g

推荐采用第一种设置方法。

ES内存建议采用分配机器物理内存的一半,但最大不要超过32GB(原因请看 堆内存配置)。如何判断内存设置是否恰当,看ES启动日志中的:

[2017-09-28T17:07:34,334][INFO ][o.e.e.NodeEnvironment    ] [node182e] heap size [1.9gb], compressed ordinary object pointers [true]

 如果[true],则表示ok。一半超过32GB会为[false],请依次降低内存设置试试。

另外注意关闭Linux的swap!

 如果机器物理内存很大的话,可以多启动几个节点(每个32GB)

8.索引别名和零停机

Elasticsearch的API支持给索引起别名,有了别名之后可以像使用索引一样使用它。但不只是这些,一个别名可以映射多个索引,所以在需要经常指定多个索引查询的情况下,大可将所查询的索引起一个别名来查。别名也可以将索引查询的过滤条件包含在内,使用别名查询时可以查询索引的一个子集。别名应用实例:  elasticsearch-不停服务修改mapping Elasticsearch 之索引别名 alias 

9.分片和副本

根据机器数,磁盘数,索引大小等硬件环境,根据测试结果,设置最优的分片数和备份数,单个分片最好不超过10GB,定期删除不用的索引,做好冷数据的迁移。

分片数是与检索速度非常相关的的指标,如果分片数过少或过多都会导致检索比较慢。分片数过多会导致检索时打开比较多的文件别外也会导致多台服务器之间通讯。而分片数过少会导致单个分片索引过大,所以检索速度慢。一个索引会分成多个分片存储,分片数量在索引建立后不可更改。

ElasticSearch在创建索引数据时,最好指定相关的shards数量和replicas, 否则会使用服务器中的默认配置参数shards=5,replicas=1。

因为这两个属性的设置直接影响集群中索引和搜索操作的执行。假设你有足够的机器来持有碎片和副本,那么可以按如下规则设置这两个值:

1) 拥有更多的碎片可以提升索引执行能力,并允许通过机器分发一个大型的索引;

2) 拥有更多的副本能够提升搜索执行能力以及集群稳定性。

对于一个索引来说,number_of_shards只能设置一次,而number_of_replicas可以使用索引更新设置API在任何时候被增加或者减少。

这两个配置参数在配置文件的配置如下:

index.number_of_shards: 5 number_of_replicas: 1

Elastic官方文档建议:一个Node中一个索引最好不要多于三个shards.配置total_shards_per_node参数,限制每个index每个节点最多分配多少个发片.

副本数与索引的稳定性有比较大的关系,如果Node在非正常挂了,经常会导致分片丢失,为了保证这些数据的完整性,可以通过副本来解决这个问题。建议在建完索引后在执行Optimize后,马上将副本数调整过来。

10.设置合理的刷新时间

建立的索引,不会立马查到,这是为什么elasticsearch为near-real-time的原因需要配置index.refresh_interval参数,默认是1s。

这迫使Elasticsearch集群每秒创建一个新的 segment (可以理解为Lucene 的索引文件)。增加这个值,例如30s,60s,可以允许更大的segment写入,减后以后的segment合并压力。

部署拓扑示意图

Master Node建议至少部署3个

Coordinating only Node根据客户端查询量计算,不指定此节点会随机集群内所有节点。。

Data Node根据业务存储数据量估算

猜你喜欢

转载自blog.csdn.net/JiShuiSanQianLi/article/details/87685930