通过NLB和PrivateLink实现跨集群搜索

更新时间:
复制 MD 格式

本文为您介绍如何通过NLBPrivateLink实现阿里云Elasticsearch(简称ES)实例的跨集群搜索。

背景信息

  • 跨集群搜索CCS(Cross Cluster Search)功能可实现无需将数据复制到本地集群,即可在本地集群中直接查询远程集群的数据。常用于在多个ES集群之间建立连接,支持联合查询、聚合、排序等操作。

  • 网络型负载均衡NLB(Network Load Balancer)实例可接收来自客户端的请求,并按照监听规则将请求分发至后端服务器。

  • 私网连接(PrivateLink)能够实现专有网络VPC与阿里云上的服务建立安全稳定的私有连接,实现私网访问服务。

前提条件

已创建两个7.7及以上版本的阿里云ES实例(ES_1、ES_2),并确保两个实例部署在相同地域及可用区下。

两个ES实例分别作为:

  • ES_1实例:作为本地集群,即发起搜索请求的集群,通过代理可直接访问远程集群中的索引数据。

  • ES_2实例:作为远程集群,是数据的实际存储位置,被本地集群查询的目标集群。

操作流程

通过NLBPrivateLink实现跨集群搜索的操作流程如下:

  1. 配置ES实例间私网连接:实现本地集群与远程集群的网络连通。

  2. 配置跨集群搜索:在本地集群添加远程集群的代理信息,以便本地集群通过代理访问远程集群。

  3. 测试跨集群搜索:在本地集群搜索远程集群的数据,验证跨集群搜索是否可执行。

配置ES实例间私网连接

在该步骤,您将通过NLBPrivateLink实现本地集群与远程集群的网络连通。

说明

阿里云NLB支持IP挂载,可通过NLB挂载远程集群的域名IP,将本地集群通过私网连接至远程集群。同时,监听及后端IP的端口需配置为9300

步骤一:创建并配置网络型负载均衡服务NLB

详细步骤请参见创建NLB和服务器组

步骤二:创建终端节点服务

详细步骤请参见配置PrivateLink

配置跨集群搜索

在该步骤,您将通过在本地集群(即ES_1实例)添加远程集群(即ES_2实例)的代理信息,实现本地集群通过代理访问远程集群的数据。

  1. 进入远程集群信息添加页面。

    1. 登录本地集群的Kibana控制台

    2. 在页面左上角单击image.png图标,选择Management > Stack Management

    3. 管理页面的左侧导航栏,单击远程集群,进入远程集群的添加页面。

  2. 添加远程集群。

    1. 单击添加远程集群

    2. 添加远程集群页面中,输入远程集群信息。

      参数

      描述

      名称

      远程集群的名称,名称必须唯一。例如,cluster_one

      连接模式

      开启使用代理模式开关,通过代理访问远程集群。

      代理地址

      代理服务器地址,格式为终端节点域名:9300。终端节点域名,即PrivateLink终端节点服务中终端节点ID的域名。

      说明

      由于CCS功能是Kibana通过数据节点之间的TCP端口(9300)访问数据节点IP的形式来进行网络互通,因此不支持HTTP端口(9200)访问。

  3. 单击下一步,按照界面指引完成信任建立。

    信任建立成功后,系统会自动连接远程集群。连接成功后,状态将显示已连接

API配置示例

PUT /_cluster/settings 
{
	"persistent": {
		"cluster": {
			"remote": {
				"<remote_cluster>": {
					"mode": "PROXY",
					"proxy_address": "终端节点域名:9300"
				}
			}
		}
	}
}

参数

描述

persistent

表示设置会持久保存,即使在集群重启后也会保留。

<remote_cluster>

替换为所要连接的远程集群名称。

mode

仅支持Proxy模式。本地集群通过配置的代理地址来访问远程集群。所有的远程请求都会发送到这个代理地址,并由代理服务器转发到远程集群的合适节点。

proxy_address

代理服务器地址,格式为PrivateLink终端节点服务下的终端节点ID的域名:9300

说明

本文CCS使用的是Elasticsearch的传输层(Transport layer),需使用9300端口进行通讯。

测试跨集群搜索

跨集群搜索配置完成后,您可按照如下步骤,验证跨集群搜索功能是否实现。

说明

本文代码仅作为示例,具体请以您实际业务使用的代码为准。

  1. 在远程集群中准备测试数据。

    说明

    若您的远程集群中已有待测试的数据,可忽略此步骤。

    1. 登录远程集群的Kibana控制台,根据页面提示进入Kibana主页。

    2. 在左侧导航栏,单击开发工具

    3. 控制台中执行以下命令,在远程集群中创建索引和文档,并插入数据。

      1. 创建索引,命令示例如下。

        PUT /twitter
        {
            "settings" : {
                "index" : {
                    "number_of_shards" : 3, 
                    "number_of_replicas" : 2 
                }
            }
        }
      2. 创建文档并插入数据,命令示例如下。

        POST twitter/_doc/
        {
            "user" : "kimchy",
            "post_date" : "2009-11-15T14:12:12",
            "message" : "trying out Elasticsearch"
        }
  2. 在本地集群验证跨集群搜索是否成功。

    登录本地集群的Kibana控制台,执行以下命令,验证跨集群搜索是否成功。

    # 跨集群搜索cluster_one集群的twitter索引数据
    POST /cluster_one:twitter/_search
    {
      "query": {
        "match_all": {}
      }
    }

    参数说明如下:

    • cluster_one:您在配置跨集群搜索步骤中配置的远程集群名称。

    • twitter:您在远程集群中创建的索引名称。

    说明

    此处需替换为您实际使用的集群及索引名称。

  3. 验证成功后,将返回如下结果。

    {
      "took": 70,
      "timed_out": false,
      "_shards": {
        "total": 3,
        "successful": 3,
        "skipped": 0,
        "failed": 0
      },
      "_clusters": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "running": 0,
        "partial": 0,
        "failed": 0,
        "details": {
          "cluster_one": {
            "status": "successful",
            "indices": "twitter",
            "took": 42,
            "timed_out": false,
            "_shards": {
              "total": 3,
              "successful": 3,
              "skipped": 0,
              "failed": 0
            }
          }
        }
      },
      "hits": {
        "total": {
          "value": 1,
          "relation": "eq"
        },
        "max_score": 1,
        "hits": [
          {
            "_index": "cluster_one:twitter",
            "_id": "tXw9IJcBWKa9yNTIjlih",
            "_score": 1,
            "_source": {
              "user": "kimchy",
              "post_date": "2009-11-15T14:12:12",
              "message": "trying out Elasticsearch"
            }
          }
        ]
      }
    }