关于elasticsearch:如何对-ElasticSearch-集群进行压力测试

6次阅读

共计 7987 个字符,预计需要花费 20 分钟才能阅读完成。

当 ElasticSearch 的业务量足够大,比方每天都会产生数百 GB 数据的时候,你就会自然而然的须要一个性能更强的 ElasticSearch 集群。特地是当你应用的场景是一些典型的大量数据进入的场景,比方网站日志、用户行为记录、大型电商网站的站内搜索时,一个强劲的 ElasticSearch 是必不可少的组件。在这样的场景下,如何找到一组适合的 ElasticSearch 集群?如何评估 ElasticSearch 集群的性能,就成为了一个非常重要的因素。

用什么 ElasticSearch 进行压力测试?

对于 ElasticSearch 性能测试和压力测试方面,其实有很多不同的计划,比方:

  • Rally:Rally 是 Elastic 官方针对于 ElasticSearch 的宏观测试工具。
  • ESPerf:一个基于 Golang 编写的 ElasticSerch 性能测试工具
  • Elasticsearch Stress Test:由驰名的 ElasticSearch 服务提供商 Logzio 开发的性能测试工具

除了这些定制化的工具意外以外,ElasticSearch 也能够借由其 Restful API 来应用 Load Runner、JMeter 等老牌工具进行测试,这些工具零零散散,各有各的用法和用处,不过,对于宽广开发者而言,还是官网出的 Rally 更令人满意。

在本篇文章中,将会应用 Rally 来实现 ElasticSearch 集群的压力测试

Rally 作为官网出品的工具,来自官网的信赖加成让他成为各家进行压力测试的首选工具。其次,Rally 官网给出了多种默认的数据集(Tracks)。如果你的应用场景笼罩在这些数据集 (比方 HTTP 拜访事件数据、天文名称数据、地理坐标点数据、HTTP 申请日志、问答场景、打车记录等场景) 中,能够间接应用已有的数据集,来实现测试,而无需制作测试数据。

即便你的场景比拟非凡,无奈被官网的数据集所笼罩,也仍然能够依据本人的线上数据,来创立数据集,确保测试成果的精确。

如何应用 Rally 进行测试?

在理解了 Rally 后,来具体看一看 Rally 的应用。

测试前的筹备

对于 Rally 的根本装置,这里就不再介绍,总的来说非常简略,在配置好了 JDK 和 Python 环境当前,只须要执行pip install rally 就能够实现装置。如果你的环境简单,心愿以一个更简略的形式来运行,你也能够抉择应用 Docker 来运行 Rally,进行测试。对于更多的装置形式,你能够参考 Rally 的装置文档.

在装置实现了 Rally 后,就能够开始进行 ElasticSearch 的测试。

在测试前,你须要先理解一些基本概念

  • race:在 Rally 中,每一次测试都能够称之为 race
  • car:在 Rally 中,每一个参加测试的集群,都能够称之为 car,不同的集群就是不同的 car,如果你是在选配置,则能够通过切换 car 来设置不同配置的测试。
  • track: 在 Rally 中,每一次测试用的数据,都能够称之为 Track,不同的 Track 意味着不同的测试数据。
  • challange:在 Rally 中,每一个 challange 意味着一个不同的测试场景,具体的场景则代表着 ElasticSearch 所执行的操作。

在理解测试的基本概念后,就能够开始进行压力测试。

进行压力测试

测试设施

因为本次测试实际上是一次选型的过程,在测试之前,我曾浏览了 Elastic 官网的权威指南中的硬件局部. 在其文档中提供了对于运行 ElasticSearch 集群设施的举荐配置。

  1. 64 GB 内存的机器是十分现实的,然而 32 GB 和 16 GB 机器也是很常见的。少于 8 GB 会事与愿违(你最终须要很多很多的小机器),大于 64 GB 的机器也会有问题,咱们将在 堆内存: 大小和替换 中探讨。
  2. 如果你要在更快的 CPUs 和更多的外围之间抉择,抉择更多的外围更好。多个内核提供的额定并发远胜过略微快一点点的时钟频率。
  3. 如果你负担得起 SSD,它将远远超出任何旋转介质(注:机械硬盘,磁带等)。基于 SSD 的节点,查问和索引性能都有晋升。如果你负担得起,SSD 是一个好的抉择。
  4. 通常,抉择中配或者高配机器更好。防止应用低配机器,因为你不会心愿去治理领有上千个节点的集群,而且在这些低配机器上运行 Elasticsearch 的开销也是显著的。

