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

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

背景信息

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

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

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

前提条件

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

说明

创建ES时需要选择支持PrivateLink的地域和可用区。PrivateLink支持的地域,请参见支持私网连接的地域和可用区

两个ES实例分别作为:

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

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

操作流程

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

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

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

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

配置ES实例间私网连接

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

说明

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

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

网络型负载均衡NLB(Network Load Balancer)实例可以接收来自客户端的请求,并按照监听规则将请求分发至后端服务器。使用NLB服务,您需要创建一个NLB实例,并在实例中添加监听和后端服务器。

  1. 创建NLB实例。

    1. 登录网络型负载均衡NLB控制台

    2. 实例页面,单击创建网络型负载均衡

    3. 在购买页面配置实例信息。

      地域选择阿里云ES_2实例所在地域,实例网络类型选择私网,可用区选择阿里云ES_2实例所在的可用区。

      更多信息,请参见创建和管理NLB实例

  2. 创建NLB服务器组。

    每个服务器组均用于将客户端的请求路由到一个或多个后端服务器。NLB会通过健康检查来判断后端服务器的业务可用性。在为NLB实例添加监听时需要指定服务器组,监听会使用已配置的协议和端口检查客户端的连接请求,并将流量转发至相应的服务器组。

    1. 进入负载均衡NLB服务器组

    2. 服务器组页面,单击创建服务器组

    3. 在弹出的对话框中,配置服务器组。

      服务器组类型选择IP类型,自定义服务器组名称,ES_2实例对应的VPC。

  3. NLB上添加ES_2实例作为后端服务。

    在已创建的服务器组中添加ES_2实例的私网IP地址和端口。

    1. 通过终端ping获取ES_2实例私网IP地址。

      image.png

    2. 在目标服务器组的操作列,单击编辑后端服务器,按下图步骤添加获取到的IP地址及相关端口。

      说明

      端口需配置为操作使用的ES端口9300

      image

  4. 添加监听。

    1. 登录网络型负载均衡NLB控制台,进入实例页面。

    2. 在目标NLB实例的操作列单击创建监听,按下图步骤配置监听协议为TCP、端口为9300,并选择已添加的后端服务器组。image

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

说明

实例私网连接功能将自动在ES所处的环境下创建终端节点,仅需您在另一个ES所处的环境下手动创建终端节点服务。

  1. 登录终端节点服务控制台

  2. 单击创建终端节点服务

  3. 创建终端节点服务页面,配置终端节点服务。

    部分参数说明如下。更多信息,请参见创建NLB实例

    配置

    说明

    所属地域

    选择与ES相同的地域。

    服务资源类型

    选择网络型负载均衡NLB。

    选择服务资源

    已创建的NLB实例。

    服务付费者

    两者都可以选择。

  4. 单击确定创建

    创建成功后可以在服务资源区域,看到创建的终端节点服务已经和NLB绑定了。

    image

步骤三:阿里云ES实例上配置私网连接

在阿里云ES_1实例上配置私网连接,系统将自动在ES_1实例所处的网络环境下创建与终端节点服务相连接的终端节点。

  1. 登录阿里云Elasticsearch控制台

  2. 在左侧导航栏,单击Elasticsearch实例

  3. 进入目标实例。

    1. 在顶部菜单栏处,选择资源组和地域。

    2. Elasticsearch实例中单击目标实例ID。

  4. 在左侧导航栏,选择配置与管理 > 安全配置

  5. 集群网络设置区域,单击配置实例私网连接右侧的修改

  6. 配置实例私网连接面板,单击添加私网连接

  7. 在弹出的对话框中,选择已创建的终端节点服务,完成其他配置后单击确认

  8. 在终端节点的操作列,单击允许连接

    终端节点与终端节点服务连接成功后,终端节点连接状态会变为已连接,表明您已经打通了ES_1实例和ES_2实例。

  9. (可选)查看终端节点域名。

    您可以获取终端节点域名后添加到白名单,用于其他服务的配置,例如Watcher、单点登录和LDAP等。

    1. 配置实例私网连接面板中,单击目标终端节点ID

    2. 终端节点连接页签,单击目标终端节点ID前的展开符图标,可查看终端节点对应的域名。

配置跨集群搜索

在该步骤,您将通过在本地集群(即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"
            }
          }
        ]
      }
    }