esrally(elasticsearch压测工具)介绍(一)
一、介绍
esrally是elastic search官方用于对ES集群集群进行压测的工具,可使用esrally构建不同版本集群、不同参数和数据进行压力测试,并且支持对结果进行比较。也支持对远程集群压测。
rally:(汽车,摩托车等)拉力赛,所以相关属于也与拉力赛相关。
- track:赛道;指压测用到的样本数据和压测策略。
- car: 赛车;指被压测不同类型的es实例(执行压测方案)。可通过:esrally list cars 查看
Available cars: Name Type Description ----------------------- ------ -------------------------------------- 16gheap car Sets the Java heap to 16GB 1gheap car Sets the Java heap to 1GB 24gheap car Sets the Java heap to 24GB 2gheap car Sets the Java heap to 2GB 4gheap car Sets the Java heap to 4GB 8gheap car Sets the Java heap to 8GB defaults car Sets the Java heap to 1GB basic-license mixin Basic License debug-non-safepoints mixin More accurate CPU profiles ea mixin Enables Java assertions fp mixin Preserves frame pointers g1gc mixin Enables the G1 garbage collector parallelgc mixin Enables the Parallel garbage collector trial-license mixin Trial License unpooled mixin Enables Netty's unpooled allocator x-pack-ml mixin X-Pack Machine Learning x-pack-monitoring-http mixin X-Pack Monitoring (HTTP exporter) x-pack-monitoring-local mixin X-Pack Monitoring (local exporter) x-pack-security mixin X-Pack Security zgc mixin Enables the ZGC garbage collector
- pipline: 管道;可通过esrally list piplines 查看
Available pipelines: Name Description ----------------------- --------------------------------------------------------------------------------------------- from-sources-complete Builds and provisions Elasticsearch, runs a benchmark and reports results. from-sources-skip-build Provisions Elasticsearch (skips the build), runs a benchmark and reports results. from-distribution Downloads an Elasticsearch distribution, provisions it, runs a benchmark and reports results. benchmark-only Assumes an already running Elasticsearch instance, runs a benchmark and reports results
- from-sources-complete :表示从源代码构建ES, --revision参数可以指定一个ES的修订版本,默认为最新版本。
- rom-sources-skip-build :表示如果之前已经通过源码构建过一次相同版本的ES了,那么本次将不再进行构建,这样可以节省测试的时间
- from-distribution:esrally将下载正式的ES发行版来进行测试, --distribution-version 参数可以指定ES版本,最低支持1.7.5
- benchmark-only :将对已有的ES集群进行压测,--target-hosts参数可以指定ES集群地址
- race:比赛记录;指每次压测记录,如果没有指定track,则默认使用geonames track进行测试
Recent races: Race ID Race Timestamp Track Track Parameters Challenge Car User Tags Track Revision Team Revision ------------------------------------ ---------------- -------- ------------------ ------------------- -------- ----------- ---------------- --------------- 5af141b9-c910-4021-b4fc-beb4c3fc16aa 20220614T072535Z geonames append-no-conflicts external 1415f9ca-1008-4307-8763-cdbc9640d304 20220614T072211Z geonames append-no-conflicts external 6622623 5bfe97af-2c60-4a0f-a568-0e5f087f6b61 20220614T032008Z geonames append-no-conflicts external 6622623 46ad39e9-0959-4813-804d-4f95407d886d 20220613T072708Z geonames append-no-conflicts external 6622623 06324f7b-ab1c-4d81-b06b-45e537909374 20220613T070715Z geonames append-no-conflicts external 6622623
- 备注:可以根据不同race进行比较,例如:
esrally compare --baseline= 46ad39e9-0959-4813-804d-4f95407d886d --contender=06324f7b-ab1c-4d81-b06b-45e537909374
二、安装
-
Python3环境:确保环境存在
-
esrally安装:
- 安装虚拟环境:(后一个venv为虚拟环境文件夹)
python3 -m venv venv
- 安装esrally
source venv/bin/activate
(venv): pip install esrally
-
其他安装:
- 压测本地已经存在ES环境,即: --pipeline=benchmark-only --target-hosts=http://目标ES地址:目标端口,不需要安装java jdk环境
- 本地新建不同ES版本环境,即:piplines里其他三种pipline方式,安装java。
三、配置
-
创建配置:
(venv): esrally configure
- 备注:配置完成后,会覆盖写esrally配置文件 ~/.rally/rally.ini
-
压测数据于方案track介绍:
- 所在目录(默认): ~/.rally/benchmarks/tracks/default/
- esally自带的track:
(venv) [binger@test-node-21 .rally]$ ll ~/.rally/benchmarks/tracks/default/ total 8 -rwxr-xr-x 1 yangshujun docker 2217 Jun 13 14:15 download.sh drwxr-xr-x 2 yangshujun docker 91 Jun 14 11:20 eql drwxr-xr-x 5 yangshujun docker 164 Jun 14 17:18 geonames drwxr-xr-x 4 yangshujun docker 112 Jun 13 14:15 geopoint drwxr-xr-x 5 yangshujun docker 126 Jun 13 14:15 geopointshape drwxr-xr-x 5 yangshujun docker 126 Jun 14 11:20 geoshape drwxr-xr-x 5 yangshujun docker 222 Jun 14 11:20 http_logs drwxr-xr-x 4 yangshujun docker 95 Jun 14 11:20 metricbeat drwxr-xr-x 4 yangshujun docker 180 Jun 13 14:15 nested drwxr-xr-x 5 yangshujun docker 149 Jun 14 11:20 noaa drwxr-xr-x 5 yangshujun docker 142 Jun 14 11:20 nyc_taxis drwxr-xr-x 4 yangshujun docker 112 Jun 13 14:15 percolator drwxr-xr-x 4 yangshujun docker 128 Jun 13 14:15 pmc -rw-r--r-- 1 yangshujun docker 2896 Jun 13 14:15 README.md drwxr-xr-x 4 yangshujun docker 144 Jun 13 14:15 so
1. track组成(以default为例)
(venv) [binger@test-node-21 .rally]$ tree ~/.rally/benchmarks/tracks/default/geonames/ /home/binger/.rally/benchmarks/tracks/default/geonames/ ├── challenges │ ├── default.json ├── files.txt ├── index.json ├── operations │ └── default.json ├── README.md ├── terms.txt ├── track.json └── track.py
2. track.json定义压测方案相关
-
- operations定义了压测操作细则,包含:索引数据、term查询,range查询,聚合查询...
- challenges定义详细的压测方案
3. 离线数据集下载:
在使用esrally进行比赛(压测)时,默认会根据赛道(track)配置 ~/.rally/benchmarks/tracks/default/geonames/track.json (如下)中“base-url”、“source-file”构建下载数据。下载数据较慢,可提前下载好,置于 ~/.rally/benchmarks/data/geonames 目录下。
或者:我们在elastic官网github上可以看到esrally的数据集相关描述 https://github.com/elastic/rally-tracks,通过rally-track/download.sh 中,下载
{% import "rally.helpers" as rally with context %} { "version": 2, "description": "POIs from Geonames", "data-url": "http://benchmarks.elasticsearch.org.s3.amazonaws.com/corpora/geonames", "indices": [ { "name": "geonames", "body": "index.json" } ], "corpora": [ { "name": "geonames", "base-url": "https://rally-tracks.elastic.co/geonames", "documents": [ { "source-file": "documents-2.json.bz2", "document-count": 11396503, "compressed-bytes": 265208777, "uncompressed-bytes": 3547613828 } ] } ], "operations": [ {{ rally.collect(parts="operations/*.json") }} ], "challenges": [ {{ rally.collect(parts="challenges/*.json") }} ] }
三、进行压测
-
压测命令:
esrally race --pipeline=benchmark-only --target-hosts=http://目标地址:目标端口 --track=geonames --challenge=append-no-conflicts --offline --include-tasks="type:bulk"
- --pipline
- --target-hosts: 目标集群地址
- --track:赛道(默认geonames)
- --challenge:track默认json配置中“challenges”包含:"append-no-conflicts"、"append-no-conflicts-index-only"、"append-fast-with-conflicts"和"significant-text"等,默认为:"append-no-conflicts"
- --include-tasks:用户只运行 challenge 中的部分task
- --cluster-health=yellow: 默认会检测集群状态,非green状态会直接退出,添加该参数可避免该状态
- --test-model: 用测试数据运行,数据快
- --client-options:指定一些客户端连接选项,比如用户名和密码。
-
总结报告:
- 通过日志查看每次输出的结果报告: ~/.rally/logs
- 通过json查看每次输出的结果报告:~/.rally/benchmarks/races
- 报告对比:
esrally compare --baseline= 46ad39e9-0959-4813-804d-4f95407d886d --contender=06324f7b-ab1c-4d81-b06b-45e537909374
四、进行压测
- markupsafe 版本异常
-
- 异常描述
Traceback (most recent call last): File "/usr/local/bin/jupyter-lab", line 5, in <module> from jupyterlab.labapp import main File "/usr/local/lib/python3.8/dist-packages/jupyterlab/labapp.py", line 13, in <module> from jupyter_server.serverapp import flags File "/usr/local/lib/python3.8/dist-packages/jupyter_server/serverapp.py", line 39, in <module> from jinja2 import Environment, FileSystemLoader File "/usr/lib/python3/dist-packages/jinja2/__init__.py", line 33, in <module> from jinja2.environment import Environment, Template File "/usr/lib/python3/dist-packages/jinja2/environment.py", line 15, in <module> from jinja2 import nodes File "/usr/lib/python3/dist-packages/jinja2/nodes.py", line 23, in <module> from jinja2.utils import Markup File "/usr/lib/python3/dist-packages/jinja2/utils.py", line 656, in <module> from markupsafe import Markup, escape, soft_unicode ImportError: cannot import name 'soft_unicode' from 'markupsafe' (/usr/local/lib/python3.8/dist-packages/markupsafe/__init__.py)
-
- 解决办法:pip install markupsafe==2.0.1