前言

esrallyElasticsearch官方出的集群基准测试框架,使用Python编写的。它的工作原理是:先下载需要测试的数据集,然后在本地执行测试。但因为网络原因,国内下载异常的慢,这里主要介绍如何离线使用esrally进行测试。

同时,因为它本身是支持Docker使用的,为了方便使用,我这里就主要使用docker-compose来进行演示。

准备工作

为了方便离线使用,我们需要做一些前期的准备:

1. 手动下载数据集

框架的默认数据集是使用的geonames,我们可以通过http://benchmarks.elasticsearch.org.s3.amazonaws.com/corpora/geonames/documents-2.json.b2这个链接先手动下载,可以使用下载工具进行下载,速度回更快,我是使用的aria2 + uget,几分钟就下完了。

如果在框架内下载会很慢。

其他的数据集都可以通过该方法进行下载,具体的文件名可以通过这个项目中每个目录下的files.txt进行查看。

其中,带有*-1k.*的文件是--test-mode模式下使用的,只有少量数据,可以用来进行简单的测试检查。

2. 拉取Docker镜像

官方的镜像名为:elastic/rally,我这里的最新版本是2.0.0,所以使用

1
docker pull elastic/rally:2.0.0

进行拉取镜像。

3. 调整entrypoint.sh文件

在官方的Dockerfile中,使用的默认执行用户为1000,这里可能存在一些权限问题。同时,官方建议是把/rally/.rally文件夹在本地进行映射,因为一些配置,以及数据集都是在该文件夹下的,如果不进行本地映射的话,不便于结果的保存及数据集的使用。

而在映射了/rally/.rally文件夹后,又需要手动进行esrally configure,所以,我就直接调整了entrypoint.sh文件:

1
2
3
4
5
6
#!/usr/bin/env bash
set -Eeo pipefail

esrally configure

exec "$@"

4. 拉取rally-tracks项目

因为在读取数据集时,需要额外一些配置,所以我们需要将这个项目拉取到本地。

1
git clone https://github.com/elastic/rally-tracks.git

5. 编写docker-compose.yml文件

直接使用docker run的话,也是可以的。但为了直观和便于使用和修改,使用docker-compose更为友好:

1
2
3
4
5
6
7
8
9
version: "2"
services:
  esrally:
    container_name: esrally
    image: elastic/rally:2.0.0
    volumes:
      - ./myrally:/rally/.rally
      - ./entrypoint.sh:/entrypoint.sh
    command: "esrally race --track=geonames --challenge=append-no-conflicts --offline --pipeline=benchmark-only --target-hosts={{es.host}}:9200"

简单说明一下这个文件:

  1. - ./myrally:/rally/.rally主要是把配置映射到本地;

  2. - ./entrypoint.sh:/entrypoint.sh主要是替换原有的entrypoint.sh文件;

  3. 1
    
    esrally race --track=geonames --challenge=append-no-conflicts --offline --pipeline=benchmark-only --target-hosts={{es.host}}:9200
    

    --track=geonames,表示使用geonames数据集进行测试;

    --offline,表示离线使用,不去下载数据集;

    --target-hosts={{es.host}}:9200,表示需要测试的ES集群地址,端口为Http端口。如果不设置,esrally默认会自己启动一个ES来进行测试;

使用

首先,我们手动创建一个文件夹myrally,对应上面docker-compose.yml文件中的映射名称。

启动一下镜像,使之初始化:docker-compose up,报错不用管。这时,我们的目录结构:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
.
├── docker-compose.yml
├── entrypoint.sh
├── geonames
│   └── documents-2.json.bz2
├── myrally
│   ├── benchmarks
│   ├── logging.json
│   ├── logs
│   └── rally.ini
└── rally-tracks
    ├── download.sh
    ├── eventdata
    ├── geonames
    ├── geopoint
    ├── geopointshape
    ├── http_logs
    ├── nested
    ├── noaa
    ├── nyc_taxis
    ├── percolator
    ├── pmc
    ├── README.md
    └── so

可以看到在myrally文件夹下,已经初始化了一些配置和文件。接下来,我们就可以开始正式使用了(虽然还是各种需要调整):

  1. Expected a git repository at [/root/.rally/benchmarks/tracks/default] but the directory does not exist

    这个错误很明显,我们只需要手动创建对应的文件夹就好了。

  2. [/rally/.rally/benchmarks/tracks/default] must be a git repository.\n\nPlease run:\ngit -C /rally/.rally/benchmarks/tracks/default init

    这个错误是因为需要是Git目录,也已经给出了解决方案,不同的是,我们是在myrally文件夹下进行操作:

    1
    2
    3
    4
    5
    
    cd myrally/benchmarks/tracks/default
    git init
    touch .gitignore
    git add .
    git commit -m "init default"
    
  3. Could not load '/rally/.rally/benchmarks/tracks/default/geonames/track.json'. The complete track has been written to '/tmp/tmpyadq1aqi.json' for diagnos is.", '("Could not load track from \'track.json\'

    这个错误就需要用到我们拉取下来的rally-tracks项目了:

    1
    
    cp rally-tracks/geonames/ myrally/benchmarks/tracks/default/ -r
    
  4. Cannot find /rally/.rally/benchmarks/data/geonames/documents-2.json.bz2. Please disable offline mode and retry again.

    这个错误也比较明显,这时,我们就可以直接使用手动下载的数据集啦:

    1
    2
    
    mkdir myrally/benchmarks/data/geonames/ -P
    cp geonames/documents-2.json.bz2 myrally/benchmarks/data/geonames/
    

到这里,我们终于可以愉快地进行测试了。

直接运行:

1
docker-compose up

等待执行完毕就可以啦。

小技巧

查看日志:

1
less myrally/logs/rally.log

总结

esrally的使用还是非常方便的,只是因为网络原因,我们需要先手动下载数据集,并且修改一些配置。

从一开始的查询docker镜像,到自己优化镜像、再到直接使用官方提供的镜像、并调整一些参数。还是花了我半天的时间,但收获还是满满的。

有了这个基准测试,在优化集群参数,调整集群大小方面,就更有底气,也更有说服力了。

参考

  1. rally
  2. rally-trakcs
  3. Elasticsearch 压测方案