一、使用官方的log类型,通过改造challenge来实现parallel的功能,实现对同一个index进行读写混合的测试需求
{ "name": "append-no-conflicts", "description": "Indexes the whole document corpus using Elasticsearch default settings. We only adjust the number of replicas as we benchmark a single node cluster and Rally will only start the benchmark if the cluster turns green. Document ids are unique so all index operations are append only. After that a couple of queries are run.", "default": true, "schedule": [ { "operation": "delete-index" }, { "operation": { "operation-type": "create-index", "settings": {{index_settings | default({}) | tojson}} } }, { "name": "check-cluster-health", "operation": { "operation-type": "cluster-health", "index": "logs-*", "request-params": { "wait_for_status": "{{cluster_health | default('green')}}", "wait_for_no_relocating_shards": "true" }, "retry-until-success": true } }, { "parallel": { "completed-by": "index-append", #表示当index-append完成时结束并发 "tasks": [ { "operation": "index-append", "warmup-time-period": 240, "clients": {{bulk_indexing_clients | default(8)}} }, { "operation": "default", "clients": 1, "warmup-iterations": 500, "iterations": 100, "target-throughput": 8 }, { "operation": "term", "clients": 1, "warmup-iterations": 500, "iterations": 100, "target-throughput": 50 }, { "operation": "range", "clients": 1, "warmup-iterations": 100, "iterations": 100, "target-throughput": 1 }, { "operation": "hourly_agg", "clients": 1, "warmup-iterations": 100, "iterations": 100, "target-throughput": 0.2 }, { "operation": "scroll", "clients": 1, "warmup-iterations": 100, "iterations": 200, "#COMMENT": "Throughput is considered per request. So we issue one scroll request per second which will retrieve 25 pages", "target-throughput": 1 } ] } } ] },
二、根据实际业务日志来生成data和track使性能测试结果更加贴合实际业务
1、从已有集群中的数据自动生成log和track
esrally版本要求2.0以上
参考:https://esrally.readthedocs.io/en/2.1.0/adding_tracks.html?highlight=custom
esrally create-track --track=acme --target-hosts=127.0.0.1:9200 --indices="products,companies" --output-path=~/tracks
最终生成效果:
airkafka_pm02_2021-02-01-documents-1k.json:xxx-1k表示用于test_mode模式,数据量较小,用于测试
airkafka_pm02_2021-02-01.json:是对应log的index
airkafka_pm02_2021-02-01-documents.json.offset:log日志偏移量
{ "version": 2, "description": "Tracker-generated track for nsh", "indices": [ { "name": "airkafka_pm02_2021-02-12", "body": "airkafka_pm02_2021-02-12.json", #可以改成track.json所在目录下的其他自定义的index "types": ["doc"] #由于es7以上版本不支持type字段,因此生成的track.json没有该字段。如果是对es7以下版本进行测试,需要增加该字段 }, { "name": "airkafka_pm02_2021-02-01", "body": "airkafka_pm02_2021-02-12.json", "types": ["doc"] } ], "corpora": [ { "name": "nsh", "target-type": "doc", #该字段对应的是bulk插入的_type字段,必须要指定,不然会报type missing的错误 "documents": [ { "target-index": "airkafka_pm02_2021-02-12", "source-file": "airkafka_pm02_2021-02-12-documents.json.bz2", "document-count": 14960567, "compressed-bytes": 814346714, "uncompressed-bytes": 12138377222 }, { "target-index": "airkafka_pm02_2021-02-01", "source-file": "airkafka_pm02_2021-02-01-documents.json.bz2", "document-count": 24000503, #需要跟实际的documents文件里的数量一致 "compressed-bytes": 1296215463, "uncompressed-bytes": 19551041674 } ] } ], "operations": [ #自动生成的track.json里不会区分operatin和challenge,可以自己拆分定义,按照这个模板来就行 { "name": "index-append", "operation-type": "bulk", "bulk-size": {{bulk_size | default(5000)}}, "ingest-percentage": 100, "corpora": "nsh" #要改成上面corpora的name }, { "name": "default", #name可以改成其他自定义的 "operation-type": "search", #operation-type只支持search "index": "airkafka_pm02_2021-*", "body": { "query": { "match_all": {} } } }, { "name": "term", "operation-type": "search", "index": "airkafka_pm02_2021-*", #index也可以自定义 "body": { #body里的query语句可以根据业务需求自定义 "query": { "term": { "log_id.raw": { "value": "gm_client_app_profile_log" } } } } }, { "name": "range", "operation-type": "search", "index": "airkafka_pm02_2021-*", "body": { "query": { "range": { "deveice_level": { "gte": 0, "lt": 3 } } } } }, { "name": "hourly_agg", "operation-type": "search", "index": "airkafka_pm02_2021-*", "body": { "size": 0, "aggs": { "by_hour": { "date_histogram": { "field": "@timestamp", "interval": "hour" } } } } }, { "name": "scroll", "operation-type": "search", "index": "airkafka_pm02_2021-*", "pages": 25, "results-per-page": 1000, "body": { "query": { "match_all": {} } } } ], "challenges": [ #可以自定义多个不同的challenge,然后命令行里指定需要运行的challenge { "name": "append-no-conflicts", "description": "Indexes the whole document corpus using Elasticsearch default settings. We only adjust the number of replicas as we benchmark a single node cluster and Rally will only start the benchmark if the cluster turns green. Document ids are unique so all index operations are append only. After that a couple of queries are run.", "default": true, "schedule": [ { "operation": "delete-index" }, { "operation": { "operation-type": "create-index", "settings": {} } }, { "name": "check-cluster-health", "operation": { "operation-type": "cluster-health", "index": "airkafka_pm02_2021-*", "request-params": { "wait_for_status": "green", "wait_for_no_relocating_shards": "true" }, "retry-until-success": true } }, { "parallel": { "completed-by": "index-append", "tasks": [ { "operation": "index-append", "warmup-time-period": 240, "clients": {{bulk_indexing_clients | default(8)}} }, { "operation": "default", "clients": 1, "warmup-iterations": 500, "iterations": 100, "target-throughput": 8 #限定最大的tps,类似于jmeter里的目标加压。此时service time和letency的大小不一致,service time小于letency,真正具有参考意义的是service time }, { "operation": "term", "clients": 1, "warmup-iterations": 500, "iterations": 100, "target-throughput": 50 }, { "operation": "range", "clients": 1, "warmup-iterations": 100, "iterations": 100, "target-throughput": 1 }, { "operation": "hourly_agg", "clients": 1, "warmup-iterations": 100, "iterations": 100, "target-throughput": 0.2 }, { "operation": "scroll", "clients": 1, "warmup-iterations": 100, "iterations": 200, "#COMMENT": "Throughput is considered per request. So we issue one scroll request per second which will retrieve 25 pages", "target-throughput": 1 } ] } } ] }, { "name": "append-no-conflicts-index-only", "description": "Indexes the whole document corpus using Elasticsearch default settings. We only adjust the number of replicas as we benchmark a single node cluster and Rally will only start the benchmark if the cluster turns green. Document ids are unique so all index operations are append only.", "schedule": [ { "operation": "delete-index" }, { "operation": { "operation-type": "create-index", "settings": {} } }, { "name": "check-cluster-health", "operation": { "operation-type": "cluster-health", "index": "airkafka_pm02_2021-*", "request-params": { "wait_for_status": "green", "wait_for_no_relocating_shards": "true" }, "retry-until-success": true } }, { "operation": "index-append", "warmup-time-period": 240, "clients": 8 }, { "name": "refresh-after-index", "operation": "refresh" }, { "operation": { "operation-type": "force-merge", "request-timeout": 7200 } }, { "name": "refresh-after-force-merge", "operation": "refresh" }, { "name": "wait-until-merges-finish", "operation": { "operation-type": "index-stats", "index": "_all", "condition": { "path": "_all.total.merges.current", "expected-value": 0 }, "retry-until-success": true, "include-in-reporting": false } } ] } ] }
"target-throughput": 50 #不指定则表示esrally尽最大可能发送消息,即测最大的性能,指定则是按照指定的tps发送。注意,如果指定,service time和letency是不一样的,letency要大于service time,实际的es性能需要看service time
在自定义track的时候出现的一些错误以及解决办法
1、https://discuss.elastic.co/t/esrally-got-the-benchmark-ended-already-during-warmup-when-running-custom-track/186076/3
2、--on-error=abort 打开该开关,esrally将会在第一次出错时就停止,同时记录错误日志,建议调试tracks打开
3、在调试track的时候,把bulk_size设置小一点,这样error时同样的日志会比较少,方便查看完整日志
4、service time和letency的区别