cross-cluster search,简称为CCS
,即跨集群搜索。可以使得节点当做联邦客户端
跨多个集群查询。不同于老版本的tribe node
参与到远程集群的方式,CCS使用轻量级方式连接到远程集群来执行联邦查询。
具体来说,CCS通过在cluster state中配置远程集群,且仅连接到远程集群中有限数量的几个节点。 每个远程集群由一个别名和一个种子节点列表索引。当注册远程集群后,将从一个种子节点中检索其集群状态,以便最多选择3个网关节点进行连接,以作为将来的跨集群搜索请求的一部分。
跨集群搜索请求仅包含从协调节点到先前选择的远程节点的单向连接。 可以通过节点的属性来标记应选择哪些节点进行连接。集群中配置了远程集群的每个节点都会连接到一个或多个网关节点(种子节点只能配置为网关节点的子集),并使用它们联合搜索请求访问远程集群。
配置时,可使用cluster settings来动态增改(这种方式可通过集群中所有节点访问远程集群),或通过本地elasticsearch.yml
配置(这种方式只能使得改了本地配置文件的那些节点来做federated查询)。
使用本地化方式时,在CCS节点的elasticsearch.yml
中配置:
search:
remote:
cluster_one:
seeds: 127.0.0.1:9300
cluster_two:
seeds: 127.0.0.1:9301
使用cluster settings时,命令如下:
PUT _cluster/settings
{
"persistent": {
"search": {
"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_three命令如下:
PUT _cluster/settings
{
"persistent": {
"search": {
"remote": {
"cluster_three": {
"seeds": null
}
}
}
}
}
gateway
,则只会连接那些设置了node.attr.gateway: true
属性的网关节点。可将协调节点设为网关节点。在使用CCS时,注意需要在indexName前加前面配置的clusterName别名,例子如下:
GET /twitter,cluster_one:twitter,cluster_two:twitter/_search
{
"query": {
"match": {
"user": "kimchy"
}
}
}
注意,这里的第一个twitter
是指该节点所在的集群,而cluster_one:twitter
和cluster_two:twitter
是其中两个我们配置的远程集群的别名。
查询返回结果如下:
{
"took": 150,
"timed_out": false,
"num_reduce_phases": 4,
"_shards": {
"total": 3,
"successful": 3,
"failed": 0,
"skipped": 0
},
"_clusters": {
"total": 3,
"successful": 3,
"skipped": 0
},
"hits": {
"total" : {
"value": 3,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "twitter",
"_id": "0",
"_score": 2,
"_source": {
"user": "kimchy",
"date": "2009-11-15T14:12:12",
"message": "trying out Elasticsearch",
"likes": 0
}
},
{
"_index": "cluster_one:twitter",
"_id": "0",
"_score": 1,
"_source": {
"user": "kimchy",
"date": "2009-11-15T14:12:12",
"message": "trying out Elasticsearch",
"likes": 0
}
},
{
"_index": "cluster_two:twitter",
"_id": "0",
"_score": 1,
"_source": {
"user": "kimchy",
"date": "2009-11-15T14:12:12",
"message": "trying out Elasticsearch",
"likes": 0
}
}
]
}
}
注意看查询结果的"_index"
字段,本地集群的不带前缀,而远程集群的依然带了远程集群的别名及冒号作为index的前缀。
默认情况,CCS目标节点必须全部可用,否则会导致整个搜索失败,返回空。
以下例子展示了忽略失联的集群cluster_two
不影响其他正常集群搜索结果的例子:
先设置cluster_two可以在失联时被跳过
``java
PUT _cluster/settings
{
“persistent”: {
“search.remote.cluster_two.skip_unavailable”: true
}
}
执行CCS:
```java
GET /cluster_one:twitter,cluster_two:twitter,twitter/_search
{
"query": {
"match": {
"user": "kimchy"
}
}
}
结果如下,可以看到在设置skip后2个集群本地、cluster_one搜索成功并返回结果,而cluster_two被记录到失败但不影响整个查询:
{
"took": 150,
"timed_out": false,
"_shards": {
"total": 2,
"successful": 2,
"failed": 0,
"skipped": 0
},
"_clusters": {
"total": 3,
"successful": 2,
"skipped": 1
},
"hits": {
"total": 2,
"max_score": 1,
"hits": [
{
"_index": "cluster_one:twitter",
"_type": "_doc",
"_id": "0",
"_score": 1,
"_source": {
"user": "kimchy",
"date": "2009-11-15T14:12:12",
"message": "trying out Elasticsearch",
"likes": 0
}
},
{
"_index": "twitter",
"_type": "_doc",
"_id": "0",
"_score": 2,
"_source": {
"user": "kimchy",
"date": "2009-11-15T14:12:12",
"message": "trying out Elasticsearch",
"likes": 0
}
}
]
}
}
从ES7.x开始,可以通过在搜索时在Request body配置ccs_minimize_roundtrips
,默认为true。
此时,ES会在执行CCS时将最小化协调节点和远程集群之间的网络往返开销。这样做可以减少网络延迟对搜索速度的影响。但在包括scroll-分页查询和inner hits-嵌套查询的大查询请求时,ES无法降低网络往返。
europe
)以及远程usa
、amea
集群的posts index。该请求会先到达本地集群(europe
),该集群的一个协调节点接收并解析该请求:europe
集群的协调节点:在包括scroll-分页查询和inner hits-嵌套查询的大查询请求时,ES将多个传出和传入请求发送到每个远程集群。 尽管通常速度较慢,但此方法可能适用于低延迟的网络。
europe
)以及远程usa
、amea
集群的posts index。该请求会先到达本地集群(europe
),该集群的一个协调节点接收并解析该请求:ccs_minimize_roundtrips
为true时不同,那个是发送搜索请求到所有集群而不是精确到分片):ccs_minimize_roundtrips
为true时,本CCS多了协调节点给所有远程集群发送一个search shards API(会返回搜索index需要涉及到的节点和分片信息)到其他所有远程集群的步骤,并利用此信息精确发送搜索请求给相关分片。参考Remote Cluster Info API