ElasticSearch性能调优分析

ES的默认设置是综合考虑数据可靠性、搜索实时性、写入速度等因素的,应当根据不同的业务场景进行合理的调整。例如:通过ES查询组合标签下的用户数据场景,不需要非常高的查询效率和不存在高并发的查询请求,但是往往需要周期性地全量或大批量更新用户标签属性数据,这对写入/更新的效率有较高要求。

一、ES部署架构调整

1)V1版本

V1架构中所有的节点充当数据节点或Master节点(通过N/2+1个节点选举产生)角色。

批量数据写入压力测试(总共插入15798265条记录,耗时1h),压测结果如下:

2)V2版本

V2架构由1MasterNode(主节点)+1CoodinatorNode(协调节点)+3DataNode(数据节点)组成。

批量数据写入压力测试(总共插入94697458条记录,耗时3h),压测结果如下:

总结:从压测的效果看,V2架构写入的效率比V1架构的写入效率提高了一倍,V2架构相比V1架构更加协调,V1架构参数设置不合理可能会出现脑裂现象。当然,除了架构上的改变,还有配置项的优化也非常重要。

二、索引过程分析

数据写入过程:

Lucene把每次生成的倒排索引叫做一个段segment,然后另外使用一个commit文件记录索引内所有的segment。

数据写入-->写入ES内存,同时记录到translog-->生成倒排索引分片segment-->将内存中的segment同步到文件系统缓存中,然后再刷写到磁盘。

实时性:

由于内存中的索引分片先同步到文件系统缓存再刷写到磁盘,检索时直接检索文件系统缓存,内存刷写到文件系统缓存默认设置为1秒间隔,对于大多数应用来说,几乎相当于实时可搜索。

数据一致性:

由于ES把数据写入内存的同时,还另外记录了一个translog日志,如果在这期间故障发生ES会从commit位置开始,恢复整个translog文件中的记录,保证数据一致性,等segment刷到磁盘且commit文件进行更新时,translog文件才清空(flush)。

translog容灾:

ES通过translog保证数据一致性,为了保证不丢失数据,每次index、bulk、delete、update完成时,一定触发刷新translog到磁盘上,才给请求返回200状态码,这提高了数据安全性的同时也降低了一点性能。

三、性能优化

1、增加1-2台服务器,用于负载均衡节点;

node.master: false node.data: true

该node服务器只作为数据节点,只用于数据存储和数据查询。

node.master: true node.data: false

该node服务器只作为主节点,不存储任何索引数据,用于协调各种创建索引请求或者查询请求,将这些请求合理分发到相关的node服务器上。

node.master: false node.data: false

该node服务器不会被选作主节点,也不会存储任何索引数据,主要用于查询负载均衡。

2、关闭data节点服务器中的http功能

ES集群中的所有数据节点,不用开启http服务,将其中的配置参数修改为http.enabled: false,同时不安装head、bigdesk、marvel等监控插件,data节点只需要处理创建/更新/删除/查询索引数据等操作。

3、一台服务器上最好只部署一个Node

4、设置合理的分片(shard)数量和副本(replica)数量

index.number_of_shards: 5 index.number_of_replicas: 1,ES默认分片数量为5副本数量为1,每个分片存储数据量约20~40GB,因此需要根据实际数据量来确定分片数,并且确保同一索引的每个分片落在不同的节点上,分片数在索引创建后一次生成后续不可更改,而副本数则可以后续更改。

5、副本数设为0

批量导入索引数据时,可设置副本数为0,等全部索引数据创建完成后再修改副本数。

6、设置索引刷新频率

index.refresh_interval: 120s,索引的刷新频率,默认1秒,太小会造成索引频繁刷新,新的数据写入就慢,可根据实际应用场景设置。

7、锁定内存或关闭swap

当JVM开始写入交换空间时(swapping),ES性能下降,应该确保它不会写入交换空间,可通过设置参数bootstrap.mlockall: true锁定内存或者关闭Linux的swap机制。

8、设置预加载fielddata

9、设置tcp传输时进行数据压缩

10、设置刷新到磁盘的日志量

11、设置参与选举master节点的节点数,防止脑裂

12、调整集群之间节点通信discovery参数

默认超时时间较小,适当把参数调大,避免集群GC时间较长导致节点的失联。

13、关闭广播自动发现节点

14、设置segment合并的限流值

默认情况下,归并线程的限速配置indices.store.throttle.max_bytes_per_sec为20MB,对于写入量较大,磁盘转速较高,可适当调大。

indices.store.throttle.type: merge

indices.store.throttle.max_bytes_per_sec: 100mb

15、调整ES_HEAP_SIZE大小

ES默认堆内存为1GB,在ES启动脚本上设置export ES_HEAP_SIZE=10g或者启动时指定-Xmx10g和-Xms10g。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180722G0ICFC00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券