ES特定场景性能优化

1. Overview

本文主要介绍一下Elasticsearch(后文简称ES)做相关基准测试的流程,及分享一些我们做过的一些测试结论。

简要说明下我们使用情况:

宽表的用户画像OLAP分析场景,集群规模200节点,数据量30T左右全热数据,24h更新及查询,总数据量1500亿,日更新200亿。

2. 基准测试

2.1 测试流程

由于 ES 是近乎线性扩展的分布式系统,所以对上述需求可以总结成同一个测试模式:

​ 1. 使用和线上集群相同硬件配置的服务器搭建一个单节点集群。

​ 2. 使用和线上集群相同的映射创建一个 0 副本,1 分片的测试索引。

​ 3. 使用和线上集群相同的数据写入进行压测。

​ 4. 观察写入性能,或者运行查询请求观察搜索聚合性能。

​ 5. 持续压测数小时,使用监控系统记录 eps、requesttime、fielddata cache、GC count、Throughput、latency、Heap used 等关键数据。

测试完成后,根据监控系统数据,确定单分片的性能拐点,或者适合自己预期值的临界点。这个数据,就是一个基准数据。之后的扩容计划,都可以以这个基准单位进行。

2.2 集群拓扑

单数据节点测试环境:

ES集群:

1 data node(内存:31g,SSD)(1台物理机)

1 client node

3 master node

集群测试环境:

ES集群:

12 data node(内存:31g,SSD)(6台物理机)

1 client node

3 master node

集群部署拓扑结构:(master、data、client分离部署,监控集群独立)

部署拓扑结构

2.3 测试工具

Elasticsearch:7.3.x

ESRally: 1.0.3

2.3.1 具体操作

esrally --track=xxx_test --challenge=append-no-conflicts-index-only --target-hosts=xx.xx.xx.xx:9200 --pipeline=benchmark-only --cluster-health=yellow --client-options="timeout:120"

在这里插入图片描述

压测对比:

esrally compare --baseline=20180228T085405Z --contender=20180228T100018Z

在这里插入图片描述

绿色:对比测试指标比基准测试数据优

红色:对比测试指标比基准测试数据差

2.3.2 参数测试优化

index.translog.flush_threshold_size

调优值:[512m,1g,2g,4g,6g]

基准参数:

index.refresh_interval: 60s
indices.memory.index_buffer_size: 10%
Processors: 16
Bulk Size: 2000
......

对应的参数测试3-5次,以自己关注的指标取均值

例如我们重点关注Index的吞吐量和性能,关注指标以Median Throughput(docs/s)、99th percentile latency(ms)为基准

在这里插入图片描述

依据此方式选取最优值

3、测试过的部分参数

3.1 参数及说明

类型 参数 默认值 调整值 说明
refresh_interval 1s 60s
index.translog.flush_threshold_size 512mb 2048mb
index.translog.sync_interval 5s 30s
index.translog.durability request async
indices.memory.index_buffer_size 10% 20%
indices.queries.cache.size 10% 20%
thread_pool.write.queue_size 200 500
index.merge.scheduler.max_thread_count Math.max(1, Math.min(4, Runtime.getRuntime().availableProcessors() / 2)) 4
index.merge.policy.floor_segment 2mb 2mb
index.merge.policy.max_merge_at_once 10 15
index.merge.policy.max_merged_segment 5gb 3gb
index.merge.policy.segments_per_tier 10 15
index.merge.policy.expunge_deletes_allowed 10 15
index.codec default(lz4) default
Processors 20 单物理机多节点需要设置
Shards per node 3 单个node适合的shard数
GC设置 -XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+UseG1GC
-XX:InitiatingHeapOccupancyPercent=70
-XX:G1HeapWastePercent=10
-XX:G1MixedGCCountTarget=32
-XX:ParallelGCThreads=20
-XX:ConcGCThreads=5
FullGC次数和时间较少一半
Bulk size 2000

段合并的底层控制

3.2 mapping结构优化

1、Keyword类型的值,替换给Int类型枚举,性能收益很小

2、Nested的嵌套存储方式,随着nested嵌套数量的增多,update和search性能持续下降

3、Parent-Child的嵌套存储方式,单独update 父文档和子文档,吞吐量提升30%-50%以上,父子文档联合查询性能下降60%-80%左右

4. 总结

本文主要针对ES集群的一些针对特定场景的参数优化做了简略的介绍,具体场景需求不一样,优化目标也不一样,不一定能完全复用到其他场景,优化思路供参考。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章