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集群的一些针对特定场景的参数优化做了简略的介绍,具体场景需求不一样,优化目标也不一样,不一定能完全复用到其他场景,优化思路供参考。