本文主要介绍一下Elasticsearch(后文简称ES)做相关基准测试的流程,及分享一些我们做过的一些测试结论。
简要说明下我们使用情况:
宽表的用户画像OLAP分析场景,集群规模200节点,数据量30T左右全热数据,24h更新及查询,总数据量1500亿,日更新200亿。
由于 ES 是近乎线性扩展的分布式系统,所以对上述需求可以总结成同一个测试模式:
1. 使用和线上集群相同硬件配置的服务器搭建一个单节点集群。
2. 使用和线上集群相同的映射创建一个 0 副本,1 分片的测试索引。
3. 使用和线上集群相同的数据写入进行压测。
4. 观察写入性能,或者运行查询请求观察搜索聚合性能。
5. 持续压测数小时,使用监控系统记录 eps、requesttime、fielddata cache、GC count、Throughput、latency、Heap used 等关键数据。
测试完成后,根据监控系统数据,确定单分片的性能拐点,或者适合自己预期值的临界点。这个数据,就是一个基准数据。之后的扩容计划,都可以以这个基准单位进行。
单数据节点测试环境:
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分离部署,监控集群独立)
Elasticsearch:7.3.x
ESRally: 1.0.3
压测对比:
esrally compare --baseline=20180228T085405Z --contender=20180228T100018Z绿色:对比测试指标比基准测试数据优
红色:对比测试指标比基准测试数据差
调优值:[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)为基准
依据此方式选取最优值
段合并的底层控制
1、Keyword类型的值,替换给Int类型枚举,性能收益很小
2、Nested的嵌套存储方式,随着nested嵌套数量的增多,update和search性能持续下降
3、Parent-Child的嵌套存储方式,单独update 父文档和子文档,吞吐量提升30%-50%以上,父子文档联合查询性能下降60%-80%左右
本文主要针对ES集群的一些针对特定场景的参数优化做了简略的介绍,具体场景需求不一样,优化目标也不一样,不一定能完全复用到其他场景,优化思路供参考。