跨集群搜索(cross-cluster search)使您可以針對一個或多個遠程集群運行單個搜索請求。 例如,您可以使用跨集群搜索來篩選和分析存儲在不同數據中心的集群中的日志數據。

如上面所述,當我們的client向集群cluster_1發送請求時,它可以搜索自己本身的集群,同時也可以向另外的兩個集群cluster_2及cluster_3發送請求。最后的結果由cluster_1返回給客戶端。

目前支持的APIs:
- Search
- Multi search
- Search template
- Multi search template
跨集群搜索例子
注冊remote cluster
要執行跨集群搜索,必須至少配置一個遠程集群。在集群設置中配置了遠程群集
- 使用cluster.remote屬性
- 種子(seeds)是遠程集群中的節點列表,用於在注冊遠程集群時檢索集群狀態
我們在windows環境上模擬啟動三個es集群

三個es節點的配置依次如下所示
第一個集群

第二個集群

第三個集群

要執行跨集群搜索, 必須至少配置一個遠程集群. 在每一個集群中都需要如下配置:
1, 使用 cluster.remote 屬性
2, 種子 (seeds) 是遠程集群中的節點列表, 用於在注冊遠程集群時檢索集群狀態
1、注意是每一個集群中需要進行設置,我們分部部署三個kibana,每個kibana分別連接一個集群,
2、需要保證各個集群已經正常啟動成功
我們在kibana上面執行下面的命令
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" ] } } } } }
執行成功之后,返回值如下
{ "acknowledged": true, "persistent": { "search": { "remote": { "cluster_three": { "seeds": [ "127.0.0.1:9302" ] }, "cluster_two": { "seeds": [ "127.0.0.1:9301" ] }, "cluster_one": { "seeds": [ "127.0.0.1:9300" ] } } } }, "transient": {} }
我們可以使用 GET _remote/info 查看 CSS 的連接狀態, 如下:
{ "cluster_three": { "seeds": [ "127.0.0.1:9302" ], "http_addresses": [ "192.168.1.4:9202" ], "connected": true, "num_nodes_connected": 1, "max_connections_per_cluster": 3, "initial_connect_timeout": "30s", "skip_unavailable": false }, "cluster_one": { "seeds": [ "127.0.0.1:9300" ], "http_addresses": [ "192.168.1.4:9200" ], "connected": true, "num_nodes_connected": 1, "max_connections_per_cluster": 3, "initial_connect_timeout": "30s", "skip_unavailable": false }, "cluster_two": { "seeds": [ "127.0.0.1:9301" ], "http_addresses": [ "192.168.1.4:9201" ], "connected": true, "num_nodes_connected": 1, "max_connections_per_cluster": 3, "initial_connect_timeout": "30s", "skip_unavailable": false } }
這里一定要注意有幾個集群就執行幾次此命令. 那么這樣, 一個 CSS 集群就這樣配置完成了.以下cluster update settings API請求添加了三個遠程集群:cluster_one,cluster_two和cluster_three。這里名字可以不和es的配置文件中的集群名稱一樣,cluster_one和cluster_two表示與每個群集連接的任意群集別名
在上面可能有很多人感到疑問:為啥我們還需要配置端口地址 9300 及 9301?事實上,Elasticsearch 中有兩種重要的網絡通信機制需要了解:
- HTTP:用於 HTTP 通信綁定的地址和端口,這是 Elasticsearch REST API 公開的方式
- transport:用於集群內節點之間的內部通信

刪除遠程配置的api配置命令
PUT _cluster/settings { "persistent": { "search": { "remote": { "cluster_two": { "skip_unavailable": null, "seeds": null }, "cluster_three": { "skip_unavailable": null, "seeds": null } } } } }
接下來我們來進行驗證
我們設置
cluster_two和cluster_three之間可以相互通信
我們在
cluster_two和cluster_three上面分表執行下面的命令
PUT _cluster/settings { "persistent": { "search": { "remote": { "cluster_two": { "skip_unavailable": true, "seeds": [ "127.0.0.1:9301" ] }, "cluster_three": { "skip_unavailable": true, "seeds": [ "127.0.0.1:9302" ] } } } } }
我們在集群3上面創建下面的索引
PUT sms-logs-index/sms-logs-type/20 { "corpName":"汗牛養車", "createDate":"2020-01-22", "fee":3, "ipAddr":"10.123.98.1", "longCode":106900000009, "mobile":18780278756, "operatorId":1, "province":"北京", "replyTotal":10, "sendDate":"2020-01-22", "smsContent":"【途虎養車】親愛的舊居茫水東降級就", "state":0 }
我們在集群2上傳創建一個book的索
PUT /book/emp/1 {"name":"小黑","age":23,"bir":"2012-12-12","content":"為開發團隊選擇一款優秀的MVC框架是件難事兒,在眾多可行的方案中決擇需要很高的經驗和水平","address":"北京"}
接下來我們登錄到集群3的機器上面訪問集群2的索引
GET /cluster_two:book/_search
這里查詢的結構為集群名稱加上索引
返回的結果如下
我們在集群三上面精確查詢,下面這個格式可以不

