怎么又是你

【源码篇】elasticsearch 搜索模块之cross-cluster-search

Elasticsearch | 作者 jiangtao | 发布于2017年10月26日 | | 阅读数:5810

一:cross-cluster-search简述:

cross cluster search(跨集群搜索)功能允许任何节点在多个集群之间充当federated client(联合客户端)。 与tribe node(部落节点)功能相比,进行cross cluster search(跨集群搜索)的节点将不会加入远程集群,而是以轻量的方式连接到远程集群,以便执行联合搜索请求。
cross cluster search(跨集群搜索)的工作原理是在集群状态中配置一个远程集群,并且仅连接到远程集群中有限数量的节点。 每个远程集群都由一个名称和一个seed nodes(种子节点)的列表引用。 这些seed nodes(种子节点)用于发现远程集群中有资格作为gateway nodes(网关节点)的节点。 集群中配置了远程集群的每个节点都连接到一个或多个gateway nodes(网关节点),并使用它们将搜索请求联合到远程集群。
注意
此功能处于测试阶段,可能会发生变化。设计和代码不如官方GA功能成熟。弹性将采取最大的努力来解决任何问题,但beta功能不受SLA官方GA功能的支持。

二:配置跨集群搜索:
远程集群可以通过cluster settings API(集群设置api)来全局性地指定(可以动态更新),或者在各个节点的elasticsearch.yml文件中单独设定
如果通过elasticsearch.yml配置远程集群,则只有具有该配置的节点才能连接到远程集群。 换句话说,联合搜索请求必须被专门发送到那些节点。 通过cluster settings API(集群设置api)设置的远程集群在集群中的每个节点上都可用。
注意
此功能已添加到Elasticsearch v5.3中,并且要求gateway eligible(具有网关资格)的节点在v5.3之后。

对于cross cluster search(跨集群搜索)节点的elasticsearch.yml配置文件只需要列出应连接到远程集群,例如:
search:
remote:
cluster_one:
seeds: 127.0.0.1:9300
cluster_two:
seeds: 127.0.0.1:9301


cluster_one和cluster_two是表示与每个集群的连接的任意集群别名。 这些名称随后用于区分本地和远程索引。

使用cluster settings API(集群设置api)将远程集群添加到集群中的所有节点的示例如下:
PUT _cluster/settings
{
"persistent": {
"search": {
"remote": {
"cluster_one": {
"seeds": [
"127.0.0.1:9300"
]
},
"cluster_two": {
"seeds": [
"127.0.0.1:9301"
]
}
}
}
}
}


通过将其种子设置为null,可以从群集设置中删除远程群集::
PUT _cluster/settings
{
"persistent": {
"search": {
"remote": {
"cluster_one": {
"seeds": null
}
}
}
}
}


cluster_one将从集群设置中删除,cluster_two保持不变。

使用跨集群搜索
要搜索远程群集cluster_one上的twitter索引,index(索引)名称必须带有以:字符分隔的群集别名的前缀:
POST /cluster_one:twitter/tweet/_search
{
"query": {
"match_all": {}
}
}


与tribe(部落)功能相反,cross cluster search(跨群集搜索)还可以搜索具有相同名称的不同群集的索引:
POST /cluster_one:twitter,twitter/tweet/_search
{
"query": {
"match_all": {}
}
}

搜索结果的消歧与在请求中消除索引歧义的方法相同。 即使索引名称相同,当结果合并时,这些索引将被视为不同的索引。 从远程索引检索的所有结果将以其远程集群名称作为前缀:
{
"took" : 89,
"timed_out" : false,
"_shards" : {
"total" : 10,
"successful" : 10,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 1.0,
"hits" : [
{
"_index" : "cluster_one:twitter",
"_type" : "tweet",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"user" : "kimchy",
"postDate" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
},
{
"_index" : "twitter",
"_type" : "tweet",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"user" : "kimchy",
"postDate" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
}
]
}
}

跨集群搜索配置
search.remote.connections_per_cluster
要连接到每个远程集群的节点数。 默认值为3。 
search.remote.initial_connect_timeout
节点启动时与远程节点建立连接的等待时间。 默认是30秒。 
search.remote.node.attr
过滤掉远程集群中有资格作为gateway node(网关节点)的节点的节点属性。 例如,节点可以具有节点属性node.attr.gateway:true,如果search.remote.node.attr设置为gateway,只有具有此属性的节点才能将连接到。 
search.remote.connect
默认情况下,群集中的任何节点都可以充当 cross-cluster client(跨群集客户端)并连接到远程群集。 search.remote.connect设置可以设置为false(默认为true),以防止某些节点连接到远程群集。 Cross-cluster search(跨群集搜索)请求必须发送到允许充当跨群集客户端的节点。

三:官方文档
https://www.elastic.co/guide/e ... tings

[尊重社区原创,转载请保留或注明出处]
本文地址:http://searchkit.cn/article/336


2 个评论

请问配置了Cross Cluster Search,之前集群内部还配置了x-pack认证。那么两个集群要想使用Cross Cluster Search的话是不是必须要配置成一样的用户名和密码?
用户鉴权在本地集群中进行。然后如果检索涉及到远端集群,那么在查询远端的时候,用户名和角色名会被发送到远端集群做鉴权,所有远端集群要配置有对应的用户名和角色名。

如果是使用API Key访问本地集群,那么本地集群找到找到API Key对应的用户名和角色名传递到远端机群。

整个过程中,远端集群不需要密码做认证,因为本地集群已经做好认证了,远端集群只需要通过角色和用户做好鉴权即可。

总结如下:
1,本地集群做认证和鉴权
2,远端集群只做鉴权

要回复文章请先登录注册