我们有一个ES群集设置,其中包含3个主节点(c4.xlarge.elasticsearch)和3个数据节点(c4.xlarge.elasticsearch),并且使用5个分片的单个索引。
我们在此集群中索引了约3000万条记录,并且正在努力优化我们的选择查询(我们编写的脚本能够向该ES集群触发1000-1500个并行查询)。
我们意识到,在这种重负载下,选择需要3300毫秒(如ES响应中的关键部分所述)。
然后我们使用Profile API深入了解这些数字。
对于每个分片,上面报告的查询时间为(10410196、9969214、33323904、35199400、17725846)纳秒,介于1到3.5毫秒之间。
{
"type": "BooleanQuery",
"description": "#type:[1 TO 1] #query_uuid:5282b830-ab5b-48e0-aacc-7fbaafcd3179",
"time_in_nanos": 17725846,
"breakdown": {
"score": 0,
"build_scorer_count": 40,
"match_count": 0,
"create_weight": 663288,
"next_doc": 3130748,
"match": 0,
"create_weight_count": 1,
"next_doc_count": 498,
"score_count": 0,
"build_scorer": 13931271,
"advance": 0,
"advance_count": 0
}
}
通读文档,我们了解总查询时间也会受到收集器时间的影响
"collector": [
{
"name": "CancellableCollector",
"reason": "search_cancelled",
"time_in_nanos": 25127530,
"children": [
{
"name": "MultiCollector",
"reason": "search_top_hits",
"time_in_nanos": 17963249
}
]
}
]
在这种情况下,每个分片分别为31831976、22071150、56140508、27768799、25127530,即30到50毫秒之间。
收集器需要30到50毫秒,而查询时间需要1到3.5毫秒,而'took'
字段在响应中报告的时间不超过3.3秒。
我们遇到的困难是,聚集来自每个分片的响应并返回给客户端的主节点占用了剩余时间。有人可以帮助我们了解原因并减少这些时间吗?
以下是我们正在使用的架构供您参考。
{
"mappings": {
"_doc": {
"_doc": {
"properties": {
"action_id": {
"type": "integer"
},
"amount_in_base_currency": {
"type": "scaled_float",
"scaling_factor": 100000
},
"client_id": {
"type": "integer"
},
"has_commission": {
"type": "boolean"
},
"created_at": {
"type": "integer"
},
"from_uuid": {
"type": "keyword",
"copy_to": "query_uuid"
},
"id": {
"type": "keyword"
},
"status": {
"type": "byte"
},
"to_uuid": {
"type": "keyword",
"copy_to": "query_uuid"
},
"transaction_hash": {
"type": "keyword"
},
"transfer_events": {
"properties": {
"amount_in_base_currency": {
"type": "scaled_float",
"scaling_factor": 100000
},
"from_address": {
"type": "keyword"
},
"from_uuid": {
"type": "keyword"
},
"to_address": {
"type": "keyword"
},
"to_uuid": {
"type": "keyword"
}
}
},
"type": {
"type": "byte"
},
"updated_at": {
"type": "integer"
},
"query_uuid": {
"type": "text",
"analyzer": "whitespace"
}
}
}
}
}
}
以下是我们正在尝试优化的查询。
{
"query": {
"bool": {
"filter": [
{
"term": {
"type": "1"
}
},
{
"match": {
"query_uuid": "5282b830-ab5b-48e0-aacc-7fbaafcd3179"
}
}
]
}
},
"from": 0,
"size": 10,
"sort": [
{
"created_at": "desc"
}
]
}