当前位置: 首页 > news >正文

Elasticsearch:跨集群使用 ES|QL

警告:ES|QL 的跨集群搜索目前处于技术预览阶段,可能会在未来版本中更改或删除。Elastic 将努力解决任何问题,但技术预览中的功能不受官方 GA 功能的支持 SLA 约束。

使用 ES|QL,你可以跨多个集群执行单个查询。

前提:

  • 跨集群搜索需要远程集群。要在 Elasticsearch Service 上设置远程集群,请参阅在 Elasticsearch Service 上配置远程集群。如果你在自己的硬件上运行 Elasticsearch,请参阅远程集群。
  • 要确保你的远程集群配置支持跨集群搜索,请参阅支持的跨集群搜索配置。
  • 要获得完整的跨集群搜索功能,本地和远程集群必须处于同一订阅级别。
  • 本地协调节点必须具有 remote_cluster_client 节点角色。
  • 如果你使用嗅探模式(sniff mode),则本地协调节点必须能够连接到远程集群上的种子节点和网关节点。
    • 我们建议使用能够充当协调节点的网关节点。种子节点(seed nodes)可以是这些网关节点的子集。
  • 如果你使用代理模式(proxy mode),则本地协调节点必须能够连接到配置的 proxy_address。此地址的代理必须能够将连接路由到远程集群上的网关和协调节点。
  • 跨集群搜索需要本地集群和远程集群上的不同安全权限。请参阅配置跨集群搜索和远程集群的权限。

如果你还不知道如何设置跨集群安全,请参考我之前的文章 “Elasticsearch:如何为 CCR 及 CCS 建立带有安全的集群之间的互信”。在那篇文章中,我有详细的步骤描述如何使得两个集群互信,并建立远程连接。

在 Ubuntu 机器上,我们可以创建一个与 mac 电脑的远程链接:

同样在 mac 机器上,我们可以建立一个与 Ubuntu 机器的远程连接:

安全模型

Elasticsearch 支持两种跨​​集群搜索 (CCS) 安全模型:

  • TLS certificate authentication
  • API key authentication

TLS 证书身份验证

TLS 证书身份验证使用双向 TLS 保护远程集群。当单个管理员完全控制两个集群时,这可能是首选模型。我们通常建议两个集群中的角色及其权限相同。

请参阅 TLS 证书身份验证,了解先决条件和详细设置说明。

API key authentication

注意:当使用基于 API 密钥的安全模型的 ES|QL 时,此版本不支持 ENRICH

以下信息涉及使用基于 API 密钥的安全模型跨集群使用 ES|QL。你需要按照该页面上的步骤获取完整的设置说明。此页面仅包含特定于 ES|QL 的其他信息。

基于 API 密钥的跨集群搜索 (CCS) 可以更精细地控制集群之间允许的操作。当你为不同的集群配备不同的管理员,并希望更好地控制谁可以访问哪些数据时,这可能是首选模型。在此模型中,集群管理员必须明确定义授予集群和用户的访问权限。

你需要:

  • 使用创建跨集群 API 密钥 API 或使用 Kibana API 密钥 UI 在远程集群上创建 API 密钥。
  • 将 API 密钥添加到本地集群上的密钥库,作为配置本地集群的步骤的一部分。来自本地集群的所有跨集群请求都受 API 密钥的权限约束。

使用基于 API 密钥的安全模型的 ES|QL 需要一些额外的权限,而使用基于传统查询 DSL 的搜索时可能不需要这些权限。以下示例 API 调用创建一个角色,该角色可以在使用基于 API 密钥的安全模型时使用 ES|QL 查询远程索引。

