1、简介
Elasticsearch在5.3版本中引入了Cross Cluster Search(CCS 跨集群搜索)功能,用来替换掉要被废弃的Tribe Node。类似Tribe Node,Cross Cluster Search用来实现跨集群的数据搜索。跨集群搜索使您可以针对一个或多个远程集群运行单个搜索请求 。例如,您可以使用跨集群搜索来过滤和分析存储在不同数据中心的集群中的日志数据。
跨集群查询允许你的请求查询多个集群的数据,这个特性帮助我们更好的设计我们的架构。
分布式系统或微服务里将系统分为多个模块,模块A由一个团队,模块B由一个团队负责,模块C由一个团队负责,通常各个模块只查询各自的日志,但有些问题涉及多个模块时会查到多个模块的日志,这时跨集群查询刚好可以解决这类问题,对架构来说我们将模块A、模块B、模块C的日志存储在单独的集群里。
这样可以避免集群之间相互的干扰,模块A的日志量大只会影响集群A的写入,做到分而治之。
2、配置Cross Cluster Search
假设我们有2个ES集群:
Node | Address | Port | Transport Port | Cluster |
elasticsearch01 | 127.0.0.1 | 9201 | 9301 | America |
elasticsearch02 | 127.0.0.1 | 9202 | 9302 | America |
elasticsearch03 | 127.0.0.1 | 9203 | 9303 | Europe |
elasticsearch04 | 127.0.0.1 | 9204 | 9304 | Europe |
有2种方式可以用来配置CCS:
1)配置elasticsearch.yml
search:
remote:
america:
seeds: 127.0.0.1:9301
seeds: 127.0.0.1:9302
europe:
seeds: 127.0.0.1:9303
seeds: 127.0.0.1:9304
注意:以上方式,在配置的时候,需要remote cluster处在运行状态。比如在配置“america”的集群的时候,需要“europe”集群处在运行状态,否则节点无法启动成功。
2)使用 Cluster Settings API配置
curl -XPUT -H'Content-Type: application/json' localhost:9201/_cluster/settings -d '
{
"persistent": {
"search.remote": {
"america": {
"skip_unavailable": "true",
"seeds": ["127.0.0.1:9301","127.0.0.1:9302"]
},
"europe": {
"skip_unavailable": "true",
"seeds": ["127.0.0.1:9303","127.0.0.1:9304"]
}
}
}
}'
推荐使用API方式,可以方便的修改remote cluster的seeds和其他配置。
3、验证Cross Cluster Search
1)使用_remote/info查看CCS连接状态:
[root@localhost elasticsearch01]# curl -XGET -H 'Content-Type: application/json' localhost:9201/_remote/info?pretty
{
"america" : {
"seeds" : [
"127.0.0.1:9301",
"127.0.0.1:9302"
],
"http_addresses" : [
"127.0.0.1:9201",
"127.0.0.1:9202"
],
"connected" : true,
"num_nodes_connected" : 2,
"max_connections_per_cluster" : 3,
"initial_connect_timeout" : "30s"
},
"europe" : {
"seeds" : [
"127.0.0.1:9303",
"127.0.0.1:9304"
],
"http_addresses" : [
"127.0.0.1:9203",
"127.0.0.1:9204"
],
"connected" : true,
"num_nodes_connected" : 2,
"max_connections_per_cluster" : 3,
"initial_connect_timeout" : "30s"
}
}
2)使用跨集群搜索:
同时查询2个集群的数据:
GET /cluster_name:index,cluster_name:index/_search
GET */index/_search
java API 示例:
//查询所有集群,以appIndex-开头的数据
SearchRequest searchRequest = Requests.searchRequest("*:appIndex-*");
SearchResponse response = es.getClient().search(searchRequest).get();
4、Disable Cross Cluster Search
使用API设置:
curl -XPUT -H'Content-Type: application/json' localhost:9201/_cluster/settings -d '
{
"persistent": {
"search.remote": {
"america": {
"skip_unavailable": null,
"seeds": null
},
"europe": {
"skip_unavailable": null,
"seeds": null
}
}
}
}'
5、CCS的配置
search.remote.${cluster_alias}.skip_unavailable:查询的时候skip不可达的集群,默认false,推荐设置为true
search.remote.connect:默认true,即任何node都作为一个cross-cluster client去连接remote cluster,跨集群搜索的请求必须发给cross-cluster client。
search.remote.node.attr:设置remote node的属性,比如search.remote.node.attr:gateway这样设置,只有node.attr.gateway: true的node才会被该node连接用来做CCS查询。
参考:
https://www.elastic.co/guide/en/elasticsearch/reference/6.2/modules-cross-cluster-search.html
https://www.cnblogs.com/luxiaoxun/p/9865389.html