因而,我抉择了本来打算购买的三家厂商(阿里云、腾讯云、UCloud)的设施进行测试,在具体的配置层面,则在各家购买四台 8C64G 100GBSSD 磁盘的的云主机来进行测试。

测试环节

1. 构建集群

在进行测试前,须要先对已有的三台设施搭建集群,并配置集群链接,确保集群失常工作。集群搭建的局部,你能够参考官网文档中的 Add and remove nodes in your cluster 局部。

2. 执行测试命令

在实现了集群的建设后,测试就简略很多,只须要执行命令,便能够对曾经建设好的集群进行测试,比方:

esrally --track=pmc --target-hosts=10.5.5.10:9200,10.5.5.11:9200,10.5.5.12:9200 --pipeline=benchmark-only

执行完命令后,接下来就是漫长的期待,依据机器的配置和集群等

3. 取得测试后果

在执行了测试命令后,测试实现后,你就能够取得相应的测试后果。不过,为了不便进行比照和查看,你能够在测试的命令中退出参数,从而实现将测试后果导出为特定的格局。

比方, 执行这样的测试命令,就能够取得 CSV 格局的测试数据

esrally --track=pmc --target-hosts=10.5.5.10:9200,10.5.5.11:9200,10.5.5.12:9200 --pipeline=benchmark-only -report-format=csv --report-file=~/benchmarks/result.csv

当你失去了 csv 的后果后,就能够对数据进行剖析和比照了。

如何查看 Rally 的测试后果

当咱们对 Rally 执行测试当前,咱们会拿到大量的数据,而具体这些数据应该如何来看呢?接下来咱们一一来看。

如何了解 Rally 的数据

Rally 导出的数据共有 4 列,别离是 Metric(维度)Task(工作)Unit(单位)‌Result(后果)

咱们能够将数据依照 Task 进行切分,你能够失去若干组后果,如:

  • 没有 Task 的宏观数据
  • index-append 组数据
  • index-stats 组数据
  • node-stats 组数据
  • phrase 组数据

不同的组意味着 ElasticSearch 在不同场景下的利用,因而,你在比照时,须要依照分组来看数据。而分组外部的数据,就简略了许多,除了宏观数据以外,其余各组的数据基本上都是一个模式的,具体能够分为以下 14 组数据。

  • Min/Median/Max:本组测试的最小吞吐率、中位吞吐率和最大吞吐率,单位为 ops/s , 越大越好。
  • 50th/90th/99th/100th percentile latency: 提交申请和收到残缺回复之间的时间段,越小越好
  • 50th/90th/99th/99.9th/100th percentile service time:申请解决开始和接管残缺响应之间的时间段,越小越好
  • error rate:错误率,谬误响应绝对于响应总数的比例。任何被 Elasticsearch Python 客户端抛出的异样都被认为是谬误响应(例如,HTTP 响应码 4xx、5xx 或者网络谬误,如网络不可达)。

当你可能了解数据的划分形式后,对于 Rally 返回的泛滥数据就比拟好了解了。接下来,咱们以理论例子来看 Rally 返回的数据。

如何了解 Rally 返回的宏观测试数据

这里以我测试的数据为例。

依据每组数据对应的不同操作,咱们能够将其数据分为若干组,这里我将数据依照色彩进行了一个根底的划分,从上到下顺次为:

  • 索引工夫
  • 索引节流工夫
  • 合并工夫
  • 合并节流工夫
  • 刷新工夫
  • 重刷工夫

