esql-across-clusters.asciidoc 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. [[esql-cross-clusters]]
  2. === Using {esql} across clusters
  3. ++++
  4. <titleabbrev>Using {esql} across clusters</titleabbrev>
  5. ++++
  6. [partintro]
  7. preview::["{ccs-cap} for {esql} is in technical preview and may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features."]
  8. [NOTE]
  9. ====
  10. For {ccs-cap} with {esql} on version 8.16 or later, remote clusters must also be on version 8.16 or later.
  11. ====
  12. With {esql}, you can execute a single query across multiple clusters.
  13. [discrete]
  14. [[esql-ccs-prerequisites]]
  15. ==== Prerequisites
  16. include::{es-ref-dir}/search/search-your-data/search-across-clusters.asciidoc[tag=ccs-prereqs]
  17. include::{es-ref-dir}/search/search-your-data/search-across-clusters.asciidoc[tag=ccs-gateway-seed-nodes]
  18. include::{es-ref-dir}/search/search-your-data/search-across-clusters.asciidoc[tag=ccs-proxy-mode]
  19. [discrete]
  20. [[esql-ccs-security-model]]
  21. ==== Security model
  22. {es} supports two security models for cross-cluster search (CCS):
  23. * <<esql-ccs-security-model-certificate, TLS certificate authentication>>
  24. * <<esql-ccs-security-model-api-key, API key authentication>>
  25. [TIP]
  26. ====
  27. To check which security model is being used to connect your clusters, run `GET _remote/info`.
  28. If you're using the API key authentication method, you'll see the `"cluster_credentials"` key in the response.
  29. ====
  30. [discrete]
  31. [[esql-ccs-security-model-certificate]]
  32. ===== TLS certificate authentication
  33. TLS certificate authentication secures remote clusters with mutual TLS.
  34. This could be the preferred model when a single administrator has full control over both clusters.
  35. We generally recommend that roles and their privileges be identical in both clusters.
  36. Refer to <<remote-clusters-cert, TLS certificate authentication>> for prerequisites and detailed setup instructions.
  37. [discrete]
  38. [[esql-ccs-security-model-api-key]]
  39. ===== API key authentication
  40. [NOTE]
  41. ====
  42. `ENRICH` is *not supported* in this version when using {esql} with the API key based security model.
  43. ====
  44. The following information pertains to using {esql} across clusters with the <<remote-clusters-api-key, *API key based security model*>>. You'll need to follow the steps on that page for the *full setup instructions*. This page only contains additional information specific to {esql}.
  45. API key based cross-cluster search (CCS) enables more granular control over allowed actions between clusters.
  46. This may be the preferred model when you have different administrators for different clusters and want more control over who can access what data. In this model, cluster administrators must explicitly define the access given to clusters and users.
  47. You will need to:
  48. * Create an API key on the *remote cluster* using the <<security-api-create-cross-cluster-api-key,Create cross-cluster API key>> API or using the {kibana-ref}/api-keys.html[Kibana API keys UI].
  49. * Add the API key to the keystore on the *local cluster*, as part of the steps in <<remote-clusters-security-api-key-local-actions,configuring the local cluster>>. All cross-cluster requests from the local cluster are bound by the API key’s privileges.
  50. Using {esql} with the API key based security model requires some additional permissions that may not be needed when using the traditional query DSL based search.
  51. The following example API call creates a role that can query remote indices using {esql} when using the API key based security model.
  52. [source,console]
  53. ----
  54. POST /_security/role/remote1
  55. {
  56. "cluster": ["cross_cluster_search"], <1>
  57. "indices": [
  58. {
  59. "names" : [""], <2>
  60. "privileges": ["read"]
  61. }
  62. ],
  63. "remote_indices": [ <3>
  64. {
  65. "names": [ "logs-*" ],
  66. "privileges": [ "read","read_cross_cluster" ], <4>
  67. "clusters" : ["my_remote_cluster"] <5>
  68. }
  69. ]
  70. }
  71. ----
  72. <1> The `cross_cluster_search` cluster privilege is required for the _local_ cluster.
  73. <2> Typically, users will have permissions to read both local and remote indices. However, for cases where the role is intended to ONLY search the remote cluster, the `read` permission is still required for the local cluster. To provide read access to the local cluster, but disallow reading any indices in the local cluster, the `names` field may be an empty string.
  74. <3> The indices allowed read access to the remote cluster. The configured <<security-api-create-cross-cluster-api-key,cross-cluster API key>> must also allow this index to be read.
  75. <4> The `read_cross_cluster` privilege is always required when using {esql} across clusters with the API key based security model.
  76. <5> The remote clusters to which these privileges apply.
  77. This remote cluster must be configured with a <<security-api-create-cross-cluster-api-key,cross-cluster API key>> and connected to the remote cluster before the remote index can be queried.
  78. Verify connection using the <<cluster-remote-info, Remote cluster info>> API.
  79. You will then need a user or API key with the permissions you created above. The following example API call creates a user with the `remote1` role.
  80. [source,console]
  81. ----
  82. POST /_security/user/remote_user
  83. {
  84. "password" : "<PASSWORD>",
  85. "roles" : [ "remote1" ]
  86. }
  87. ----
  88. Remember that all cross-cluster requests from the local cluster are bound by the cross cluster API key’s privileges, which are controlled by the remote cluster's administrator.
  89. [discrete]
  90. [[ccq-remote-cluster-setup]]
  91. ==== Remote cluster setup
  92. Once the security model is configured, you can add remote clusters.
  93. include::{es-ref-dir}/search/search-your-data/search-across-clusters.asciidoc[tag=ccs-remote-cluster-setup]
  94. <1> Since `skip_unavailable` was not set on `cluster_three`, it uses
  95. the default of `false`. See the <<ccq-skip-unavailable-clusters>>
  96. section for details.
  97. [discrete]
  98. [[ccq-from]]
  99. ==== Query across multiple clusters
  100. In the `FROM` command, specify data streams and indices on remote clusters
  101. using the format `<remote_cluster_name>:<target>`. For instance, the following
  102. {esql} request queries the `my-index-000001` index on a single remote cluster
  103. named `cluster_one`:
  104. [source,esql]
  105. ----
  106. FROM cluster_one:my-index-000001
  107. | LIMIT 10
  108. ----
  109. Similarly, this {esql} request queries the `my-index-000001` index from
  110. three clusters:
  111. * The local ("querying") cluster
  112. * Two remote clusters, `cluster_one` and `cluster_two`
  113. [source,esql]
  114. ----
  115. FROM my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001
  116. | LIMIT 10
  117. ----
  118. Likewise, this {esql} request queries the `my-index-000001` index from all
  119. remote clusters (`cluster_one`, `cluster_two`, and `cluster_three`):
  120. [source,esql]
  121. ----
  122. FROM *:my-index-000001
  123. | LIMIT 10
  124. ----
  125. [discrete]
  126. [[ccq-enrich]]
  127. ==== Enrich across clusters
  128. Enrich in {esql} across clusters operates similarly to <<esql-enrich,local enrich>>.
  129. If the enrich policy and its enrich indices are consistent across all clusters, simply
  130. write the enrich command as you would without remote clusters. In this default mode,
  131. {esql} can execute the enrich command on either the local cluster or the remote
  132. clusters, aiming to minimize computation or inter-cluster data transfer. Ensuring that
  133. the policy exists with consistent data on both the local cluster and the remote
  134. clusters is critical for ES|QL to produce a consistent query result.
  135. [NOTE]
  136. ====
  137. Enrich across clusters is *not supported* in this version when using {esql} with the <<remote-clusters-api-key, *API key based security model*>>.
  138. ====
  139. In the following example, the enrich with `hosts` policy can be executed on
  140. either the local cluster or the remote cluster `cluster_one`.
  141. [source,esql]
  142. ----
  143. FROM my-index-000001,cluster_one:my-index-000001
  144. | ENRICH hosts ON ip
  145. | LIMIT 10
  146. ----
  147. Enrich with an {esql} query against remote clusters only can also happen on
  148. the local cluster. This means the below query requires the `hosts` enrich
  149. policy to exist on the local cluster as well.
  150. [source,esql]
  151. ----
  152. FROM cluster_one:my-index-000001,cluster_two:my-index-000001
  153. | LIMIT 10
  154. | ENRICH hosts ON ip
  155. ----
  156. [discrete]
  157. [[esql-enrich-coordinator]]
  158. ===== Enrich with coordinator mode
  159. {esql} provides the enrich `_coordinator` mode to force {esql} to execute the enrich
  160. command on the local cluster. This mode should be used when the enrich policy is
  161. not available on the remote clusters or maintaining consistency of enrich indices
  162. across clusters is challenging.
  163. [source,esql]
  164. ----
  165. FROM my-index-000001,cluster_one:my-index-000001
  166. | ENRICH _coordinator:hosts ON ip
  167. | SORT host_name
  168. | LIMIT 10
  169. ----
  170. [discrete]
  171. [IMPORTANT]
  172. ====
  173. Enrich with the `_coordinator` mode usually increases inter-cluster data transfer and
  174. workload on the local cluster.
  175. ====
  176. [discrete]
  177. [[esql-enrich-remote]]
  178. ===== Enrich with remote mode
  179. {esql} also provides the enrich `_remote` mode to force {esql} to execute the enrich
  180. command independently on each remote cluster where the target indices reside.
  181. This mode is useful for managing different enrich data on each cluster, such as detailed
  182. information of hosts for each region where the target (main) indices contain
  183. log events from these hosts.
  184. In the below example, the `hosts` enrich policy is required to exist on all
  185. remote clusters: the `querying` cluster (as local indices are included),
  186. the remote cluster `cluster_one`, and `cluster_two`.
  187. [source,esql]
  188. ----
  189. FROM my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001
  190. | ENRICH _remote:hosts ON ip
  191. | SORT host_name
  192. | LIMIT 10
  193. ----
  194. A `_remote` enrich cannot be executed after a <<esql-stats-by,stats>>
  195. command. The following example would result in an error:
  196. [source,esql]
  197. ----
  198. FROM my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001
  199. | STATS COUNT(*) BY ip
  200. | ENRICH _remote:hosts ON ip
  201. | SORT host_name
  202. | LIMIT 10
  203. ----
  204. [discrete]
  205. [[esql-multi-enrich]]
  206. ===== Multiple enrich commands
  207. You can include multiple enrich commands in the same query with different
  208. modes. {esql} will attempt to execute them accordingly. For example, this
  209. query performs two enriches, first with the `hosts` policy on any cluster
  210. and then with the `vendors` policy on the local cluster.
  211. [source,esql]
  212. ----
  213. FROM my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001
  214. | ENRICH hosts ON ip
  215. | ENRICH _coordinator:vendors ON os
  216. | LIMIT 10
  217. ----
  218. A `_remote` enrich command can't be executed after a `_coordinator` enrich
  219. command. The following example would result in an error.
  220. [source,esql]
  221. ----
  222. FROM my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001
  223. | ENRICH _coordinator:hosts ON ip
  224. | ENRICH _remote:vendors ON os
  225. | LIMIT 10
  226. ----
  227. [discrete]
  228. [[ccq-exclude]]
  229. ==== Excluding clusters or indices from {esql} query
  230. To exclude an entire cluster, prefix the cluster alias with a minus sign in
  231. the `FROM` command, for example: `-my_cluster:*`:
  232. [source,esql]
  233. ----
  234. FROM my-index-000001,cluster*:my-index-000001,-cluster_three:*
  235. | LIMIT 10
  236. ----
  237. To exclude a specific remote index, prefix the index with a minus sign in
  238. the `FROM` command, such as `my_cluster:-my_index`:
  239. [source,esql]
  240. ----
  241. FROM my-index-000001,cluster*:my-index-*,cluster_three:-my-index-000001
  242. | LIMIT 10
  243. ----
  244. [discrete]
  245. [[ccq-skip-unavailable-clusters]]
  246. ==== Optional remote clusters
  247. {ccs-cap} for {esql} currently does not respect the `skip_unavailable`
  248. setting. As a result, if a remote cluster specified in the request is
  249. unavailable or failed, {ccs} for {esql} queries will fail regardless of the setting.
  250. We are actively working to align the behavior of {ccs} for {esql} with other
  251. {ccs} APIs. This includes providing detailed execution information for each cluster
  252. in the response, such as execution time, selected target indices, and shards.
  253. [discrete]
  254. [[ccq-during-upgrade]]
  255. ==== Query across clusters during an upgrade
  256. include::{es-ref-dir}/search/search-your-data/search-across-clusters.asciidoc[tag=ccs-during-upgrade]