注: 部分概念介绍来源于网络
一、概念 Elasticsearch在5.3版本中引入了Cross Cluster Search(CCS 跨集群搜索)功能,用来替换掉要被废弃的Tribe Node。类似Tribe Node,Cross Cluster Search用来实现跨集群的数据搜索。跨集群搜索使您可以针对一个或多个远程集群运行单个搜索请求 。例如,您可以使用跨集群搜索来过滤和分析存储在不同数据中心的集群中的日志数据。 1)Cross Cluster Search简介 cross-cluster search功能允许任何节点作为跨多个群集的federated client(联合客户端),与tribe node不同的是cross-cluster search节点并不会加入remote cluster(远程集群),而是用轻量的方法连接到remote cluster,以便执行federated search(联合搜索) 2)Remote cluster 要使用cross-cluster search之前需要先了解remote cluster 一个remote cluster中有"name"和seed nodes(种子节点)列表以供引用,注册remote cluster时,会从其中一个seed node来检查其集群状态,以便在默认情况下选择最多三个有资格的节点作为gateway nodes(网关节点), 集群中配置了remote cluster的每个节点都连接到一个或多个gateway nodes,并使用它们将federated search到remote cluster。 可以使用集群设置(可以动态更新)在全局指定remote cluster,也可以在各个节点中的elasticsearch.yml指定remote cluster 。 如果节点通过elasticsearch.yml文件配置remote cluster,则可以通过该节点连接到remote cluster。换句话说,federated search只有发送到该节点才能连接到remote cluster。通过cluster settings API 设置的remote cluster集群中的每个节点(设置了cluster.remote.connect: true的节点)都可以连接。 二、配置Cross Cluster Search 有2种方式可以用来配置CCS: 1)配置elasticsearch.yml search: ? remote: ? ? elasticsearch-1: ? ? ? seeds: 127.0.0.1:9300 ?? ? ?seeds: 127.0.0.1:9301 ? ? ? seeds: 127.0.0.1:9302 ? ? elasticsearch-2: ? ? ? seeds: 192.168.8.185:8300 ? ? ? seeds: 192.168.8.185:8301 ?? ? ?seeds: 192.168.8.185:8302 注意:以上方式,在配置的时候,需要remote cluster处在运行状态。比如在配置“america”的集群的时候,需要“europe”集群处在运行状态,否则节点无法启动成功。 2)使用 Cluster Settings API配置 PUT _cluster/settings { ? "persistent": { ? ? "cluster": { ? ? ? "remote": { ? ? ? ? "elasticsearch-1": { ? ? ? ? ? "seeds": [ ? ? ? ? ? ? "127.0.0.1:9300", ? ? ? ? ? ? "127.0.0.1:9301", ? ? ? ? ? ? "127.0.0.1:9302" ? ? ? ? ? ] ? ? ? ? }, ? ? ? ? "elasticsearch-2": { ? ? ? ? ? "seeds": [ ? ? ? ? ? ? "192.168.8.185:8300", ? ? ? ? ? ? "192.168.8.185:8301", ? ? ? ? ? ? "192.168.8.185:8302" ? ? ? ? ? ] ? ? ? ? } ? ? ? } ? ? } ? } } 推荐使用API方式,可以方便的修改remote cluster的seeds和其他配置。 3)删除远程群集: PUT _cluster/settings { ? "persistent": { ? ? "cluster": { ? ? ? "remote": { ? ? ? ? "elasticsearch-2": { ? ? ? ? ? "seeds": null? ? ? ? ? } ? ? ? } ? ? } ? } } 如果想要delete一个remote cluster,则把对应的seeds设置为null即可。 三、验证Cross Cluster Search 1)使用_remote/info查看CCS连接状态: GET _remote/info 2)使用跨集群搜索: 同时查询2个集群的数据: GET /elasticsearch-1:elasticsearch-1,elasticsearch-2:elasticsearch-2/_search cross-cluster search还可以在不同群集上搜索相同名称的index GET /elasticsearch-2:elasticsearch-1,elasticsearch-1/_search 搜索结果的歧义与索引在请求中消除歧义的方式相同。即使index名称相同,这些index也会在合并结果时被视为不同的index。从远程index检索的所有结果都将以remote cluster的name为前缀: 五、CCS的配置 1)seeds 配置的远程集群的remote cluster的一个node。 2)connected 如果至有少一个到远程集群的连接则为true。 3)num_nodes_connected 远程集群中连接节点的数量。 4)max_connections_per_cluster 远程集群维护的最大连接数。 5)transport.ping_schedule 设置了tcp层面的活性监听 6)skip_unavailable 设置为true的话,当这个remote cluster不可用的时候,就会忽略,默认是false,当对应的remote cluster不可用的话,则会报错。 7)cluster.remote.connections_per_cluster gateway nodes数量,默认是3 8)cluster.remote.initial_connect_timeout 节点启动时等待远程节点的超时时间,默认是30s 9)cluster.remote.node.attr: 一个节点属性,用于过滤掉remote cluster中 符合gateway nodes的节点,比如设置cluster.remote.node.attr=gateway,那么将匹配节点属性node.attr.gateway: true 的node才会被该node连接用来做CCS查询。 10)cluster.remote.connect: 默认情况下,群集中的任意节点都可以充当federated client并连接到remote cluster,cluster.remote.connect可以设置为 false(默认为true)以防止某些节点连接到remote cluster 11)在使用api进行动态设置的时候每次都要把seeds带上 六、remote cluster search的两种模式 有两种模式来进行remote cluster search,这两种是基于不同的网络情况来做的选择 1)最小化网络通信次数 这种情况也是默认的情况,当前es的协调节点针对一次请求只访问对应的remote cluster一次,拉取回来所有的的数据,减少了网络交互的次数,减少了网络延迟。 2)非最小化网络通信次数 当前es的协调节点对应一次search会请求remote cluster两次,一次是获取remote cluster的shard信息,第二次是直接请求remote的对应的shard进行数据获取。 感觉这种方式对于网络比较好的集群来说,效果更好,减少了一次数据聚合的过程,直接在当前cluster的协调节点对数据进行组装即可。 ?
|