POST /_security/role/remote1
{"cluster": ["cross_cluster_search"], # 1"indices": [{"names" : [""], # 2"privileges": ["read"]}],"remote_indices": [ # 3{"names": [ "logs-*" ],"privileges": [ "read","read_cross_cluster" ], # 4 "clusters" : ["my_remote_cluster"] # 5}]
}
  • 本地集群需要 cross_cluster_search 集群权限。
  • 通常,用户将具有读取本地和远程索引的权限。但是,对于角色仅用于搜索远程集群的情况,仍需要本地集群的 read 权限。要提供对本地集群的读取访问权限,但不允许读取本地集群中的任何索引,names 字段可能为空字符串。
  • 索引允许对远程集群的读取访问权限。配置的 cross-cluster API key 还必须允许读取此索引。
  • 使用基于 API 密钥的安全模型跨集群使用 ES|QL 时,始终需要 read_cross_cluster 权限。
  • 这些权限适用的远程集群。必须为此远程集群配置 cross-cluster API key 并连接到远程集群,然后才能查询远程索引。使用 Remote cluster info 验证连接。

然后,你将需要一个具有上面创建的权限的用户或 API 密钥。以下示例 API 调用创建具有 remote1 角色的用户。

POST /_security/user/remote_user
{"password" : "<PASSWORD>","roles" : [ "remote1" ]
}

请记住,来自本地集群的所有跨集群请求都受跨集群 API 密钥的权限的约束,该权限由远程集群的管理员控制。

远程集群设置

配置安全模型后,你可以添加远程集群。

以下 cluster update settings  请求添加了三个远程集群:cluster_one、cluster_two 和 cluster_three。

PUT _cluster/settings
{"persistent": {"cluster": {"remote": {"cluster_one": {"seeds": ["35.238.149.1:9300"],"skip_unavailable": true},"cluster_two": {"seeds": ["35.238.149.2:9300"],"skip_unavailable": false},"cluster_three": {  "seeds": ["35.238.149.3:9300"]}}}}
}

由于 cluster_three 上未设置 skip_unavailable,因此它使用默认值 false。有关详细信息,请参阅 Optional remote clusters 部分。

跨多个集群查询

在 FROM 命令中,使用格式 <remote_cluster_name>:<target> 指定远程集群上的数据流和索引。例如,以下 ES|QL 请求查询名为 mac 的单个远程集群上的 twitter 索引:

步骤一

按照之前的文章 “Elasticsearch:如何为 CCR 及 CCS 建立带有安全的集群之间的互信” 配置两个互相的集群。我们使用如下的配置:

我们在 mac 电脑上打入如下的命令:

PUT twitter/_doc/1
{"content": "This is Xiaoguo from Elastic"
}

我们可以在的 Ubuntu 上可以做如下的查询:

POST _query?format=txt
{"query": """FROM mac:twitter| LIMIT 10"""
}

我们在 Ubuntu 电脑上也同时生成一个 twitter 索引:

PUT twitter/_doc/1
{"content": "This is the doc from Ubuntu machine"
}

那么我们可以在 Ubuntu 机器上使用如下命令来查询所有的文档:

POST _query?format=txt
{"query": """FROM twitter, *:twitter| LIMIT 10"""
}

跨集群丰富

ES|QL 中跨集群的丰富操作与本地丰富类似。如果丰富策略及其丰富索引在所有集群中都是一致的,则只需像没有远程集群一样编写丰富命令即可。在此默认模式下,ES|QL 可以在本地集群或远程集群上执行丰富命令,旨在最大限度地减少计算或集群间数据传输。确保策略在本地集群和远程集群上都存在且数据一致对于 ES|QL 产生一致的查询结果至关重要。

注意:当使用基于 API 密钥的安全模型的 ES|QL 时,此版本不支持跨集群丰富。

我们在 mac 电脑上执行如下的命令来创建 sample_data 索引:

