Elasticsearch:跨集群使用 ES|QL

news2024/11/17 22:57:28

警告: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.coloradmin.cn/o/1955802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每天一个设计模式之命令模式(第二天)

交互模式中的命令模式&#xff0c;在开始记录之前&#xff0c;要讲些自己的感受&#xff0c;真真切切的感受到了悟性的瓶颈&#xff01;一共十页书&#xff0c;需要自己细细琢磨品味&#xff0c;至少三四遍才大概了解了他们间的逻辑&#xff0c;我需要调整下自己的学习思路&…

Lumos学习王佩丰Excel第七讲:认识公式与函数

一、认识Excel公式 1、运算符 运算符 作用 算术运算符 加 - 减 * 乘 / 除 % 百分比&#xff0c;相当于除以100 & 连接符&#xff0c;文本数字均可连接 ^ 乘方 比较运算符 等于 > 大于 < 小于 ≤ 小于等于 ≥ 大于等于 例1&#xff1…

python实现信号合成(DSP仿真系统)【1】

python实现信号合成(DSP仿真系统)【1】 1、效果图 2、功能结构 1、基础信号正弦波、脉冲函数、阶跃函数、斜坡函数、方波、sinc曲线、矩形波(非周期) 2、信号合成(叠加)叠加噪音 3、波形展示原始波形、叠加波形、FFT、PSD、卷积 4、各种滤波器4.1.限幅滤波器4.2.中位值滤…

【OSCP系列】OSCP靶机-BTRsys-2.1(原创)

OSCP系列靶机—BTRsys-2.1 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、主机发现 二、端口扫描 1、快速扫描 2、全端口扫描 3、服务系统探测 4、漏洞探测 80端口扫到了一些目录&#xff0c;有wordpress框…

CentOS7使用yum安装MySQL

废话不多说&#xff0c;直接上干货 1、CentOS7的yum源中默认是没有mysql的&#xff0c;我们先下载mysql的repo源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 2、安装mysql-community-release-el7-5.noarch.rpm包 sudo rpm -ivh mysql-community-r…

算法通关:007时间复杂度和空间复杂度:生成相邻两数不相等的数组

生成相邻两数不相等的数组 全部代码&#xff1a; import java.util.Arrays;/*** Author: ggdpzhk* CreateTime: 2024-07-28* 随机生成数组&#xff0c;比如每个元素都在0-3之间&#xff0c;且相邻两个元素不相同*/ public class _007 {public static void main(String[] args)…

Redis:管道

1. 面试题 如何优化频繁命令往返造成的性能瓶颈&#xff1f; 问题由来 edis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。一个请求会遵循以下步骤&#xff1a; 1 客户端向服务端发送命令分四步(发送命令→命令排队→命令执行→返回结果)&#xff0c;并监听Socket…

Vue.js 2 项目实战(九):商品列表

前言 Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架。它的设计初衷是通过采用简洁且强大的结构&#xff0c;使前端开发变得更简单和高效。以下是对 Vue.js 的详细介绍&#xff1a; 核心特性 声明式渲染 Vue.js 使用声明式语法来描述用户界面&#xff0c;通过数据绑…

力扣刷题----42. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图&#xf…

经验分享:大数据信用报告可以查到什么?哪里能查大数据?

相信不少人都因为大数据信用不良碰过壁&#xff0c;这时候不少人反过来想要了解大数据信用报告可以查到什么?哪里能查大数据?其实大数据信用报告就是通过对个人在互联网上产生的各类行为数据收集、整合和分析&#xff0c;并基于此对个人信用状况进行评估和预测的一种检测工具…

Java之快速排序

快速排序 快速排序(Quick Sort)算法&#xff0c;简称快排&#xff0c;利用的是分治的思想。 快速排序思路&#xff1a; ​ 如果要对 first->end 之间的数列进行排序&#xff0c;我们选择 first->end 之间的任意一个元素数据作为分区点(轴值Pivot)&#xff0c;然后遍历 f…

【Qt】QLabel常用属性相关API

QLabel是Qt框架中用于显示文本或图案的小部件。在Qt应用程序中&#xff0c;QLabel是用来呈现静态文本或图像给用户的重要部分 QLabel属性陈列 属性说明textQLabel中的文本内容textFormat 文本的格式 Qt::PlainText 纯文本Qt::RichText 富文本Qt::MarkdownText markdown…

Transformer--输入部分

&#x1f3f7;️上文我们简单介绍了Transformer模型的总体架构&#xff0c;本章我们主要介绍其输入部分 &#x1f4d6;前言 &#x1f4d6;文本嵌入层的作用 &#x1f4d6;位置编码器的作用 &#x1f4d6;前言 输入部分主要包括源文本嵌入层以及位置编码器&#xff0c;目标文本…

【Vulnhub系列】Vulnhub_SecureCode1靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_SecureCode1靶场渗透 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、环境配置 1、从百度网盘下载对应靶机的.ova镜像 2、在VM中选择【打开】该.ova 3、选择存储路径&#xff0…

高效管理基础设施:掌握 Terraform 的 templatefile 函数技巧

由于Terraform的许可证变更&#xff0c;我曾经担心未来的动向&#xff0c;但IBM宣布收购HashiCorp后&#xff0c;我感到有所安心。我将继续关注相关动向。 本文将介绍Terraform的内置函数templatefile。 什么是templatefile函数&#xff1f; templatefile函数用于读取指定路…

Ip2region - 基于xdb离线库的Java IP查询工具提供给脚本调用

文章目录 Pre效果实现git clone编译测试程序将ip2region.xdb放到指定目录使用改进最终效果 Pre OpenSource - Ip2region 离线IP地址定位库和IP定位数据管理框架 Ip2region - xdb java 查询客户端实现 效果 最终效果 实现 git clone git clone https://github.com/lionsou…

用SQL将数值转换为进度条

hi&#xff0c;大家好呀&#xff01; 最近天气是真的热&#xff0c;上周我们在某音做了一次直播&#xff0c;主要是讲解一下表&#xff0c;那我们最近的会在视频号&#xff0c;也就是微信上给大家直播讲解一下查询&#xff0c;直播预告晚点会分享给大家&#xff0c;请大家关注…

队列queue介绍

队列是一种常见的数据结构&#xff0c;它遵循FIFO&#xff08;先进先出&#xff09;的原则&#xff0c;即最先进入队列的元素将最先被移除。队列在Java中有多种实现方式&#xff0c;其中包括&#xff1a; 1.ArrayDeque&#xff1a;这是一个基于数组的双端队列&#xff0c;可以在…

模拟实现短信登录功能 (session 和 Redis 两种代码实例) 带前端演示

目录 整体流程 发送验证码 短信验证码登录、注册 校验登录状态 基于 session 实现登录 实现发送短信验证码功能 1. 前端发送请求 2. 后端处理请求 3. 演示 实现登录功能 1. 前端发送请求 2. 后端处理请求 校验登录状态 1. 登录拦截器 2. 注册拦截器 3. 登录完整…

Boost_Searcher测试用例编写

功能描述&#xff1a; 用户在客户端页面&#xff0c;在搜索框输入关键词&#xff0c;页面将显示Boost库中所有包含该关键词的内容。 界面功能兼容性易用性安全性性能弱网安装/卸载 编写测试用例&#xff1a; 功能&#xff1a; 在浏览器搜索框中输入ip地址与端口号&#xff0…