技巧和窍门
本节以食谱风格介绍各种技巧。
对现有集群进行基准测试
```warning:: 如果您刚开始使用Rally,但不了解其工作原理,请不要在任何生产或类似生产的集群上运行它。此外,应该在专用环境中执行基准测试,该环境不应该有流量干扰
```note:: 在此配方中,我们假设Rally已正确配置。
假如你现在有一个待测试的集群,由在10.5.5.10
、10.5.5.11
、10.5.5.12
上运行的三个Elasticsearch节点组成。您已经自行设置了群集,并希望使用Rally对它进行基准测试。 Rally安装在10.5.5.5
上。
首先,我们需要确定一个track。因此,我们通常运行esrally list tracks
:
Name Description Documents Compressed Size Uncompressed Size Default Challenge All Challenges
---------- ------------------------------------------------- ----------- ----------------- ------------------- ----------------------- ---------------------------
geonames POIs from Geonames 11396505 252.4 MB 3.3 GB append-no-conflicts append-no-conflicts,appe...
geopoint Point coordinates from PlanetOSM 60844404 481.9 MB 2.3 GB append-no-conflicts append-no-conflicts,appe...
http_logs HTTP server log data 247249096 1.2 GB 31.1 GB append-no-conflicts append-no-conflicts,appe...
nested StackOverflow Q&A stored as nested docs 11203029 663.1 MB 3.4 GB nested-search-challenge nested-search-challenge,...
noaa Global daily weather measurements from NOAA 33659481 947.3 MB 9.0 GB append-no-conflicts append-no-conflicts,appe...
nyc_taxis Taxi rides in New York in 2015 165346692 4.5 GB 74.3 GB append-no-conflicts append-no-conflicts,appe...
percolator Percolator benchmark based on AOL queries 2000000 102.7 kB 104.9 MB append-no-conflicts append-no-conflicts,appe...
pmc Full text benchmark with academic papers from PMC 574199 5.5 GB 21.7 GB append-no-conflicts append-no-conflicts,appe...
假如我们对全文基准感兴趣,我们选择pmc运行。如果您有要用于基准测试的数据,请创建自己的track,与默认track相比,您收集的指标将更具代表性和实用性。 接下来,我们需要知道要针对哪些机器,这很容易,因为从上图可以看到。
最后,我们需要检查要使用的管道。对于这种情况,benchmark-only
管道是合适的,因为我们不希望Rally为我们配置集群。
现在我们可以调用Rally:
esrally --track=pmc --target-hosts=10.5.5.10:9200,10.5.5.11:9200,10.5.5.12:9200 --pipeline=benchmark-only
如果启用了X-Pack Security,则还需要指定另一个参数以使用https并传递凭据:
esrally --track=pmc --target-hosts=10.5.5.10:9243,10.5.5.11:9243,10.5.5.12:9243 --pipeline=benchmark-only --client-options="use_ssl:true,verify_certs:true,basic_auth_user:'elastic',basic_auth_password:'changeme'"
index.json的配置
{
"settings": {
"index.number_of_replicas": 0
},
"mappings": {
"docs": {
"dynamic": "strict",
"properties": {
"geonameid": {
"type": "long"
},
"name": {
"type": "text"
},
"latitude": {
"type": "double"
},
"longitude": {
"type": "double"
},
"country_code": {
"type": "text"
},
"population": {
"type": "long"
}
}
}
}
}
其中 settings
其实就对应了es中templates的配置可以通过修改这里,对templates的优化进行测试,优化总结如下:
Elasticsearch template优化项
Translog flush间隔调整
"index.translog.sync_interval":"60s"``"index.translog.durability":"async"
设置async表示tarnslog的刷盘策略按照sync_interval配置的时间周期进行。"index.translog.flush_threshold_size":"1024mb"
设置flush_threshold_size
表示translog达到1024mb的时候进行刷盘索引刷新间隔
"index.refresh_interval":"60s"
默认情况下索引的refresh_interval的时间为1s,这意味着数据写入1s后就可以被搜索到,每次refresh会产生一个新的Lucene段,这会导致segment merge的行为,如果不需要这么高的搜索实时性可以降低索引refresh的周期段合并优化
index.merge.scheduler.max_thread_count
如果只有一块硬盘且非ssd的话上值应该设置为1,index.merge.policy.segments_per_tier
该属性指定了每层分段的数量,取值约小最终segment 越少,因此需要 merge 的操作更多,可以考虑适当增加此值.默认为10。index.merge.policy.max_merged_segment
指定了单个segment的最大容量,默认为5G,可以适当降低此值Indexing Buffer
indices.memory.index_buffer_size
indexing buffer在为 doc 建立索引时使用,当缓冲满时会刷入磁盘,生成一个新的 segment, 这是除refresh_interval外另外一个刷新索引,生成新 segment 的情况. 每个shard有自己的indexing buffer,默认为整个堆空间的10%。可以考虑适当增加该值。
建议的配置
settings : {
"index.merge.policy.max_merged_segment":"2gb",
"index.merge.policy.segments_per_tier":"24",
"index.optimize_auto_generated_id":"true",
"index.translog.flush_threshold_size":"1024mb",
"index.translog.durability":"async",
"index.translog.sync_interval":"60s",
"index.refresh_interval":"60s"
}
indices.memory.index_buffer_size : 30%
index.merge.scheduler.max_thread_count: 1
这两项配置是在elasticsearch.yml中配置。
track.json的配置
track.json规定了测试的一些行为如下:
{
"version": 2,
"description": "Tutorial benchmark for Rally",
"indices": [
{
"name": "geonames",
"body": "index.json",
"types": [ "docs" ]
}
],
"corpora": [
{
"name": "rally-tutorial",
"documents": [
{
"source-file": "documents.json",
"document-count": 11658903,
"uncompressed-bytes": 1544799789
}
]
}
],
"schedule": [
{
"operation": {
"operation-type": "delete-index"
}
},
{
"operation": {
"operation-type": "create-index"
}
},
{
"operation": {
"operation-type": "cluster-health",
"request-params": {
"wait_for_status": "green"
}
}
},
{
"operation": {
"operation-type": "bulk",
"bulk-size": 5000
},
"warmup-time-period": 120,
"clients": 8
},
{
"operation": {
"operation-type": "force-merge"
}
},
{
"operation": {
"name": "query-match-all",
"operation-type": "search",
"body": {
"query": {
"match_all": {}
}
}
},
"clients": 8,
"warmup-iterations": 1000,
"iterations": 1000,
"target-throughput": 100
}
]
}
其中我最关心es的写入性能,所以下面的测试着重测试es的写入:
{
"operation": {
"operation-type": "bulk",
"bulk-size": 5000
},
"warmup-time-period": 120,
"clients": 8
}
这里的几个值我们简单介绍一下,bulk不用多提,就是es的批量操作,bulk-size的值就是一次请求写入的数据条数,warmup-time-period是热身时间,意思就是让es把cpu和内存都调度起来,机器热了才开始测试,clients就是模拟客户端的数量。这个地方如果数据盘是机械盘的话,这个数字太大的话请求生成可能成为瓶颈。