跨集群搜索(Cross-cluster search)允许我们对一个或多个远程集群运行单个搜索请求。例如,我们可以使用跨集群搜索来过滤和分析存储在不同数据中心的集群上的日志数据。
远程集群配置
通过集群更新设置API( cluster update settings API)请求添加三个远程集群: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"
]
}
}
}
}
}
搜索单个远程集群
搜索远程集群cluster_one,索引为my_index_01:
GET /cluster_one:my_index_01/_search
{
"query": { "match": { "content": "Fox" } },
"_source": ["id", "user.*"]
}
返回结果片段如下:
{
"_index" : "cluster_one:my_index_01",
"_type" : "_doc",
"_id" : "2",
"_score" : 0.18232156,
"_source" : {
"user.age" : 26,
"user.name" : "fake",
"id" : "00000002"
}
}
搜索多个远程集群
在三个集群(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.*"]
}
忽略不可用集群
默认情况下,如果请求中的任何集群不可用,跨集群搜索将返回一个错误。要在跨集群搜索期间跳过不可用的集群,将参数skip_unavailable集群设置为true。下面的集群更新设置API请求( cluster update settings API)将cluster_two的skip_unavailable设置更改为true。
PUT _cluster/settings
{
"persistent": {
"cluster.remote.cluster_two.skip_unavailable": true
}
}
如果在跨集群搜索期间,cluster_two断开连接或不可用,那么Elasticsearch将不会在最终结果中包含来自该集群的匹配文档。
跨集群搜索如何处理网络延迟
因为跨集群搜索涉及到向远程集群发送请求,所以任何网络延迟都可能影响搜索速度。为了避免缓慢的搜索,跨集群搜索提供了处理网络延迟的两种选择:
- 最小化网络往返
默认情况下采用最小化网络往返,Elasticsearch通过减少远程集群之间的网络往返次数,从而减少了网络延迟对搜索速度的影响。然而,Elasticsearch不能减少大型搜索请求的网络往返,比如那些包含滚动(scroll)或内部命中集(inner hits)的搜索请求。 - 非最小化网络往返
对于包含滚动(scroll)或内部命中集(inner hits)的搜索请求,Elasticsearch向每个远程集群发送多个传出和传入请求,通过将ccs_minimize_roundtrips参数设置为false来选择此选项,虽然这种方法通常比较慢,但它可以很好地用于低延迟的网络。ccs_minimize_roundtrips参数设置为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.*"]}
最小化网络往返
以下是跨集群搜索选择最小化网络往返时的工作原理:
(1)向本地集群发送跨集群搜索请求。该集群中的协调节点接收并解析请求。
(2)协调节点向每个集群(包括本地集群)发送一个搜索请求。每个集群独立执行搜索请求,将自己的集群级设置应用于请求。
(3)每个远程集群将其搜索结果发送回协调节点。
(4)从每个集群收集结果之后,协调节点在跨集群搜索响应中返回最终结果。
非最小化网络往返
以下是跨集群搜索选择非最小化网络往返时的工作原理:
(1)向本地集群发送跨集群搜索请求。该集群中的协调节点接收并解析请求。
(2)协调节点向每个远程集群发送一个搜索分片API(search shards API)请求。
(3)每个远程集群将其响应发送回协调节点,此响应包含关于跨集群搜索请求将执行的索引(indices)和分片(shard)的信息。
(4)协调节点向每个分片(包括它自己集群中的分片)发送搜索请求,每个分片(shard)独立执行搜索请求。
(5)每个分片(shard)将其搜索结果发送回协调节点。
(6)从每个集群收集结果之后,协调节点在跨集群搜索响应中返回最终结果。