赞
踩
警告:ES|QL 的跨集群搜索目前处于技术预览阶段,可能会在未来版本中更改或删除。Elastic 将努力解决任何问题,但技术预览中的功能不受官方 GA 功能的支持 SLA 约束。
使用 ES|QL,你可以跨多个集群执行单个查询。
如果你还不知道如何设置跨集群安全,请参考我之前的文章 “Elasticsearch:如何为 CCR 及 CCS 建立带有安全的集群之间的互信”。在那篇文章中,我有详细的步骤描述如何使得两个集群互信,并建立远程连接。
在 Ubuntu 机器上,我们可以创建一个与 mac 电脑的远程链接:
同样在 mac 机器上,我们可以建立一个与 Ubuntu 机器的远程连接:
Elasticsearch 支持两种跨集群搜索 (CCS) 安全模型:
TLS 证书身份验证使用双向 TLS 保护远程集群。当单个管理员完全控制两个集群时,这可能是首选模型。我们通常建议两个集群中的角色及其权限相同。
请参阅 TLS 证书身份验证,了解先决条件和详细设置说明。
注意:当使用基于 API 密钥的安全模型的 ES|QL 时,此版本不支持 ENRICH
以下信息涉及使用基于 API 密钥的安全模型跨集群使用 ES|QL。你需要按照该页面上的步骤获取完整的设置说明。此页面仅包含特定于 ES|QL 的其他信息。
基于 API 密钥的跨集群搜索 (CCS) 可以更精细地控制集群之间允许的操作。当你为不同的集群配备不同的管理员,并希望更好地控制谁可以访问哪些数据时,这可能是首选模型。在此模型中,集群管理员必须明确定义授予集群和用户的访问权限。
你需要:
使用基于 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
- }
- ]
- }

然后,你将需要一个具有上面创建的权限的用户或 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 进行了丰富。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。