参考:https://esrally.readthedocs.io/en/latest/rally_daemon.html
在生产环境,Rally 可以根据需要灵活运用:
- Rally 既可单点运行,也可以分布式运行。性能好的集群,就需要多个压测节点才能产生足够的压力
- Rally 既可以使用自带的 cars 配置来创建 ES 实例,也可以指定现成的 ES 集群进行压测
一、Rally Daemon 介绍
Rally 可以 daemon 的方式运行,共有 3 种角色:
- Benchmark coordinator(esrally)
- Load driver(Rally daemon)
- Provisioner(ES)
Benchmark coordinator【唯一】
控制节点,用于执行 esrally
命令,打印压测报告。
Load driver【多个】
负载节点,监听 1900 端口。
用于解析 tracks 配置,并执行压测操作。在控制节点通过 --load-driver-hosts
参数,就可以调用这些节点运行压测操作。
Provisioner
需要压测的 ES 目标集群。
默认使用 cars 配置在本地创建一个 ES 实例;也可以通过 --target-hosts
指定已搭建好的 ES 集群。
这里姑且将 Benchmark coordinator 和 Load driver 合称为 Rally 集群。
二、部署 Rally 集群
假设有 2 台机器可以用于部署 Rally 集群,那么我这样使用它
IP | roles |
---|---|
192.168.0.11 | 调度节点、负载节点 |
192.168.0.12 | 负载节点 |
1、编译运行环境
先参考《2、Rally 安装》,在一台线下机器安装 esrally 运行环境(最小化安装)。
Python 和 Git 需要编译安装,与操作系统的诸多工具有着强依赖,所以为了减少依赖带来的额外工作量,强烈建议对不同的 OS 编译不同的 Python 和 Git。这里以 CentOS6 为例
编译 Git1.9
yum install curl-devel expat-devel perl-ExtUtils-MakeMaker
wget https://www.kernel.org/pub/software/scm/git/git-2.9.5.tar.gz
tar -zxf git-2.9.5.tar.gz
cd git-2.9.5
./configure --prefix=$GIT_HOME
make -j $(grep -c ^process /proc/cpuinfo) all
make install
export PATH=$GIT_HOME/bin:$GIT_HOME/libexec/git-core:$PATH
which git git-add
git --version
编译 Python
PYTHON3_HOME=/apps/svr/esrally/python-3.5.2
GIT_HOME=/apps/svr/esrally/git-1.9
sudo yum install glibc-devel openssl-devel bzip2-devel
wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz
tar -zxf Python-3.5.2.tgz
cd Python-3.5.2
./configure --prefix=$PYTHON3_HOME
make -j $(grep -c ^process /proc/cpuinfo)
make install
export PATH=$PYTHON3_HOME/bin:$PATH
which python3
安装 esrally
mkdir -p ~/.pip
cat > ~/.pip/pip.conf << EOF
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
EOF
pip3 install esrally
which esrally
为了兼容 ES5.5,需要修改 metrics、races、results 的脚本和 index template 文件,将 mapping type 从 _doc
改为 doc
,否则会抛出异常:
elasticsearch.exceptions.RequestError: TransportError(400, 'invalid_type_name_exception', "mapping type name [_doc] can't start with '_'")
vim /apps/svr/esrally/python-3.5.2/lib/python3.5/site-packages/esrally/metrics.py
# 修改前
METRICS_DOC_TYPE = "_doc"
RESULTS_DOC_TYPE = "_doc"
RACE_DOC_TYPE = "_doc"
# 修改后
METRICS_DOC_TYPE = "doc"
RESULTS_DOC_TYPE = "doc"
RACE_DOC_TYPE = "doc"
cd /apps/svr/esrally/python-3.5.2/lib/python3.5/site-packages/esrally/resources
- metrics-template.json
- races-template.json
- results-template.json
修改这 3 个文件,需要修改的内容是一样的
# 修改前
"indices_pattern": ["rally-metrics-*"],
# 修改后
"template": "rally-metrics-*",
# 修改前
"mappings": {
"_doc": {
...
}
}
# 修改后
"mappings": {
"doc": {
...
}
}
生产中很少用到 ingest 功能,而 rally 的 bulk ingest 百分比范围是 (0,100],需要改为 [0,100],支持禁用 ingest:
vim /apps/svr/esrally/python-3.5.2/lib/python3.5/site-packages/esrally/track/params.py
# 修改前
self.ingest_percentage = self.float_param(params, name="ingest-percentage", default_value=100, min_value=0, max_value=100)
# 修改后
self.ingest_percentage = self.float_param(params, name="ingest-percentage", default_value=100, min_value=-1, max_value=100)
2、配置 rally
ES 集群:
- 压测报告存放在指定的 ES 实例(其实使用 in-memory 已经足够)
- 目标 ES 集群使用现有的集群
也就是说,我们不会使用 Rally 来创建任何的 ES 实例
esrally configure --advanced-config
如果使用自己搭建的 ES 存放压测报告,则可参考如下配置:
____ ____
/ __ \____ _/ / /_ __
/ /_/ / __ `/ / / / / /
/ _, _/ /_/ / / / /_/ /
/_/ |_|\__,_/_/_/\__, /
/____/
Running advanced configuration. You can get additional help at:
https://esrally.readthedocs.io/en/1.2.1/configuration.html
WARNING: Will overwrite existing config file at [/home/apps/.rally/rally.ini]
Enter the benchmark root directory (default: /home/apps/.rally/benchmarks): /apps/svr/esrally/rally/benchmarks
Enter your Elasticsearch project directory: (default: /apps/svr/esrally/rally/benchmarks/src/elasticsearch): /apps/svr/esrally/rally/benchmarks/src/elasticsearch
Where should metrics be kept?
(1) In memory (simpler but less options for analysis)
(2) Elasticsearch (requires a separate ES instance, keeps all raw samples for analysis)
(default: 1): 2
Enter the host name of the ES metrics store (default: localhost): 192.168.0.11
Enter the port of the ES metrics store: 9200
Use secure connection (True, False) (default: False):
Username for basic authentication (empty if not needed) (default: ):
Password for basic authentication (empty if not needed) (default: ):
Enter a descriptive name for this benchmark environment (ASCII, no spaces) (default: local): es_bentchmark
Do you want Rally to keep the Elasticsearch benchmark candidate installation including the index (will use several GB per trial run)? (default: False): True
Configuration successfully written to /home/apps/.rally/rally.ini. Happy benchmarking!
移动配置目录
mv /home/apps/.rally /apps/svr/esrally/rally
创建 tracks 和 data 目录
INSTALL_HOME=/apps/svr/esrally
TRACKS_HOME=$INSTALL_HOME/rally/benchmarks/tracks/default
DATA_HOME=$INSTALL_HOME/rally/benchmarks/data
mkdir -p $TRACKS_HOME $DATA_HOME
如果生产使用现成的 ES 实例来存储压测报告,使用现成的 ES 目标集群来进行压测,则这里不需要 teams 目录。
3、下载 tracks 配置
cd /apps/svr/esrally/rally/benchmarks
sudo update-ca-trust
git clone https://github.com/elastic/rally-tracks.git tracks/default
esrally list tracks --offline
git 项目的 .git* 文件和目录一定要保留,因为 esrally 运行的时候会去检查 git 配置
4、添加环境变量文件
INSTALL_HOME=/apps/svr/esrally
GIT_HOME=$INSTALL_HOME/git-1.9
PYTHON3_HOME=$INSTALL_HOME/python-3.5.2
export PATH=$PYTHON3_HOME/bin:$GIT_HOME/bin:$GIT_HOME/libexec/git-core:$PATH
which esrally git git-add
#esrally -h
5、打包 esrally 目录
查看目录大小
du -shc /apps/svr/esrally/*
90M /apps/svr/esrally/git-1.9
234M /apps/svr/esrally/python-3.5.2
2.9M /apps/svr/esrally/rally
349M total
git-1.9 目录一定要保留,因为 esrally 每次运行的时候都会调用 git 命令检查 tracks 配置
打包 esrally
不要启用压缩,因为编译后的文件都是二进制的,没得压缩,启用压缩反而会导致压缩包会更大
cd /apps/svr/ && tar --exclude=*.bz2 -cf esrally.el6.tar esrally
查看包大小
du -sh esrally.el6.tar
273M esrally.el6.tar
这里只打包 rally 配置、运行环境、tracks 配置,样本数据体积较大,需另行打包上传
5、打包样本数据
上一步打包了 rally 配置、运行环境、tracks 配置,这里打包某个 track 的数据,以 geopoint 为例
使用浏览器下载样本数据到的 data 目录:/apps/svr/esrally/rally/benchmarks/data/geopoint/
http://benchmarks.elasticsearch.org.s3.amazonaws.com/corpora/geopoint/documents.json.bz2
http://benchmarks.elasticsearch.org.s3.amazonaws.com/corpora/geopoint/documents-1k.json.bz2
查看文件大小
cd /apps/svr/esrally/rally/benchmarks/data/geopoint/; du -sh *
253M documents-2.json.bz2
482M documents.json.bz2
打包数据,不需要启用压缩
cd /apps/svr/esrally/rally/benchmarks/data/; tar -cf geopoint.tar geopoint
查看包大小
du -sh geopoint.tar
735M geopoint.tar
6、上传包到所有压测机器
一般调度机器是不需要压测数据的,如果它同时也是负载机器,那么也需要压测数据
rz
解压
tar -xf esrally.el6.tar -C /apps/svr/
tar -xf geopoint.tar -C /apps/svr/esrally/rally/benchmarks/data/
# 做个软链,因为配置目录 ~/.rally 是写死在代码里面的
ln -svnf /apps/svr/esrally/rally /home/apps/.rally
查看解压后的目录是否 ok
tree /apps/svr/esrally/rally/benchmarks/ -L 3
/apps/svr/esrally/rally/benchmarks/
├── data
│ └── geopoint
│ ├── documents-2.json.bz2
│ └── documents.json.bz2
└── tracks
└── default
├── download.sh
├── eventdata
├── geonames
├── geopoint
├── geopointshape
├── geoshape
├── http_logs
├── metricbeat
├── nested
├── noaa
├── nyc_taxis
├── percolator
├── pmc
├── README.md
└── so
这时 geopoint 的 tracks 配置和 data 都部署好了。
7、其他压测场景
根据生产业务,可以选定多种 rally 提供的较为类似的 tracks 进行压测:
Tracks | 业务类型 | 数据源 | Docs | Compressed Size | Uncompressed Size |
---|---|---|---|---|---|
eventdata | 日志入库,类似 Dragonfly | elastic.co 官网的 HTTP 访问日志 | 20,000,000 | 755.1 MB | 15.3 GB |
nested | 嵌套搜索,类似常见问题搜索 | StackOverflow 的 Q&A 数据 | 11,203,029 | 663.1 MB | 3.4 GB |
percolator | AOL 查询 | rally | 2,000,000 | 102.7 kB | 104.9 MB |
pmc | 全文搜索 | PMC 的学术论文搜索 | 574,199 | 5.5 GB | 21.7 GB |
so | 问题搜索 | StackOverflow 的问答数据 | 36,062,278 | 8.9 GB | 33.1 GB |
下载地址(只支持 w3m or 浏览器下载)
eventdata
http://benchmarks.elasticsearch.org.s3.amazonaws.com/corpora/eventdata/eventdata-1k.json.bz2 (41KB)
http://benchmarks.elasticsearch.org.s3.amazonaws.com/corpora/eventdata/eventdata.json.bz2 (755MB)
nested
http://benchmarks.elasticsearch.org.s3.amazonaws.com/corpora/nested/documents-1k.json.bz2 (70KB)
http://benchmarks.elasticsearch.org.s3.amazonaws.com/corpora/nested/documents.json.bz2 (663MB)
percolator
http://benchmarks.elasticsearch.org.s3.amazonaws.com/corpora/percolator/queries-2-1k.json.bz2 (1KB)
http://benchmarks.elasticsearch.org.s3.amazonaws.com/corpora/percolator/queries-2.json.bz2 (103KB)
pmc
http://benchmarks.elasticsearch.org.s3.amazonaws.com/corpora/pmc/documents-1k.json.bz2 (8.57MB)
http://benchmarks.elasticsearch.org.s3.amazonaws.com/corpora/pmc/documents.json.bz2 (5.5GB)
so
http://benchmarks.elasticsearch.org.s3.amazonaws.com/corpora/so/posts-1k.json.bz2 (181KB)
http://benchmarks.elasticsearch.org.s3.amazonaws.com/corpora/so/posts.json.bz2 (8.9GB)
三、压测模式
IP | roles | 配置 |
---|---|---|
192.168.0.11 | 调度节点、负载节点、ES 单机实例 | 24U32G |
192.168.0.12 | 负载节点 | 24U32G |
192.168.0.17 | ES master1 | 2U4G |
192.168.0.18 | ES master2 | 2U4G |
192.168.0.19 | ES master3 | 2U4G |
192.168.0.89 | ES node1 | 12U24G |
192.168.0.90 | ES node2 | 12U24G |
192.168.0.91 | ES node3 | 12U24G |
1、压测前的检查
声明路径
source /apps/svr/esrally/rally_env.sh
检查 reporting 配置
vim ~/.rally/rally.ini
[reporting]
datastore.type = elasticsearch
datastore.host = 192.168.0.11
datastore.port = 9200
datastore.secure = False
datastore.user =
datastore.password =
以下压测全部使用离线 --offline
模式
2、单机压测模式
dryrun
esrally --pipeline=benchmark-only --target-hosts=192.168.0..89:9200,192.168.0..90:9200,192.168.0..91:9200 --user-tag="noah:p1_r0_b100" --track=percolator --offline --test-mode
正式压测
把 --test-mode 去掉即可
3、双机分布式压测模式
在调度机器启动 coordinator daemon
esrallyd start --node-ip=192.168.0.11 --coordinator-ip=192.168.0.11
esrallyd start --node-ip=192.168.0.12 --coordinator-ip=192.168.0.11
查看 daemon 状态
esrallyd status
停止 daemon
esrallyd stop
dryrun(在调度机器执行调度命令)
esrally --pipeline=benchmark-only --load-driver-hosts=192.168.0.11,192.168.0.12 --target-hosts=192.168.0..89:9200,192.168.0..90:9200,192.168.0..91:9200 --user-tag="noahes:1_0_100_0" --track=percolator --offline --test-mode
正式压测
把 --test-mode 去掉即可