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 建立带有安全的集群之间的互信” 配置两个互相的集群。我们使用如下的配置:
提示:你如果想要使用 API 秘钥来添加另外一个集群,你可以参考文章 “Elasticsearch:使用 API 密钥验证添加远程集群”
我们在 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 进行了丰富。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Elastic:监控不同于可观察性的 3 个原因
作者:来自Elastic Observability Team 监控和可观察性经常互换使用,但它们并不完全相同。监控是可观察性的重要组成部分,但可观察性远远超出了传统监控实践的范围。 关键区别:监控从各个组件收集数据 —— 何时和什么(when and what);可观察性提供对分布式系统整体行为的洞察 —— 为什么和如何(why and how)。 云格局正以惊人的速度从混合云计算架构发展到无服务器技术和分布式环境。因此,虽然监控对于较小的环境仍然有效(本质上数据和应用程序蔓延较少),但使用云原生技术的大型组织需要发展到更复杂的工具。这就是可观察性的作用所在。(告别 FOMO,继续阅读以了解事实。) 什么是监控? 监控是收集、提取和分析应用程序、基础设施和/或云遥测数据以评估系统运行状况的过程。监控依赖于指标,例如 CPU 或内存使用率和网络流量、日志和跟踪。这些数据使 IT 团队能够实时跟踪其基础设施和应用程序的性能和可用性。监控工具和平台可以提供仪表板和警报,并具有报告功能,以帮助 IT 团队监控组件、识别预测问题并解决给定环境中出现的问题。 但是,监控工具传统上是孤立的,因此并...
- 下一篇
使用 Elasticsearch 和 LlamaIndex 保护 RAG 中的敏感信息和 PII 信息
作者:来自 ElasticSrikanth Manvi 在这篇文章中,我们将研究在 RAG(检索增强生成)流程中使用公共 LLMs 时保护个人身份信息 (personal identifiable information - PII) 和敏感数据的方法。我们将探索使用开源库和正则表达式屏蔽 PII 和敏感数据,以及在调用公共 LLM 之前使用本地 LLMs 屏蔽数据。 在开始之前,让我们回顾一下我们在这篇文章中使用的一些术语。 术语 LlamaIndex 是用于构建 LLM(Large Language Model - 大型语言模型)应用程序的领先数据框架。LlamaIndex 为构建 RAG(检索增强生成)应用程序的各个阶段提供抽象。LlamaIndex 和 LangChain 等框架提供抽象,以便应用程序不会与任何特定 LLM 的 API 紧密耦合。 Elasticsearch 由 Elastic 提供。Elastic 是 Elasticsearch 背后的行业领导者,Elasticsearch 是一种搜索和分析引擎,支持精确的全文搜索、语义理解的向量搜索和兼具两全其美的混合搜索。...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6