跨集群搜索(Cross-cluster search)允許我們對一個或多個遠(yuǎn)程集群運(yùn)行單個搜索請求频敛。例如鲫剿,我們可以使用跨集群搜索來過濾和分析存儲在不同數(shù)據(jù)中心的集群上的日志數(shù)據(jù)。
遠(yuǎn)程集群配置
通過集群更新設(shè)置API( cluster update settings API)請求添加三個遠(yuǎn)程集群:cluster_one、cluster_two和cluster_three修噪。
PUT _cluster/settings
{
"persistent": {
"cluster": {
"remote": {
"cluster_one": {
"seeds": [
"127.0.0.1:9300"
]
},
"cluster_two": {
"seeds": [
"127.0.0.1:9301"
]
},
"cluster_three": {
"seeds": [
"127.0.0.1:9302"
]
}
}
}
}
}
搜索單個遠(yuǎn)程集群
搜索遠(yuǎn)程集群cluster_one,索引為my_index_01:
GET /cluster_one:my_index_01/_search
{
"query": { "match": { "content": "Fox" } },
"_source": ["id", "user.*"]
}
返回結(jié)果片段如下:
{
"_index" : "cluster_one:my_index_01",
"_type" : "_doc",
"_id" : "2",
"_score" : 0.18232156,
"_source" : {
"user.age" : 26,
"user.name" : "fake",
"id" : "00000002"
}
}
搜索多個遠(yuǎn)程集群
在三個集群(cluster_one路媚、cluster_two和cluster_three)中搜索索引my_index_01:
GET /cluster_one:my_index_01,cluster_two:my_index_01,cluster_three:my_index_01/_search
{
"query": { "match": { "content": "Fox" } },
"_source": ["id", "user.*"]
}
忽略不可用集群
默認(rèn)情況下黄琼,如果請求中的任何集群不可用,跨集群搜索將返回一個錯誤整慎。要在跨集群搜索期間跳過不可用的集群脏款,將參數(shù)skip_unavailable集群設(shè)置為true。下面的集群更新設(shè)置API請求( cluster update settings API)將cluster_two的skip_unavailable設(shè)置更改為true裤园。
PUT _cluster/settings
{
"persistent": {
"cluster.remote.cluster_two.skip_unavailable": true
}
}
如果在跨集群搜索期間撤师,cluster_two斷開連接或不可用,那么Elasticsearch將不會在最終結(jié)果中包含來自該集群的匹配文檔拧揽。
跨集群搜索如何處理網(wǎng)絡(luò)延遲
因為跨集群搜索涉及到向遠(yuǎn)程集群發(fā)送請求剃盾,所以任何網(wǎng)絡(luò)延遲都可能影響搜索速度腺占。為了避免緩慢的搜索,跨集群搜索提供了處理網(wǎng)絡(luò)延遲的兩種選擇:
- 最小化網(wǎng)絡(luò)往返
默認(rèn)情況下采用最小化網(wǎng)絡(luò)往返痒谴,Elasticsearch通過減少遠(yuǎn)程集群之間的網(wǎng)絡(luò)往返次數(shù)衰伯,從而減少了網(wǎng)絡(luò)延遲對搜索速度的影響。然而积蔚,Elasticsearch不能減少大型搜索請求的網(wǎng)絡(luò)往返意鲸,比如那些包含滾動(scroll)或內(nèi)部命中集(inner hits)的搜索請求。 - 非最小化網(wǎng)絡(luò)往返
對于包含滾動(scroll)或內(nèi)部命中集(inner hits)的搜索請求尽爆,Elasticsearch向每個遠(yuǎn)程集群發(fā)送多個傳出和傳入請求怎顾,通過將ccs_minimize_roundtrips參數(shù)設(shè)置為false來選擇此選項,雖然這種方法通常比較慢漱贱,但它可以很好地用于低延遲的網(wǎng)絡(luò)槐雾。ccs_minimize_roundtrips參數(shù)設(shè)置為false示例如下:
GET /cluster_one:my_index_01,cluster_two:my_index_01,cluster_three:my_index_01/_search?ccs_minimize_roundtrips=false
{"query":{"match":{"content":"Fox"}},"_source":["id","user.*"]}
最小化網(wǎng)絡(luò)往返
以下是跨集群搜索選擇最小化網(wǎng)絡(luò)往返時的工作原理:
(1)向本地集群發(fā)送跨集群搜索請求。該集群中的協(xié)調(diào)節(jié)點(diǎn)接收并解析請求饱亿。
(2)協(xié)調(diào)節(jié)點(diǎn)向每個集群(包括本地集群)發(fā)送一個搜索請求蚜退。每個集群獨(dú)立執(zhí)行搜索請求,將自己的集群級設(shè)置應(yīng)用于請求彪笼。
(3)每個遠(yuǎn)程集群將其搜索結(jié)果發(fā)送回協(xié)調(diào)節(jié)點(diǎn)钻注。
(4)從每個集群收集結(jié)果之后,協(xié)調(diào)節(jié)點(diǎn)在跨集群搜索響應(yīng)中返回最終結(jié)果配猫。
非最小化網(wǎng)絡(luò)往返
以下是跨集群搜索選擇非最小化網(wǎng)絡(luò)往返時的工作原理:
(1)向本地集群發(fā)送跨集群搜索請求幅恋。該集群中的協(xié)調(diào)節(jié)點(diǎn)接收并解析請求。
(2)協(xié)調(diào)節(jié)點(diǎn)向每個遠(yuǎn)程集群發(fā)送一個搜索分片API(search shards API)請求泵肄。
(3)每個遠(yuǎn)程集群將其響應(yīng)發(fā)送回協(xié)調(diào)節(jié)點(diǎn)捆交,此響應(yīng)包含關(guān)于跨集群搜索請求將執(zhí)行的索引(indices)和分片(shard)的信息。
(4)協(xié)調(diào)節(jié)點(diǎn)向每個分片(包括它自己集群中的分片)發(fā)送搜索請求腐巢,每個分片(shard)獨(dú)立執(zhí)行搜索請求品追。
(5)每個分片(shard)將其搜索結(jié)果發(fā)送回協(xié)調(diào)節(jié)點(diǎn)。
(6)從每個集群收集結(jié)果之后冯丙,協(xié)調(diào)節(jié)點(diǎn)在跨集群搜索響應(yīng)中返回最終結(jié)果肉瓦。