首先,先看第一组的索引工夫,索引工夫共有四个指标:

  • Cumulative indexing time of primary shards: 主分片累计索引工夫
  • Cumulative indexing time across primary shards:跨分片累计索引工夫
  • Cumulative indexing throttle time of primary shards:主分片累计节流索引工夫
  • Cumulative indexing throttle time across primary shards:跨分片累计节流索引工夫

这四个指标阐明了 ElasticSearch 在进行数据处理所须要的索引工夫,因而,工夫越短越好。

Metric 腾讯云 UCloud 阿里云
Cumulative indexing time of primary shards 25.262833333333300 19.2662 21.40011666666670
Min cumulative indexing time across primary shards 5.0297 3.8177666666666700 4.2537666666666700
Median cumulative indexing time across primary shards 5.052066666666670 3.8252333333333300 4.272083333333330
Max cumulative indexing time across primary shards 5.076316666666670 3.9190666666666700 4.3139

在本组测试后果中,腾讯云的计算工夫消耗最长,阿里云能够在腾讯的根底之上,有约 16 % 的性能晋升,UCloud 则在腾讯云的根底之上晋升了 24%

在测试过程中,会因为机器的性能等因素,而造成理论测试工夫的不同。在这三组中,阿里云是最神奇的一个,因为它测试工夫达到了 6 个小时。而 UCloud 和腾讯云则别离在 3 小时和 4 小时左右,理论的测试体验还是有很大的差距。如果你要复现相应的试验,倡议你在早上进行,这样出测试后果的时候刚好还在白天。

接下来看合并工夫的数据

  • Cumulative merge throttle time of primary shards:主分片累计节流合并工夫
  • Min cumulative merge throttle time across primary shards:主分片累计节流合并工夫
  • Median cumulative merge throttle time across primary shards:主分片累计节流中位合并工夫
  • Max cumulative merge throttle time across primary shards:主分片累计节流最大合并工夫

合并工夫组后果相似于索引工夫组,不同的是测量的数据 Merge 工夫。和 index 相似,工夫越短越好,合并数量越大越好。

Metric 腾讯云 UCloud 阿里云 Unit
Cumulative merge time of primary shards 12.6379 7.717366666666670 11.083600000000000 min
Cumulative merge count of primary shards 90 116 99
Min cumulative merge time across primary shards 2.2037 1.43605 1.8695333333333300 min
Median cumulative merge time across primary shards 2.5391166666666700 1.5713166666666700 2.2406333333333300 min
Max cumulative merge time across primary shards 2.733966666666670 1.6538166666666700 2.5342 min

在本组测试后果中,腾讯云的计算工夫消耗最长,阿里云能够在腾讯的根底之上,有约 9 % 的性能晋升,UCloud 则在腾讯云的根底之上晋升了 30%~40%

其余几组相似的数据,这里就不再一一介绍,大家能够自行下载文章最初的数据进行剖析,评估,得出结论。

如何了解 Rally 返回的我的项目测试数据

除了宏观数据以外,Rally 返回数据中极大比例的是各种不同场景下的数据,这里,咱们也选两组数据进行比照剖析,看一看这些数据应该如何了解。

首先,咱们看一下 node-stats 组的后果。

node-stats 组的后果是针对 node-stats 命令的数据分析后果。这里的吞吐量越大越好,时延则越小越好。

