ES特定场景性能优化

    技术2022-07-13  71

    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_interval1s60sindex.translog.flush_threshold_size512mb2048mbindex.translog.sync_interval5s30sindex.translog.durabilityrequestasyncindices.memory.index_buffer_size10 %indices.queries.cache.size10 %thread_pool.write.queue_size200500index.merge.scheduler.max_thread_countMath.max(1, Math.min(4, Runtime.getRuntime().availableProcessors() / 2))4index.merge.policy.floor_segment2mb2mbindex.merge.policy.max_merge_at_once1015index.merge.policy.max_merged_segment5gb3gbindex.merge.policy.segments_per_tier1015index.merge.policy.expunge_deletes_allowed1015index.codecdefault(lz4)defaultProcessors20单物理机多节点需要设置Shards per node3单个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=5FullGC次数和时间较少一半Bulk size2000

    段合并的底层控制

    3.2 mapping结构优化

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

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

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

    4. 总结

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

    Processed: 0.019, SQL: 9