我們發現這種查詢會保存,es遠程查詢暫時只支持下面的幾種方式



也可以寫成下面的方式遠程查詢cluster_two集群上面索引名稱以boo開頭的數據
GET /cluster_two:boo*/_search
同理在集群2上面遠程查sms-logs-index的索引類似
接下來我要查詢多個索引如何查詢了,使用下面的命令,我們在集群3上面使用下面的命令
GET /cluster_two:book,cluster_three:sms-logs-index/_search
查詢結果如下
{ "took": 32, "timed_out": false, "_shards": { "total": 10, "successful": 10, "skipped": 0, "failed": 0 }, "_clusters": { "total": 2, "successful": 2, "skipped": 0 }, "hits": { "total": 3, "max_score": 1, "hits": [ { "_index": "cluster_three:sms-logs-index", "_type": "sms-logs-type", "_id": "2", "_score": 1, "_source": { "corpName": "汗牛養車", "createDate": "2020-01-22", "fee": 3, "ipAddr": "10.123.98.1", "longCode": 106900000009, "mobile": 18780278756, "operatorId": 1, "province": "北京", "replyTotal": 10, "sendDate": "2020-01-22", "smsContent": "【途虎養車】親愛的舊居茫水東降級就", "state": 0 } }, { "_index": "cluster_three:sms-logs-index", "_type": "sms-logs-type", "_id": "20", "_score": 1, "_source": { "corpName": "汗牛養車", "createDate": "2020-01-22", "fee": 3, "ipAddr": "10.123.98.1", "longCode": 106900000009, "mobile": 18780278756, "operatorId": 1, "province": "北京", "replyTotal": 10, "sendDate": "2020-01-22", "smsContent": "【途虎養車】親愛的舊居茫水東降級就", "state": 0 } }, { "_index": "cluster_two:book", "_type": "emp", "_id": "1", "_score": 1, "_source": { "name": "小黑", "age": 23, "bir": "2012-12-12", "content": "為開發團隊選擇一款優秀的MVC框架是件難事兒,在眾多可行的方案中決擇需要很高的經驗和水平", "address": "北京" } } ] } }
從上面的結果可以,es把兩個集群下面查詢到的索引的結果做了聚合返回給了客戶端
下面還有一個需求,我要遍歷所有集群下面的全部book的索引,集群名稱可以用下面的*代替
GET /*:book/_search
返回的結果如下
{ "took": 20, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "_clusters": { "total": 2, "successful": 1, "skipped": 1 }, "hits": { "total": 1, "max_score": 1, "hits": [ { "_index": "cluster_two:book", "_type": "emp", "_id": "1", "_score": 1, "_source": { "name": "小黑", "age": 23, "bir": "2012-12-12", "content": "為開發團隊選擇一款優秀的MVC框架是件難事兒,在眾多可行的方案中決擇需要很高的經驗和水平", "address": "北京" } } ] } }
下面的需求
GET /*:book,*:sms-logs-index/_search查詢所用集群中的book索引和索引集群中的sms-logs-index
我們來看看結果,我們發現結果為空

所以對於遠程查詢,我們最好事先知道哪些索引在哪些集群上面,按照這種方式來進行查詢
GET /*:book/_search
這種查詢在生產上我們可以使用到,一個系統同時部署在兩個es集群中,福州es集群和上海es集群中,兩個集群中的索引的名稱都是一樣的,我們就可以使用上面的兩種方式進行聚合查詢
上面我們的列子中,一個集群都是單機的,如果集群下面存在多個機器,我們要采用下面的方式

第二,我們在kibana上面也可以遠程查詢
列如我們在集群3上面查詢集群2上面的索引
我們輸入*:就會自動提示

es跨集群官網的地址為:
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-cross-cluster-search.html
屬性2
Skip unavailable clustersedit By default, a cross-cluster search returns an error if any cluster in the request is unavailable. To skip an unavailable cluster during a cross-cluster search, set the skip_unavailable cluster setting to true. The following cluster update settings API request changes cluster_two's skip_unavailable setting to true. PUT _cluster/settings { "persistent": { "cluster.remote.cluster_two.skip_unavailable": true } } Copy as cURL View in Console If cluster_two is disconnected or unavailable during a cross-cluster search, Elasticsearch won’t include matching documents from that cluster in the final results.
上面還有一個點:在設置遠程連接的時候
對於7以上的版本設置的時候

我們上面演示的是6.2.4版本的

這里要注意下
