本文为您介绍如何通过NLB和PrivateLink实现阿里云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实例:作为远程集群,是数据的实际存储位置,被本地集群查询的目标集群。
操作流程
通过NLB和PrivateLink实现跨集群搜索的操作流程如下:
配置ES实例间私网连接:实现本地集群与远程集群的网络连通。
配置跨集群搜索:在本地集群添加远程集群的代理信息,以便本地集群通过代理访问远程集群。
测试跨集群搜索:在本地集群搜索远程集群的数据,验证跨集群搜索是否可执行。
配置ES实例间私网连接
在该步骤,您将通过NLB及PrivateLink实现本地集群与远程集群的网络连通。
阿里云NLB支持IP挂载,可通过NLB挂载远程集群的域名IP,将本地集群通过私网连接至远程集群。同时,监听及后端IP的端口需配置为9300
。
步骤一:创建并配置网络型负载均衡服务NLB
网络型负载均衡NLB(Network Load Balancer)实例可以接收来自客户端的请求,并按照监听规则将请求分发至后端服务器。使用NLB服务,您需要创建一个NLB实例,并在实例中添加监听和后端服务器。
创建NLB实例。
在实例页面,单击创建网络型负载均衡。
在购买页面配置实例信息。
地域选择阿里云ES_2实例所在地域,实例网络类型选择私网,可用区选择阿里云ES_2实例所在的可用区。
更多信息,请参见创建和管理NLB实例。
创建NLB服务器组。
每个服务器组均用于将客户端的请求路由到一个或多个后端服务器。NLB会通过健康检查来判断后端服务器的业务可用性。在为NLB实例添加监听时需要指定服务器组,监听会使用已配置的协议和端口检查客户端的连接请求,并将流量转发至相应的服务器组。
在服务器组页面,单击创建服务器组。
在弹出的对话框中,配置服务器组。
服务器组类型选择IP类型,自定义服务器组名称,ES_2实例对应的VPC。
在NLB上添加ES_2实例作为后端服务。
在已创建的服务器组中添加ES_2实例的私网IP地址和端口。
通过终端ping获取ES_2实例私网IP地址。
在目标服务器组的操作列,单击编辑后端服务器,按下图步骤添加获取到的IP地址及相关端口。
说明端口需配置为操作使用的ES端口
9300
。
添加监听。
登录网络型负载均衡NLB控制台,进入实例页面。
在目标NLB实例的操作列单击创建监听,按下图步骤配置监听协议为TCP、端口为
9300
,并选择已添加的后端服务器组。
步骤二:创建终端节点服务
实例私网连接功能将自动在ES所处的环境下创建终端节点,仅需您在另一个ES所处的环境下手动创建终端节点服务。
单击创建终端节点服务。
在创建终端节点服务页面,配置终端节点服务。
部分参数说明如下。更多信息,请参见创建NLB实例。
配置
说明
所属地域
选择与ES相同的地域。
服务资源类型
选择网络型负载均衡NLB。
选择服务资源
已创建的NLB实例。
服务付费者
两者都可以选择。
单击确定创建。
创建成功后可以在服务资源区域,看到创建的终端节点服务已经和NLB绑定了。
步骤三:阿里云ES实例上配置私网连接
在阿里云ES_1实例上配置私网连接,系统将自动在ES_1实例所处的网络环境下创建与终端节点服务相连接的终端节点。
在左侧导航栏,单击Elasticsearch实例。
进入目标实例。
在顶部菜单栏处,选择资源组和地域。
在Elasticsearch实例中单击目标实例ID。
在左侧导航栏,选择 。
在集群网络设置区域,单击配置实例私网连接右侧的修改。
在配置实例私网连接面板,单击添加私网连接。
在弹出的对话框中,选择已创建的终端节点服务,完成其他配置后单击确认。
在终端节点的操作列,单击允许连接。
终端节点与终端节点服务连接成功后,终端节点连接状态会变为已连接,表明您已经打通了ES_1实例和ES_2实例。
(可选)查看终端节点域名。
您可以获取终端节点域名后添加到白名单,用于其他服务的配置,例如Watcher、单点登录和LDAP等。
在配置实例私网连接面板中,单击目标终端节点ID。
在终端节点连接页签,单击目标终端节点ID前的
图标,可查看终端节点对应的域名。
配置跨集群搜索
在该步骤,您将通过在本地集群(即ES_1实例)添加远程集群(即ES_2实例)的代理信息,实现本地集群通过代理访问远程集群的数据。
进入远程集群信息添加页面。
登录本地集群的Kibana控制台。
在页面左上角单击
图标,选择Management > Stack Management。
在管理页面的左侧导航栏,单击远程集群,进入远程集群的添加页面。
添加远程集群。
单击添加远程集群。
在添加远程集群页面中,输入远程集群信息。
参数
描述
名称
远程集群的名称,名称必须唯一。例如,
cluster_one
。连接模式
开启使用代理模式开关,通过代理访问远程集群。
代理地址
代理服务器地址,格式为
终端节点域名:9300
。终端节点域名,即PrivateLink终端节点服务中终端节点ID的域名,可参考查看终端节点域名获取。说明由于CCS功能是Kibana通过数据节点之间的TCP端口(9300)访问数据节点IP的形式来进行网络互通,因此不支持HTTP端口(9200)访问。
单击下一步,按照界面指引完成信任建立。
信任建立成功后,系统会自动连接远程集群。连接成功后,状态将显示已连接。
API配置示例
PUT /_cluster/settings
{
"persistent": {
"cluster": {
"remote": {
"<remote_cluster>": {
"mode": "PROXY",
"proxy_address": "终端节点域名:9300"
}
}
}
}
}
参数 | 描述 |
persistent | 表示设置会持久保存,即使在集群重启后也会保留。 |
<remote_cluster> | 替换为所要连接的远程集群名称。 |
mode | 仅支持Proxy模式。本地集群通过配置的代理地址来访问远程集群。所有的远程请求都会发送到这个代理地址,并由代理服务器转发到远程集群的合适节点。 |
proxy_address | 代理服务器地址,格式为 说明 本文CCS使用的是Elasticsearch的传输层(Transport layer),需使用 |
测试跨集群搜索
跨集群搜索配置完成后,您可按照如下步骤,验证跨集群搜索功能是否实现。
本文代码仅作为示例,具体请以您实际业务使用的代码为准。
在远程集群中准备测试数据。
说明若您的远程集群中已有待测试的数据,可忽略此步骤。
登录远程集群的Kibana控制台,根据页面提示进入Kibana主页。
在左侧导航栏,单击开发工具。
在控制台中执行以下命令,在远程集群中创建索引和文档,并插入数据。
创建索引,命令示例如下。
PUT /twitter { "settings" : { "index" : { "number_of_shards" : 3, "number_of_replicas" : 2 } } }
创建文档并插入数据,命令示例如下。
POST twitter/_doc/ { "user" : "kimchy", "post_date" : "2009-11-15T14:12:12", "message" : "trying out Elasticsearch" }
在本地集群验证跨集群搜索是否成功。
登录本地集群的Kibana控制台,执行以下命令,验证跨集群搜索是否成功。
# 跨集群搜索cluster_one集群的twitter索引数据 POST /cluster_one:twitter/_search { "query": { "match_all": {} } }
参数说明如下:
cluster_one:您在配置跨集群搜索步骤中配置的远程集群名称。
twitter:您在远程集群中创建的索引名称。
说明此处需替换为您实际使用的集群及索引名称。
验证成功后,将返回如下结果。
{ "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" } } ] } }