PUT clientips
{"mappings": {"properties": {"client.ip": {"type": "keyword"},"env": {"type": "keyword"},"location": {"type": "keyword"}}}
}PUT sample_data/_bulk
{"index": {}}
{"@timestamp": "2023-10-23T12:15:03.360Z", "client.ip": "172.21.2.162", "message": "Connected to 10.1.0.3", "event.duration": 3450233}
{"index": {}}
{"@timestamp": "2023-10-23T12:27:28.948Z", "client.ip": "172.21.2.113", "message": "Connected to 10.1.0.2", "event.duration": 2764889}
{"index": {}}
{"@timestamp": "2023-10-23T13:33:34.937Z", "client.ip": "172.21.0.5", "message": "Disconnected", "event.duration": 1232382}
{"index": {}}
{"@timestamp": "2023-10-23T13:51:54.732Z", "client.ip": "172.21.3.15", "message": "Connection error", "event.duration": 725448}
{"index": {}}
{"@timestamp": "2023-10-23T13:52:55.015Z", "client.ip": "172.21.3.15", "message": "Connection error", "event.duration": 8268153}
{"index": {}}
{"@timestamp": "2023-10-23T13:53:55.832Z", "client.ip": "172.21.3.15", "message": "Connection error", "event.duration": 5033755}
{"index": {}}
{"@timestamp": "2023-10-23T13:55:01.543Z", "client.ip": "172.21.3.15", "message": "Connected to 10.1.0.1", "event.duration": 1756467}

我们在 Ubuntu 和 mac 机器上执行如下的命令:

PUT clientips
{"mappings": {"properties": {"client.ip": {"type": "keyword"},"env": {"type": "keyword"},"location": {"type": "keyword"}}}
}

我们在 Ubuntu 和 mac 机器上执行如下的丰富策略:

PUT /_enrich/policy/clientip_policy
{"match": {"indices": "clientips","match_field": "client.ip","enrich_fields": ["env", "location"]}
}
PUT /_enrich/policy/clientip_policy/_execute

我们在 Ubuntu 机器上执行如下的命令:

PUT clientips/_bulk
{ "index" : {}}
{ "client.ip": "172.21.0.5", "env": "Development", "location": "loc1" }
{ "index" : {}}
{ "client.ip": "172.21.2.113", "env": "QA", "location": "loc2" }
{ "index" : {}}
{ "client.ip": "172.21.2.162", "env": "QA", "location": "loc3" }
{ "index" : {}}
{ "client.ip": "172.21.3.15", "env": "Production", "location":"loc4" }
{ "index" : {}}
{ "client.ip": "172.21.3.16", "env": "Production", "location": "loc5" }

我们在 Ubuntu 机器上执行如下的查询:

POST _query?format=txt
{"query": """FROM mac:sample_data| KEEP client.ip, event.duration| EVAL client.ip = TO_STRING(client.ip)| ENRICH clientip_policy ON client.ip
"""
}

从上面我们可以看出我们对 env 及 location 进行了丰富。

http://www.lryc.cn/news/408879.html

相关文章:

  • 学习笔记4:docker和k8s选择简述
  • 关于锁策略
  • 昇思25天学习打卡营第3天|基础知识-数据集Dataset
  • C++11新特性——智能指针——参考bibi《 原子之音》的视频以及ChatGpt
  • “微软蓝屏”全球宕机,敲响基础软件自主可控警钟
  • 【Linux C | 网络编程】进程间传递文件描述符socketpair、sendmsg、recvmsg详解
  • 高并发内存池(六)Page Cache回收功能的实现
  • 浅析JWT原理及牛客出现过的相关面试题
  • Spring AI (五) Message 消息
  • 【windows Docker desktop】在git bash中报错 docker: command not found 解决办法
  • 02.FreeRTOS的移植
  • 【个人笔记】一个例子理解工厂模式
  • 【C语言】数组栈的实现
  • kafka 各种选举过程
  • 树与二叉树【数据结构】
  • 简单几步,把浏览器书签转换成导航网页
  • Mac安装Hoomebrew与升级Python版本
  • 代码审计:Bluecms v1.6
  • 谷粒商城实战笔记-59-商品服务-API-品牌管理-使用逆向工程的前后端代码
  • 如何利用Jenkins自动化管理、部署数百个应用
  • Java之归并排序
  • 了解ChatGPT API
  • EasyAnimate - 阿里开源视频生成项目,国产版Sora,高质量长视频生成 本地一键整合包下载
  • 7月23日JavaSE学习笔记
  • Linux——DNS服务搭建
  • C#中的wpf基础
  • 基于微信小程序+SpringBoot+Vue的刷题系统(带1w+文档)
  • SSH -i的用法
  • 小白学习webgis的详细路线
  • 使用ChatGPT来撰写和润色学术论文的教程(含最新升级开通ChatGpt4教程)​​