本文为您介绍如何通过NLB和PrivateLink实现阿里云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实例:作为远程集群,是数据的实际存储位置,被本地集群查询的目标集群。
操作流程
通过NLB和PrivateLink实现跨集群搜索的操作流程如下:
配置ES实例间私网连接:实现本地集群与远程集群的网络连通。
配置跨集群搜索:在本地集群添加远程集群的代理信息,以便本地集群通过代理访问远程集群。
测试跨集群搜索:在本地集群搜索远程集群的数据,验证跨集群搜索是否可执行。
配置ES实例间私网连接
在该步骤,您将通过NLB及PrivateLink实现本地集群与远程集群的网络连通。
阿里云NLB支持IP挂载,可通过NLB挂载远程集群的域名IP,将本地集群通过私网连接至远程集群。同时,监听及后端IP的端口需配置为9300。
步骤一:创建并配置网络型负载均衡服务NLB
详细步骤请参见创建NLB和服务器组
步骤二:创建终端节点服务
详细步骤请参见配置PrivateLink
配置跨集群搜索
在该步骤,您将通过在本地集群(即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" } } ] } }