From 37e37cc009dcda7bd123aedc7fec69a412d8be38 Mon Sep 17 00:00:00 2001 From: Filip Petkovski Date: Tue, 10 Jan 2023 12:13:29 +0100 Subject: [PATCH] Add proposal for distributed execution (#6012) * Add proposal for distributed execution Signed-off-by: Filip Petkovski * Apply formatting Signed-off-by: Filip Petkovski * Apply formatting Signed-off-by: Filip Petkovski * Improve wording Signed-off-by: Filip Petkovski * Add deployment models Signed-off-by: Filip Petkovski * Add more deployment modes Signed-off-by: Filip Petkovski * Revert tools.md Signed-off-by: Filip Petkovski Signed-off-by: Filip Petkovski --- docs/img/distributed-execution-proposal-1.png | Bin 0 -> 14073 bytes docs/img/distributed-execution-proposal-2.png | Bin 0 -> 17540 bytes docs/img/distributed-execution-proposal-3.png | Bin 0 -> 29583 bytes docs/img/distributed-execution-proposal-4.png | Bin 0 -> 21530 bytes docs/img/distributed-execution-proposal-5.png | Bin 0 -> 20591 bytes .../202301-distributed-query-execution.md | 167 ++++++++++++++++++ 6 files changed, 167 insertions(+) create mode 100644 docs/img/distributed-execution-proposal-1.png create mode 100644 docs/img/distributed-execution-proposal-2.png create mode 100644 docs/img/distributed-execution-proposal-3.png create mode 100644 docs/img/distributed-execution-proposal-4.png create mode 100644 docs/img/distributed-execution-proposal-5.png create mode 100644 docs/proposals-accepted/202301-distributed-query-execution.md diff --git a/docs/img/distributed-execution-proposal-1.png b/docs/img/distributed-execution-proposal-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f4dbb7c5b88ad92a0d7f6e4685d85f4413f51015 GIT binary patch literal 14073 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 GpZtFfj+I9M literal 0 HcmV?d00001 diff --git a/docs/img/distributed-execution-proposal-3.png b/docs/img/distributed-execution-proposal-3.png new file mode 100644 index 0000000000000000000000000000000000000000..1e9e520b378a9c82e2c064b0501432be39ecc538 GIT binary patch literal 29583 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 literal 0 HcmV?d00001 diff --git a/docs/img/distributed-execution-proposal-4.png b/docs/img/distributed-execution-proposal-4.png new file mode 100644 index 0000000000000000000000000000000000000000..df613b375d48eb18f038a8cd33bc40e8b334886b GIT binary patch literal 21530 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 F{{c+OARhn# literal 0 HcmV?d00001 diff --git a/docs/proposals-accepted/202301-distributed-query-execution.md b/docs/proposals-accepted/202301-distributed-query-execution.md new file mode 100644 index 00000000000..4322f2f0802 --- /dev/null +++ b/docs/proposals-accepted/202301-distributed-query-execution.md @@ -0,0 +1,167 @@ +--- +type: proposal +title: Distributed Query Execution +status: accepted +owner: fpetkovski +menu: proposals-accepted +--- + +## 1 Related links/tickets + +* https://github.com/thanos-io/thanos/pull/5250 +* https://github.com/thanos-io/thanos/pull/4917 +* https://github.com/thanos-io/thanos/pull/5350 +* https://github.com/thanos-community/promql-engine/issues/25 + +## 2 Why + +Thanos Queriers currently need to pull in all data from Stores in memory before they can start evaluating a query. This has a large impact on the used memory inside a single querier, and drastically increases query execution latency. + +Even when a Querier is connected to other Queriers, it will still pull raw series instead of delegating parts of the execution to its downstreams. This document proposes a mode in the Thanos Querier where it will dispatch parts of the execution plan to different, independent Queriers. + +## 3 Pitfalls of current solutions + +We have two mechanisms in Thanos to distribute queries among different components. + +Query pushdown is a mechanism enabled by query hints which allows a Thanos sidecar to execute certain queries against Prometheus as part of a `Series` call. Since data is usually replicated in at least two Prometheus instances, the subset of queries that can be pushed down is quite limited. In addition to that, this approach has introduced additional complexity in the deduplication iterator to allow the Querier to distinguish between storage series and PromQL series. + +Query Sharding is a execution method initiated by Query Frontend and allows for an aggregation query with grouping labels to be distributed to different Queriers. Even though the number of queries that can be sharded is larger than the ones that can be pushed down, query sharding still has a limited applicability since a query has to contain grouping labels. We have also noticed in practice that the execution latency does not fall linearly with the number of vertical shards, and often plateaus off at around ~4 shards. This is especially pronounced when querying data from Store Gateways, likely due to amplifying `Series` calls against Store components. + +## 4 Audience + +* Thanos users who have challenges with evaluating PromQL queries due to high cardinality. + +## 5 Goals + +* Enable decentralized query execution by delegating query plan fragments to independent Queriers. + +## 6 Proposal + +The key advantage of distributed execution is the fact that the number of series is drastically reduced when a query contains an aggregation operator (`sum`, `group`, `max`, etc..). Most (if not all) high cardinality PromQL queries are in-fact aggregations since users will struggle to sensibly visualise more than a handful of series. + +We therefore propose an execution model that allows running a Thanos Querier in a mode where it transforms a query to subqueries which are delegated to independent Queriers, and a central aggregation that is executed locally on the result of all subqueries. A simple example of this transformation is a `sum(rate(metric[2m]))` expression which can be transformed as + +``` +sum( + coalesce( + sum(rate(metric[2m])), + sum(rate(metric[2m])) + ) +) +``` + +### How + +The proposed method of transforming the query is extending the Thanos Engine with a logical optimizer that has references to other query engines. An example API could look as follows: + +``` +type DistributedExecutionOptimizer struct { + Endpoints api.RemoteEndpoints +} + +type RemoteEndpoints interface { + Engines() []RemoteEngine +} + +type RemoteEngine interface { + NewInstantQuery(opts *promql.QueryOpts, qs string, ts time.Time) (promql.Query, error) + NewRangeQuery(opts *promql.QueryOpts, qs string, start, end time.Time, interval time.Duration) (promql.Query, error) +} +``` + +The implementation of the `RemoteEngine` will be provided by Thanos itself and will use the gRPC Query API added in [https://github.com/thanos-io/thanos/pull/5250](https://github.com/thanos-io/thanos/pull/5250). + +Keeping PromQL execution in Query components allows for deduplication between Prometheus pairs to happen before series are aggregated. + +Distributed query execution + +The initial version of the solution can be found here: https://github.com/thanos-community/promql-engine/pull/139 + +### Query rewrite algorithm + +As described in the section above, the query will be rewritten using a logical optimizer into a form that is suitable for distributed execution. + +The proposed algorithm is as follows: +* Start AST traversal from the bottom up. +* If both the current node and its parent can be distributed, move up to the parent. +* If the current node can be distributed and its parent cannot, rewrite the current node into its distributed form. +* If the current node cannot be distributed, stop traversal. + +With this algorithm we try to distribute as much of the PromQL query as possible. Furthermore, even queries without aggregations, like `rate(http_requests_total[2m])`, will be rewritten into + +``` +coalesce( + rate(http_requests_total[2m]), + rate(http_requests_total[2m]) +) +``` + +Since PromQL queries are limited in the number of steps they can evaluate, with this algorithm we achieve downsampling at query time since only a small number of samples will be sent from local Queriers to the central one. + +### Time-based overlap resolution + +Thanos stores usually have a small overlap with ingestion components (Prometheus/Receiver) due to eventually consistency from uploading and downloading TSDB blocks. As a result, the central aggregation needs a way to deduplicate samples between ingestion and storage components. + +The proposed way to do time-based deduplication is by removing identical samples in the `coalesce` operator in the Thanos Engine itself. In order for data from independent Queriers to not get deduplicated, aggregations happening in remote engines must always preserve external labels from TSDB blocks that are being queried. + +To illustrate this on an example, we can assume that we have two clusters `a` and `b`, each being monitored with a Prometheus pair and with each Prometheus instance having an external `cluster` label. The query `sum(rate(metric[2m]))` would then be rewritten by the optimizer into: + +``` +sum( + coalesce( + sum by (cluster) (rate(metric[2m])), + sum by (cluster) (rate(metric[2m])) + ) +) +``` + +Each subquery would preserve the external `cluster` label which will allow the `coalesce` operator to deduplicate only those samples which are calculated from the same TSDB blocks. External labels can be propagated to the central engine by extending the `RemoteEngine` interface with a `Labels() []string` method. With this approach, local Queriers can be spread as widely as needed, with the extreme case of having one Querier per deduplicated TSDB block. + +Distributed query execution + +## Deployment models + +With this approach, a Thanos admin can arrange remote Queriers in an arbitrary way, as long as TSDB replicas are always queried by only one remote Querier. The following deployment models can be used as examples: + +#### Monitoring different environments with Prometheus pairs + +In this deployment mode, remote queriers are attached to pairs of Prometheus instances. The central Querier delegates subqueries to them and performs a central aggregation of results. + +Distributed query execution + +#### Querying separate Store Gateways and Prometheus pairs + +Remote Queriers can be attached to Prometheus pairs and Store Gateways at the same time. The central querier delegates subqueries and deduplicates overlapping results before performing a central aggregation. + +Distributed query execution + +#### Running remote Queriers as Store Gateway sidecars + +Remote Queriers can be attached to disjoint groups of Store Gateways. They can even be attached to individual Store Gateways which have deduplicated TSDB blocks, or hold all replicas of a TSDB block. This will make sure penalty-based deduplication happens in the remote querier. + +Store groups can be created by either partitioning TSDBs by time (time-based partitioning), or by external labels. Both of these techniques are documented in the [Store Gateway documentation](https://thanos.io/tip/components/store.md/#time-based-partitioning). + +Distributed query execution + +## 7 Alternatives + +A viable alternative to the proposed method is to add support for Query Pushdown in the Thanos Querier. By extracting better as described in https://github.com/thanos-io/thanos/issues/5984, we can decide to execute a query in a local Querier, similar to how the sidecar does that against Prometheus. + +Even though this approach might be faster to implement, it might not be the best long-term solution due to several reasons. To some extent, Query Pushdown misuses the `Series` API and the Querier requesting series is not aware that the query was actually executed. This can be problematic for distributing something like `count(metric)` since the distributed version should end up as: + +``` +sum( + coalesce( + count(metric), + count(metric) + ) +) +``` + +The root querier would need to know that downstream queriers have already executed the `count` and should convert the aggregation into a `sum` + +A similar problem can happen with a `sum(rate(metric[2m]))` expression where downstream queriers calculate the `sum` over the metric's `rate`. In order for the values to not get rated twice, either the downstream queriers need to invert the rate into a cumulative value, or the central querier needs to omit the rate and only calcualte the sum. + +Managing this complexity in Thanos itself seems error prone and hard to maintain over time. As a result, this proposal suggests to localize the complexity into a single logical optimizer as suggested in the sections above. + +Depending on the success of the distributed execution model, we can also fully deprecate query pushdown and query sharding and replace them with a single mechanism that can evolve and improve over time.