Metric Task 腾讯云 UCloud 阿里云 Unit
Min Throughput node-stats 90.07 90.07 90.07 ops/s
Median Throughput node-stats 90.11 90.11 90.12 ops/s
Max Throughput node-stats 90.39 90.44 90.42 ops/s
50th percentile latency node-stats 2.1798378893436200 1.491405833803580 1.8348334997426700 ms
90th percentile latency node-stats 2.521278689346220 1.8698435997976000 1.9605179221798600 ms
99th percentile latency node-stats 3.795880397665310 3.173550112005610 2.901402467268780 ms
99.9th percentile latency node-stats 12.884928510055500 9.625145497986580 17.55732728102550 ms
100th percentile latency node-stats 18.134295778509100 10.29519444455220 20.23470633321270 ms
50th percentile service time node-stats 2.111824500389050 1.4231965001272300 1.7749374997038100 ms
90th percentile service time node-stats 2.453031599361570 1.7979749004553000 1.8996412000888100 ms
99th percentile service time node-stats 3.686133219835030 2.9536031294901500 2.8262974901645100 ms
99.9th percentile service time node-stats 12.818092870313500 9.55140776220657 8.42020982098726 ms
100th percentile service time node-stats 16.345433999958900 10.22649399965300 20.173265999801500 ms

在本组测试后果中,阿里云、腾讯云、UCloud 在性能方面没有较大的差距。

相似的,咱们能够比照 country_agg_uncached 组的后果

Metric Task 腾讯云 UCloud 阿里云 Unit
Min Throughput country_agg_uncached 3.60 3.61 3.60 ops/s
Median Throughput country_agg_uncached 3.60 3.61 3.60 ops/s
Max Throughput country_agg_uncached 3.60 3.61 3.61 ops/s
50th percentile latency country_agg_uncached 259.7333187786720 116.19688144446600 197.52657255594400 ms
90th percentile latency country_agg_uncached 264.3554400450740 125.7470980999640 201.85445903407500 ms
99th percentile latency country_agg_uncached 270.25939978284400 132.88548155585000 205.84624599263400 ms
100th percentile latency country_agg_uncached 278.76161922358700 133.7250455553660 206.57134322209500 ms
50th percentile service time country_agg_uncached 259.5503135007680 115.99637649987900 197.4296050002520 ms
90th percentile service time country_agg_uncached 264.2378849999660 125.53214089985000 201.7642059001450 ms
99th percentile service time country_agg_uncached 270.08045803115200 132.6980350402570 205.7533532799970 ms
100th percentile service time country_agg_uncached 278.6570290008970 133.52231299995800 206.47192300020800 ms
error rate country_agg_uncached 0.00 0.00 0.00 %

在本组测试后果中,阿里云、腾讯云、UCloud 在吞吐量方面没有较大的差距,时延方面 UCloud 会更好一点。

对于更多的数据,咱们不在这里一一介绍,我将测试数据曾经附在了文章的最初,你能够通过下载数据,自行剖析,来练习 Rally 的应用和数据分析。

一些应用 Rally 时的小技巧

如何解决 Rally 网络不好的问题?

Rally 在执行时,须要下载相应的数据进行实在场景下的模仿,在这种状况下,Rally 须要从 AWS S3 上下载一些数据包,用于本地的测试。但国内的设施对于 S3 的拜访不算太敌对,常常会在下载的时候呈现问题,因而,你能够抉择 前置下载数据,这样在测试的时候能够间接应用本地的数据来实现测试,缩小失败的可能。

想要前置下载数据也很简略只须要执行如下命令:

curl -O https://raw.githubusercontent.com/elastic/rally-tracks/master/download.sh
chmod u+x download.sh
./download.sh geonames
cd ~
tar -xf rally-track-data-geonames.tar

在执行 download.sh 时退出 track 名,就能够下载对应 track 数据的压缩包到本地,你能够依据本人的理论应用状况,来决定应用什么样的 track 模仿实在场景。

总结

在业务真正应用 ElasticSearch 之前,你能够像我一样,借助于 Rally 对备选的 ElasticSearch 集群进行压力测试,并通过对压测后果进行剖析,从而取得明确的选型倡议。比方,在我这次测试中,显然 UCloud 优于其余两家,是一个性价比 更高的抉择。当然,这是一个试验环境下的压测,还是须要依据具体的业务场景做测试来进行选型,更为迷信,不过心愿压测办法能给予大家参考,也欢送大家在后续理论的测试过程中给予我反馈。

附录

本文波及到的测试数据均能够在下载地址找到。

正文完
 0