You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@druid.apache.org by vo...@apache.org on 2022/09/08 06:59:08 UTC

[druid-website-src] branch update_docs_for_24 updated: docs for Druid 24 release

This is an automated email from the ASF dual-hosted git repository.

vogievetsky pushed a commit to branch update_docs_for_24
in repository https://gitbox.apache.org/repos/asf/druid-website-src.git


The following commit(s) were added to refs/heads/update_docs_for_24 by this push:
     new 0be88353 docs for Druid 24 release
0be88353 is described below

commit 0be8835303ef6d77e71ba70b2d760a38d356c8ed
Author: Vadim Ogievetsky <va...@ogievetsky.com>
AuthorDate: Wed Sep 7 23:58:52 2022 -0700

    docs for Druid 24 release
---
 _config.yml                                        |    4 +
 docs/24.0.0/About-Experimental-Features.html       |    8 +
 docs/24.0.0/Aggregations.html                      |    8 +
 docs/24.0.0/ApproxHisto.html                       |    8 +
 docs/24.0.0/Batch-ingestion.html                   |    8 +
 docs/24.0.0/Booting-a-production-cluster.html      |    8 +
 docs/24.0.0/Broker-Config.html                     |    8 +
 docs/24.0.0/Broker.html                            |    8 +
 docs/24.0.0/Build-from-source.html                 |    8 +
 docs/24.0.0/Cassandra-Deep-Storage.html            |    8 +
 docs/24.0.0/Cluster-setup.html                     |    8 +
 docs/24.0.0/Compute.html                           |    8 +
 docs/24.0.0/Concepts-and-Terminology.html          |    8 +
 docs/24.0.0/Configuration.html                     |    8 +
 docs/24.0.0/Contribute.html                        |    8 +
 docs/24.0.0/Coordinator-Config.html                |    8 +
 docs/24.0.0/Coordinator.html                       |    8 +
 docs/24.0.0/DataSource.html                        |    8 +
 docs/24.0.0/DataSourceMetadataQuery.html           |    8 +
 docs/24.0.0/Data_formats.html                      |    8 +
 docs/24.0.0/Deep-Storage.html                      |    8 +
 docs/24.0.0/Design.html                            |    8 +
 docs/24.0.0/DimensionSpecs.html                    |    8 +
 docs/24.0.0/Download.html                          |    8 +
 docs/24.0.0/Druid-Personal-Demo-Cluster.html       |    8 +
 docs/24.0.0/Druid-vs-Cassandra.html                |    8 +
 docs/24.0.0/Druid-vs-Elasticsearch.html            |    8 +
 docs/24.0.0/Druid-vs-Hadoop.html                   |    8 +
 docs/24.0.0/Druid-vs-Impala-or-Shark.html          |    8 +
 docs/24.0.0/Druid-vs-Redshift.html                 |    8 +
 docs/24.0.0/Druid-vs-Spark.html                    |    8 +
 docs/24.0.0/Druid-vs-Vertica.html                  |    8 +
 docs/24.0.0/Evaluate.html                          |    8 +
 docs/24.0.0/Examples.html                          |    8 +
 docs/24.0.0/Filters.html                           |    8 +
 docs/24.0.0/Firehose.html                          |    8 +
 docs/24.0.0/GeographicQueries.html                 |    8 +
 docs/24.0.0/Granularities.html                     |    8 +
 docs/24.0.0/GroupByQuery.html                      |    8 +
 docs/24.0.0/Hadoop-Configuration.html              |    8 +
 docs/24.0.0/Having.html                            |    8 +
 docs/24.0.0/Historical-Config.html                 |    8 +
 docs/24.0.0/Historical.html                        |    8 +
 docs/24.0.0/Home.html                              |    8 +
 docs/24.0.0/Including-Extensions.html              |    8 +
 docs/24.0.0/Indexing-Service-Config.html           |    8 +
 docs/24.0.0/Indexing-Service.html                  |    8 +
 docs/24.0.0/Ingestion-FAQ.html                     |    8 +
 docs/24.0.0/Ingestion-overview.html                |    8 +
 docs/24.0.0/Ingestion.html                         |    8 +
 .../Integrating-Druid-With-Other-Technologies.html |    8 +
 docs/24.0.0/Kafka-Eight.html                       |    8 +
 docs/24.0.0/Libraries.html                         |    8 +
 docs/24.0.0/LimitSpec.html                         |    8 +
 docs/24.0.0/Loading-Your-Data.html                 |    8 +
 docs/24.0.0/Logging.html                           |    8 +
 docs/24.0.0/Master.html                            |    8 +
 docs/24.0.0/Metadata-storage.html                  |    8 +
 docs/24.0.0/Metrics.html                           |    8 +
 docs/24.0.0/Middlemanager.html                     |    8 +
 docs/24.0.0/Modules.html                           |    8 +
 docs/24.0.0/MySQL.html                             |    8 +
 docs/24.0.0/OrderBy.html                           |    8 +
 docs/24.0.0/Other-Hadoop.html                      |    8 +
 docs/24.0.0/Papers-and-talks.html                  |    8 +
 docs/24.0.0/Peons.html                             |    8 +
 docs/24.0.0/Performance-FAQ.html                   |    8 +
 docs/24.0.0/Plumber.html                           |    8 +
 docs/24.0.0/Post-aggregations.html                 |    8 +
 docs/24.0.0/Production-Cluster-Configuration.html  |    8 +
 docs/24.0.0/Query-Context.html                     |    8 +
 docs/24.0.0/Querying-your-data.html                |    8 +
 docs/24.0.0/Querying.html                          |    8 +
 docs/24.0.0/Realtime-Config.html                   |    8 +
 docs/24.0.0/Realtime-ingestion.html                |    8 +
 docs/24.0.0/Realtime.html                          |    8 +
 docs/24.0.0/Recommendations.html                   |    8 +
 docs/24.0.0/Rolling-Updates.html                   |    8 +
 docs/24.0.0/Router.html                            |    8 +
 docs/24.0.0/Rule-Configuration.html                |    8 +
 docs/24.0.0/SearchQuery.html                       |    8 +
 docs/24.0.0/SearchQuerySpec.html                   |    8 +
 docs/24.0.0/SegmentMetadataQuery.html              |    8 +
 docs/24.0.0/Segments.html                          |    8 +
 docs/24.0.0/SelectQuery.html                       |    8 +
 docs/24.0.0/Simple-Cluster-Configuration.html      |    8 +
 docs/24.0.0/Spatial-Filters.html                   |    8 +
 docs/24.0.0/Spatial-Indexing.html                  |    8 +
 docs/24.0.0/Stand-Alone-With-Riak-CS.html          |    8 +
 docs/24.0.0/Support.html                           |    8 +
 docs/24.0.0/Tasks.html                             |    8 +
 docs/24.0.0/Thanks.html                            |    8 +
 docs/24.0.0/TimeBoundaryQuery.html                 |    8 +
 docs/24.0.0/TimeseriesQuery.html                   |    8 +
 docs/24.0.0/TopNMetricSpec.html                    |    8 +
 docs/24.0.0/TopNQuery.html                         |    8 +
 docs/24.0.0/Tutorial-A-First-Look-at-Druid.html    |    8 +
 docs/24.0.0/Tutorial-All-About-Queries.html        |    8 +
 docs/24.0.0/Tutorial-Loading-Batch-Data.html       |    8 +
 docs/24.0.0/Tutorial-Loading-Streaming-Data.html   |    8 +
 docs/24.0.0/Tutorial-The-Druid-Cluster.html        |    8 +
 docs/24.0.0/Tutorial:-A-First-Look-at-Druid.html   |    8 +
 docs/24.0.0/Tutorial:-All-About-Queries.html       |    8 +
 docs/24.0.0/Tutorial:-Loading-Batch-Data.html      |    8 +
 docs/24.0.0/Tutorial:-Loading-Streaming-Data.html  |    8 +
 .../24.0.0/Tutorial:-Loading-Your-Data-Part-1.html |    8 +
 .../24.0.0/Tutorial:-Loading-Your-Data-Part-2.html |    8 +
 docs/24.0.0/Tutorial:-The-Druid-Cluster.html       |    8 +
 docs/24.0.0/Tutorial:-Webstream.html               |    8 +
 docs/24.0.0/Tutorials.html                         |    8 +
 docs/24.0.0/Twitter-Tutorial.html                  |    8 +
 docs/24.0.0/Versioning.html                        |    8 +
 docs/24.0.0/ZooKeeper.html                         |    8 +
 docs/24.0.0/alerts.html                            |    8 +
 docs/24.0.0/assets/compaction-config.png           |  Bin 0 -> 103224 bytes
 docs/24.0.0/assets/datasources-action-button.png   |  Bin 0 -> 800 bytes
 docs/24.0.0/assets/druid-architecture.png          |  Bin 0 -> 134117 bytes
 docs/24.0.0/assets/druid-column-types.png          |  Bin 0 -> 93363 bytes
 docs/24.0.0/assets/druid-dataflow-2x.png           |  Bin 0 -> 130160 bytes
 docs/24.0.0/assets/druid-dataflow-3.png            |  Bin 0 -> 71425 bytes
 docs/24.0.0/assets/druid-manage-1.png              |  Bin 0 -> 80415 bytes
 docs/24.0.0/assets/druid-timeline.png              |  Bin 0 -> 24160 bytes
 docs/24.0.0/assets/indexing_service.png            |  Bin 0 -> 22490 bytes
 .../msq-ui-download-query-results.png              |  Bin 0 -> 62538 bytes
 .../multi-stage-query/tutorial-msq-convert.png     |  Bin 0 -> 80379 bytes
 .../assets/multi-stage-query/ui-annotated.png      |  Bin 0 -> 227968 bytes
 docs/24.0.0/assets/multi-stage-query/ui-empty.png  |  Bin 0 -> 77306 bytes
 docs/24.0.0/assets/native-queries-01.png           |  Bin 0 -> 259507 bytes
 docs/24.0.0/assets/nested-combined-json.png        |  Bin 0 -> 272858 bytes
 docs/24.0.0/assets/nested-display-data-types.png   |  Bin 0 -> 254224 bytes
 docs/24.0.0/assets/nested-examine-schema.png       |  Bin 0 -> 251706 bytes
 docs/24.0.0/assets/nested-extract-as-type.png      |  Bin 0 -> 288918 bytes
 docs/24.0.0/assets/nested-extract-elements.png     |  Bin 0 -> 317905 bytes
 docs/24.0.0/assets/nested-group-aggregate.png      |  Bin 0 -> 249178 bytes
 .../assets/nested-msq-ingestion-transform.png      |  Bin 0 -> 370419 bytes
 docs/24.0.0/assets/nested-msq-ingestion.png        |  Bin 0 -> 302033 bytes
 docs/24.0.0/assets/nested-parse-deserialize.png    |  Bin 0 -> 213791 bytes
 docs/24.0.0/assets/nested-retrieve-json.png        |  Bin 0 -> 295566 bytes
 docs/24.0.0/assets/nested-return-json.png          |  Bin 0 -> 349144 bytes
 docs/24.0.0/assets/security-model-1.png            |  Bin 0 -> 85098 bytes
 docs/24.0.0/assets/security-model-2.png            |  Bin 0 -> 29613 bytes
 docs/24.0.0/assets/segmentPropagation.png          |  Bin 0 -> 30569 bytes
 docs/24.0.0/assets/services-overview.png           |  Bin 0 -> 112702 bytes
 .../assets/tutorial-batch-data-loader-00.png       |  Bin 0 -> 2904 bytes
 .../assets/tutorial-batch-data-loader-01.png       |  Bin 0 -> 227941 bytes
 .../assets/tutorial-batch-data-loader-015.png      |  Bin 0 -> 206331 bytes
 .../assets/tutorial-batch-data-loader-02.png       |  Bin 0 -> 1193472 bytes
 .../assets/tutorial-batch-data-loader-03.png       |  Bin 0 -> 405035 bytes
 .../assets/tutorial-batch-data-loader-04.png       |  Bin 0 -> 488906 bytes
 .../assets/tutorial-batch-data-loader-05.png       |  Bin 0 -> 447046 bytes
 .../assets/tutorial-batch-data-loader-06.png       |  Bin 0 -> 191383 bytes
 .../assets/tutorial-batch-data-loader-07.png       |  Bin 0 -> 173618 bytes
 .../assets/tutorial-batch-data-loader-08.png       |  Bin 0 -> 325806 bytes
 .../assets/tutorial-batch-data-loader-09.png       |  Bin 0 -> 187695 bytes
 .../assets/tutorial-batch-data-loader-10.png       |  Bin 0 -> 219732 bytes
 .../assets/tutorial-batch-data-loader-11.png       |  Bin 0 -> 316540 bytes
 .../assets/tutorial-batch-data-loader-12.png       |  Bin 0 -> 31752 bytes
 .../assets/tutorial-batch-submit-task-01.png       |  Bin 0 -> 170537 bytes
 .../assets/tutorial-batch-submit-task-02.png       |  Bin 0 -> 207377 bytes
 docs/24.0.0/assets/tutorial-compaction-01.png      |  Bin 0 -> 35710 bytes
 docs/24.0.0/assets/tutorial-compaction-02.png      |  Bin 0 -> 166571 bytes
 docs/24.0.0/assets/tutorial-compaction-03.png      |  Bin 0 -> 26755 bytes
 docs/24.0.0/assets/tutorial-compaction-04.png      |  Bin 0 -> 184365 bytes
 docs/24.0.0/assets/tutorial-compaction-05.png      |  Bin 0 -> 26588 bytes
 docs/24.0.0/assets/tutorial-compaction-06.png      |  Bin 0 -> 206717 bytes
 docs/24.0.0/assets/tutorial-compaction-07.png      |  Bin 0 -> 26683 bytes
 docs/24.0.0/assets/tutorial-compaction-08.png      |  Bin 0 -> 28751 bytes
 docs/24.0.0/assets/tutorial-deletion-01.png        |  Bin 0 -> 43586 bytes
 docs/24.0.0/assets/tutorial-deletion-02.png        |  Bin 0 -> 439602 bytes
 docs/24.0.0/assets/tutorial-deletion-03.png        |  Bin 0 -> 437304 bytes
 .../assets/tutorial-kafka-data-loader-01.png       |  Bin 0 -> 118171 bytes
 .../assets/tutorial-kafka-data-loader-02.png       |  Bin 0 -> 613518 bytes
 .../assets/tutorial-kafka-data-loader-03.png       |  Bin 0 -> 201934 bytes
 .../assets/tutorial-kafka-data-loader-04.png       |  Bin 0 -> 252479 bytes
 .../assets/tutorial-kafka-data-loader-05.png       |  Bin 0 -> 256966 bytes
 .../assets/tutorial-kafka-data-loader-06.png       |  Bin 0 -> 94346 bytes
 .../assets/tutorial-kafka-data-loader-07.png       |  Bin 0 -> 135815 bytes
 .../assets/tutorial-kafka-data-loader-08.png       |  Bin 0 -> 97816 bytes
 .../assets/tutorial-kafka-data-loader-09.png       |  Bin 0 -> 171974 bytes
 .../assets/tutorial-kafka-data-loader-10.png       |  Bin 0 -> 113867 bytes
 .../assets/tutorial-kafka-data-loader-11.png       |  Bin 0 -> 120255 bytes
 .../assets/tutorial-kafka-data-loader-12.png       |  Bin 0 -> 153000 bytes
 .../assets/tutorial-kafka-submit-supervisor-01.png |  Bin 0 -> 143733 bytes
 docs/24.0.0/assets/tutorial-query-01.png           |  Bin 0 -> 81402 bytes
 docs/24.0.0/assets/tutorial-query-02.png           |  Bin 0 -> 155423 bytes
 docs/24.0.0/assets/tutorial-query-03.png           |  Bin 0 -> 197392 bytes
 docs/24.0.0/assets/tutorial-query-035.png          |  Bin 0 -> 256043 bytes
 docs/24.0.0/assets/tutorial-query-04.png           |  Bin 0 -> 250861 bytes
 docs/24.0.0/assets/tutorial-query-05.png           |  Bin 0 -> 51855 bytes
 docs/24.0.0/assets/tutorial-query-06.png           |  Bin 0 -> 208088 bytes
 docs/24.0.0/assets/tutorial-query-07.png           |  Bin 0 -> 260071 bytes
 docs/24.0.0/assets/tutorial-query-08.png           |  Bin 0 -> 297253 bytes
 docs/24.0.0/assets/tutorial-quickstart-01.png      |  Bin 0 -> 122497 bytes
 docs/24.0.0/assets/tutorial-quickstart-02.png      |  Bin 0 -> 115511 bytes
 docs/24.0.0/assets/tutorial-quickstart-03.png      |  Bin 0 -> 174445 bytes
 docs/24.0.0/assets/tutorial-quickstart-04.png      |  Bin 0 -> 144088 bytes
 docs/24.0.0/assets/tutorial-quickstart-05.png      |  Bin 0 -> 84116 bytes
 docs/24.0.0/assets/tutorial-retention-00.png       |  Bin 0 -> 77704 bytes
 docs/24.0.0/assets/tutorial-retention-01.png       |  Bin 0 -> 35171 bytes
 docs/24.0.0/assets/tutorial-retention-02.png       |  Bin 0 -> 240310 bytes
 docs/24.0.0/assets/tutorial-retention-03.png       |  Bin 0 -> 30029 bytes
 docs/24.0.0/assets/tutorial-retention-04.png       |  Bin 0 -> 44617 bytes
 docs/24.0.0/assets/tutorial-retention-05.png       |  Bin 0 -> 38992 bytes
 docs/24.0.0/assets/tutorial-retention-06.png       |  Bin 0 -> 137570 bytes
 docs/24.0.0/assets/tutorial-theta-01.png           |  Bin 0 -> 160923 bytes
 docs/24.0.0/assets/tutorial-theta-02.png           |  Bin 0 -> 149124 bytes
 docs/24.0.0/assets/tutorial-theta-03.png           |  Bin 0 -> 183232 bytes
 docs/24.0.0/assets/tutorial-theta-04.png           |  Bin 0 -> 162593 bytes
 docs/24.0.0/assets/tutorial-theta-05.png           |  Bin 0 -> 215624 bytes
 docs/24.0.0/assets/tutorial-theta-06.png           |  Bin 0 -> 146114 bytes
 docs/24.0.0/assets/tutorial-theta-07.png           |  Bin 0 -> 125992 bytes
 docs/24.0.0/assets/tutorial-theta-08.png           |  Bin 0 -> 70597 bytes
 docs/24.0.0/assets/tutorial-theta-09.png           |  Bin 0 -> 86495 bytes
 docs/24.0.0/assets/tutorial-theta-10.png           |  Bin 0 -> 86440 bytes
 docs/24.0.0/assets/tutorial-theta-11.png           |  Bin 0 -> 86126 bytes
 docs/24.0.0/assets/web-console-01-home-view.png    |  Bin 0 -> 74166 bytes
 .../24.0.0/assets/web-console-02-data-loader-1.png |  Bin 0 -> 99786 bytes
 .../24.0.0/assets/web-console-03-data-loader-2.png |  Bin 0 -> 275998 bytes
 docs/24.0.0/assets/web-console-04-datasources.png  |  Bin 0 -> 112268 bytes
 docs/24.0.0/assets/web-console-05-retention.png    |  Bin 0 -> 83062 bytes
 docs/24.0.0/assets/web-console-06-segments.png     |  Bin 0 -> 79223 bytes
 docs/24.0.0/assets/web-console-07-supervisors.png  |  Bin 0 -> 136709 bytes
 .../assets/web-console-08-supervisor-status.png    |  Bin 0 -> 93077 bytes
 docs/24.0.0/assets/web-console-09-task-status.png  |  Bin 0 -> 195995 bytes
 docs/24.0.0/assets/web-console-10-servers.png      |  Bin 0 -> 93976 bytes
 docs/24.0.0/assets/web-console-11-query-sql.png    |  Bin 0 -> 131799 bytes
 docs/24.0.0/assets/web-console-12-query-rune.png   |  Bin 0 -> 106246 bytes
 docs/24.0.0/assets/web-console-13-lookups.png      |  Bin 0 -> 71735 bytes
 docs/24.0.0/comparisons/druid-vs-cassandra.html    |    8 +
 .../24.0.0/comparisons/druid-vs-elasticsearch.html |  110 ++
 docs/24.0.0/comparisons/druid-vs-hadoop.html       |    8 +
 .../comparisons/druid-vs-impala-or-shark.html      |    8 +
 docs/24.0.0/comparisons/druid-vs-key-value.html    |  118 ++
 docs/24.0.0/comparisons/druid-vs-kudu.html         |  112 ++
 docs/24.0.0/comparisons/druid-vs-redshift.html     |  121 ++
 docs/24.0.0/comparisons/druid-vs-spark.html        |  112 ++
 .../24.0.0/comparisons/druid-vs-sql-on-hadoop.html |  143 ++
 docs/24.0.0/comparisons/druid-vs-vertica.html      |    8 +
 docs/24.0.0/configuration/auth.html                |    8 +
 docs/24.0.0/configuration/broker.html              |    8 +
 docs/24.0.0/configuration/caching.html             |    8 +
 docs/24.0.0/configuration/coordinator.html         |    8 +
 docs/24.0.0/configuration/hadoop.html              |    8 +
 docs/24.0.0/configuration/historical.html          |    8 +
 .../configuration/human-readable-byte.html         |    8 +-
 docs/{latest => 24.0.0}/configuration/index.html   |  353 ++---
 docs/24.0.0/configuration/indexing-service.html    |    8 +
 docs/24.0.0/configuration/logging.html             |  198 +++
 docs/24.0.0/configuration/production-cluster.html  |    8 +
 docs/24.0.0/configuration/realtime.html            |    8 +
 docs/24.0.0/configuration/simple-cluster.html      |    8 +
 docs/24.0.0/configuration/zookeeper.html           |    8 +
 .../dependencies/cassandra-deep-storage.html       |    8 +
 docs/24.0.0/dependencies/deep-storage.html         |  120 ++
 docs/24.0.0/dependencies/metadata-storage.html     |  207 +++
 docs/24.0.0/dependencies/zookeeper.html            |  136 ++
 docs/{latest => 24.0.0}/design/architecture.html   |   68 +-
 docs/{latest => 24.0.0}/design/auth.html           |    8 +-
 docs/24.0.0/design/broker.html                     |  116 ++
 docs/24.0.0/design/concepts-and-terminology.html   |    8 +
 docs/24.0.0/design/coordinator.html                |  207 +++
 docs/24.0.0/design/design.html                     |    8 +
 .../design/extensions-contrib/dropwizard.html      |   10 +-
 docs/24.0.0/design/historical.html                 |  124 ++
 docs/24.0.0/design/index.html                      |  167 +++
 docs/24.0.0/design/indexer.html                    |  138 ++
 docs/24.0.0/design/indexing-service.html           |  113 ++
 docs/24.0.0/design/middlemanager.html              |  110 ++
 docs/24.0.0/design/overlord.html                   |  122 ++
 docs/24.0.0/design/peons.html                      |  112 ++
 docs/24.0.0/design/plumber.html                    |    8 +
 docs/24.0.0/design/processes.html                  |  173 +++
 docs/24.0.0/design/realtime.html                   |    8 +
 docs/{latest => 24.0.0}/design/router.html         |   23 +-
 docs/24.0.0/design/segments.html                   |  241 +++
 .../24.0.0/development/approximate-histograms.html |    8 +
 docs/24.0.0/development/build.html                 |  155 ++
 .../development/community-extensions/azure.html    |    8 +
 .../community-extensions/cassandra.html            |    8 +
 .../community-extensions/cloudfiles.html           |    8 +
 .../development/community-extensions/graphite.html |    8 +
 .../community-extensions/kafka-simple.html         |    8 +
 .../development/community-extensions/rabbitmq.html |    8 +
 .../development/datasketches-aggregators.html      |    8 +
 docs/24.0.0/development/experimental.html          |  110 ++
 .../development/extensions-contrib/aliyun-oss.html |   14 +-
 .../extensions-contrib/ambari-metrics-emitter.html |  159 ++
 .../development/extensions-contrib/cassandra.html  |  103 ++
 .../development/extensions-contrib/cloudfiles.html |  170 +++
 .../extensions-contrib/distinctcount.html          |  162 +++
 .../extensions-contrib/gce-extensions.html         |  168 +++
 .../development/extensions-contrib/google.html     |    8 +
 .../development/extensions-contrib/graphite.html   |  170 +++
 .../development/extensions-contrib/influx.html     |  132 ++
 .../extensions-contrib/influxdb-emitter.html       |  143 ++
 .../extensions-contrib/kafka-emitter.html          |  126 ++
 .../extensions-contrib/kafka-simple.html           |    8 +
 .../extensions-contrib/materialized-view.html      |  208 +++
 .../extensions-contrib/momentsketch-quantiles.html |  180 +++
 .../extensions-contrib/moving-average-query.html   |   36 +-
 .../extensions-contrib/opentsdb-emitter.html       |  131 ++
 .../24.0.0/development/extensions-contrib/orc.html |    8 +
 .../development/extensions-contrib/parquet.html    |    8 +
 .../development/extensions-contrib/prometheus.html |  140 ++
 .../development/extensions-contrib/rabbitmq.html   |    8 +
 .../extensions-contrib/redis-cache.html            |  179 +++
 .../development/extensions-contrib/rocketmq.html   |    8 +
 .../development/extensions-contrib/scan-query.html |    8 +
 .../development/extensions-contrib/sqlserver.html  |  132 ++
 .../development/extensions-contrib/statsd.html     |  140 ++
 .../tdigestsketch-quantiles.html                   |  212 +++
 .../development/extensions-contrib/thrift.html     |  157 ++
 .../extensions-contrib/time-min-max.html           |  162 +++
 .../extensions-core/approximate-histograms.html    |   21 +-
 docs/24.0.0/development/extensions-core/avro.html  |  129 ++
 docs/24.0.0/development/extensions-core/azure.html |  119 ++
 .../development/extensions-core/bloom-filter.html  |  222 +++
 .../extensions-core/caffeine-cache.html            |    8 +
 .../extensions-core/datasketches-aggregators.html  |    8 +
 .../extensions-core/datasketches-extension.html    |  110 ++
 .../extensions-core/datasketches-hll.html          |  195 +++
 .../extensions-core/datasketches-quantiles.html    |  185 +++
 .../extensions-core/datasketches-theta.html        |   10 +-
 .../extensions-core/datasketches-tuple.html        |  210 +++
 .../development/extensions-core/druid-aws-rds.html |  107 ++
 .../extensions-core/druid-basic-security.html      |   26 +-
 .../extensions-core/druid-kerberos.html            |  188 +++
 .../development/extensions-core/druid-lookups.html |   14 +-
 .../development/extensions-core/druid-pac4j.html   |  121 ++
 .../extensions-core/druid-ranger-security.html     |  182 +++
 .../development/extensions-core/examples.html      |    8 +-
 .../24.0.0/development/extensions-core/google.html |  128 ++
 docs/24.0.0/development/extensions-core/hdfs.html  |  229 +++
 .../extensions-core/kafka-eight-firehose.html      |    8 +
 .../kafka-extraction-namespace.html                |  161 +++
 .../extensions-core/kafka-ingestion.html           |  325 +++++
 .../kafka-supervisor-operations.html               |   14 +-
 .../kafka-supervisor-reference.html                |   28 +-
 .../extensions-core/kinesis-ingestion.html         |   31 +-
 .../development/extensions-core/kubernetes.html    |  156 ++
 .../extensions-core/lookups-cached-global.html     |   27 +-
 docs/24.0.0/development/extensions-core/mysql.html |  246 ++++
 .../extensions-core/namespaced-lookup.html         |    8 +
 docs/24.0.0/development/extensions-core/orc.html   |  152 ++
 .../development/extensions-core/parquet.html       |  108 ++
 .../development/extensions-core/postgresql.html    |  216 +++
 .../development/extensions-core/protobuf.html      |   16 +-
 .../development/extensions-core/s3.html            |   18 +-
 .../extensions-core/simple-client-sslcontext.html  |  131 ++
 docs/24.0.0/development/extensions-core/stats.html |  232 +++
 .../development/extensions-core/test-stats.html    |  174 +++
 docs/24.0.0/development/extensions.html            |  225 +++
 docs/24.0.0/development/geo.html                   |  182 +++
 docs/24.0.0/development/indexer.html               |    8 +
 .../integrating-druid-with-other-technologies.html |    8 +
 docs/24.0.0/development/javascript.html            |  135 ++
 .../kafka-simple-consumer-firehose.html            |    8 +
 docs/24.0.0/development/libraries.html             |    8 +
 docs/{latest => 24.0.0}/development/modules.html   |   14 +-
 docs/24.0.0/development/overview.html              |  129 ++
 docs/24.0.0/development/router.html                |    8 +
 docs/24.0.0/development/select-query.html          |    8 +
 docs/24.0.0/development/versioning.html            |  112 ++
 docs/24.0.0/index.html                             |    8 +
 docs/24.0.0/ingestion/automatic-compaction.html    |  232 +++
 docs/24.0.0/ingestion/batch-ingestion.html         |    8 +
 .../ingestion/command-line-hadoop-indexer.html     |    8 +
 docs/24.0.0/ingestion/compaction.html              |  289 ++++
 .../{latest => 24.0.0}/ingestion/data-formats.html |  100 +-
 docs/24.0.0/ingestion/data-management.html         |  168 +++
 docs/24.0.0/ingestion/data-model.html              |  121 ++
 docs/24.0.0/ingestion/delete-data.html             |    8 +
 docs/24.0.0/ingestion/faq.html                     |  154 ++
 docs/24.0.0/ingestion/firehose.html                |    8 +
 docs/24.0.0/ingestion/flatten-json.html            |    8 +
 docs/24.0.0/ingestion/hadoop-vs-native-batch.html  |    8 +
 docs/{latest => 24.0.0}/ingestion/hadoop.html      |   38 +-
 docs/24.0.0/ingestion/index.html                   |  156 ++
 .../ingestion/ingestion-spec.html                  |   96 +-
 docs/24.0.0/ingestion/ingestion.html               |    8 +
 docs/24.0.0/ingestion/locking-and-priority.html    |    8 +
 docs/24.0.0/ingestion/misc-tasks.html              |    8 +
 .../ingestion/native-batch-firehose.html           |   44 +-
 .../ingestion/native-batch-input-sources.html      |  201 ++-
 .../ingestion/native-batch-simple-task.html        |   35 +-
 .../{latest => 24.0.0}/ingestion/native-batch.html |  210 +--
 docs/24.0.0/ingestion/native_tasks.html            |    8 +
 docs/24.0.0/ingestion/overview.html                |    8 +
 docs/24.0.0/ingestion/partitioning.html            |  134 ++
 docs/24.0.0/ingestion/realtime-ingestion.html      |    8 +
 docs/24.0.0/ingestion/reports.html                 |    8 +
 docs/24.0.0/ingestion/rollup.html                  |  165 +++
 .../ingestion/schema-design.html                   |   67 +-
 docs/24.0.0/ingestion/standalone-realtime.html     |  113 ++
 docs/24.0.0/ingestion/stream-ingestion.html        |    8 +
 docs/24.0.0/ingestion/stream-pull.html             |    8 +
 docs/24.0.0/ingestion/stream-push.html             |    8 +
 docs/{latest => 24.0.0}/ingestion/tasks.html       |   62 +-
 docs/{latest => 24.0.0}/ingestion/tranquility.html |   12 +-
 docs/24.0.0/ingestion/transform-spec.html          |    8 +
 docs/24.0.0/ingestion/update-existing-data.html    |    8 +
 docs/24.0.0/misc/cluster-setup.html                |    8 +
 docs/24.0.0/misc/evaluate.html                     |    8 +
 docs/{latest => 24.0.0}/misc/math-expr.html        |   65 +-
 docs/24.0.0/misc/papers-and-talks.html             |  113 ++
 docs/24.0.0/misc/tasks.html                        |    8 +
 docs/24.0.0/multi-stage-query/api.html             | 1528 ++++++++++++++++++++
 docs/24.0.0/multi-stage-query/concepts.html        |  222 +++
 .../multi-stage-query/connect-external-data.html   |  203 +++
 .../multi-stage-query/convert-json-spec.html       |  233 +++
 docs/24.0.0/multi-stage-query/examples.html        |  529 +++++++
 docs/24.0.0/multi-stage-query/index.html           |  355 +++++
 docs/24.0.0/multi-stage-query/known-issues.html    |  181 +++
 docs/24.0.0/multi-stage-query/reference.html       |  219 +++
 docs/24.0.0/multi-stage-query/security.html        |  117 ++
 docs/24.0.0/operations/alerts.html                 |  110 ++
 .../operations/api-reference.html                  |  104 +-
 docs/{latest => 24.0.0}/operations/auth-ldap.html  |   12 +-
 .../operations/basic-cluster-tuning.html           |   26 +-
 .../operations/clean-metadata-store.html           |   22 +-
 docs/24.0.0/operations/deep-storage-migration.html |  125 ++
 docs/24.0.0/operations/druid-console.html          |  214 +++
 docs/24.0.0/operations/dump-segment.html           |  177 +++
 .../24.0.0/operations/dynamic-config-provider.html |  145 ++
 .../operations/export-metadata.html                |    8 +-
 docs/24.0.0/operations/getting-started.html        |  111 ++
 docs/24.0.0/operations/high-availability.html      |  113 ++
 docs/24.0.0/operations/http-compression.html       |  109 ++
 docs/24.0.0/operations/including-extensions.html   |    8 +
 docs/24.0.0/operations/insert-segment-to-db.html   |  120 ++
 docs/24.0.0/operations/java.html                   |  150 ++
 docs/24.0.0/operations/kubernetes.html             |  104 ++
 docs/24.0.0/operations/management-uis.html         |  119 ++
 docs/24.0.0/operations/metadata-migration.html     |  140 ++
 docs/{latest => 24.0.0}/operations/metrics.html    |   66 +-
 .../operations/mixed-workloads.html                |   32 +-
 docs/24.0.0/operations/multitenancy.html           |    8 +
 .../operations/other-hadoop.html                   |   26 +-
 docs/24.0.0/operations/password-provider.html      |  121 ++
 docs/24.0.0/operations/performance-faq.html        |    8 +
 docs/24.0.0/operations/pull-deps.html              |  171 +++
 docs/24.0.0/operations/recommendations.html        |    8 +
 docs/24.0.0/operations/request-logging.html        |  309 ++++
 docs/24.0.0/operations/reset-cluster.html          |  144 ++
 docs/24.0.0/operations/rolling-updates.html        |  154 ++
 .../operations/rule-configuration.html             |   10 +-
 .../operations/security-overview.html              |   24 +-
 docs/24.0.0/operations/security-user-auth.html     |  224 +++
 docs/24.0.0/operations/segment-optimization.html   |  173 +++
 docs/24.0.0/operations/single-server.html          |  145 ++
 docs/24.0.0/operations/tls-support.html            |  186 +++
 .../operations/use_sbt_to_build_fat_jar.html       |  200 +++
 docs/{latest => 24.0.0}/querying/aggregations.html |   36 +-
 docs/24.0.0/querying/caching.html                  |  168 +++
 docs/{latest => 24.0.0}/querying/datasource.html   |   66 +-
 docs/24.0.0/querying/datasourcemetadataquery.html  |  133 ++
 .../querying/dimensionspecs.html                   |   36 +-
 docs/{latest => 24.0.0}/querying/filters.html      |   41 +-
 .../{latest => 24.0.0}/querying/granularities.html |   44 +-
 docs/{latest => 24.0.0}/querying/groupbyquery.html |   59 +-
 docs/24.0.0/querying/having.html                   |  287 ++++
 docs/24.0.0/querying/hll-old.html                  |  185 +++
 docs/24.0.0/querying/joins.html                    |  116 ++
 docs/24.0.0/querying/limitspec.html                |  133 ++
 docs/{latest => 24.0.0}/querying/lookups.html      |   36 +-
 .../querying/multi-value-dimensions.html           |   26 +-
 docs/24.0.0/querying/multitenancy.html             |  150 ++
 docs/24.0.0/querying/nested-columns.html           |  467 ++++++
 docs/24.0.0/querying/optimizations.html            |    8 +
 docs/24.0.0/querying/post-aggregations.html        |  276 ++++
 .../{latest => 24.0.0}/querying/query-context.html |   40 +-
 docs/24.0.0/querying/query-execution.html          |  169 +++
 docs/24.0.0/querying/querying.html                 |  203 +++
 docs/{latest => 24.0.0}/querying/scan-query.html   |   16 +-
 docs/24.0.0/querying/searchquery.html              |  249 ++++
 docs/24.0.0/querying/searchqueryspec.html          |    8 +
 .../querying/segmentmetadataquery.html             |   20 +-
 docs/24.0.0/querying/select-query.html             |  100 ++
 docs/24.0.0/querying/sorting-orders.html           |  125 ++
 .../querying/sql-aggregations.html                 |   62 +-
 docs/24.0.0/querying/sql-api.html                  |  232 +++
 docs/24.0.0/querying/sql-data-types.html           |  188 +++
 docs/24.0.0/querying/sql-functions.html            |  783 ++++++++++
 docs/24.0.0/querying/sql-jdbc.html                 |  146 ++
 docs/24.0.0/querying/sql-json-functions.html       |  148 ++
 .../querying/sql-metadata-tables.html              |   56 +-
 .../querying/sql-multivalue-string-functions.html  |  137 ++
 docs/24.0.0/querying/sql-operators.html            |  185 +++
 docs/24.0.0/querying/sql-query-context.html        |  145 ++
 docs/{latest => 24.0.0}/querying/sql-scalar.html   |   69 +-
 docs/24.0.0/querying/sql-translation.html          |  394 +++++
 docs/24.0.0/querying/sql.html                      |  267 ++++
 docs/24.0.0/querying/timeboundaryquery.html        |  134 ++
 docs/24.0.0/querying/timeseriesquery.html          |  227 +++
 docs/24.0.0/querying/topnmetricspec.html           |  160 ++
 docs/24.0.0/querying/topnquery.html                |  316 ++++
 docs/24.0.0/querying/troubleshooting.html          |  135 ++
 docs/24.0.0/querying/using-caching.html            |  148 ++
 docs/24.0.0/querying/virtual-columns.html          |  254 ++++
 .../tutorials/booting-a-production-cluster.html    |    8 +
 docs/{latest => 24.0.0}/tutorials/cluster.html     |   51 +-
 docs/24.0.0/tutorials/docker.html                  |  166 +++
 docs/24.0.0/tutorials/examples.html                |    8 +
 docs/24.0.0/tutorials/firewall.html                |    8 +
 docs/24.0.0/tutorials/index.html                   |  254 ++++
 docs/24.0.0/tutorials/ingestion-streams.html       |    8 +
 docs/24.0.0/tutorials/ingestion.html               |    8 +
 docs/24.0.0/tutorials/quickstart.html              |    8 +
 .../tutorials/tutorial-a-first-look-at-druid.html  |    8 +
 .../tutorials/tutorial-all-about-queries.html      |    8 +
 .../tutorials/tutorial-batch-hadoop.html           |   22 +-
 docs/24.0.0/tutorials/tutorial-batch-native.html   |  133 ++
 docs/24.0.0/tutorials/tutorial-batch.html          |  211 +++
 docs/24.0.0/tutorials/tutorial-compaction.html     |  211 +++
 docs/24.0.0/tutorials/tutorial-delete-data.html    |  211 +++
 .../tutorials/tutorial-ingestion-spec.html         |   27 +-
 .../tutorials/tutorial-kafka.html                  |   24 +-
 .../24.0.0/tutorials/tutorial-kerberos-hadoop.html |  170 +++
 .../tutorials/tutorial-loading-batch-data.html     |    8 +
 .../tutorials/tutorial-loading-streaming-data.html |    8 +
 .../tutorials/tutorial-msq-convert-json.html       |  117 ++
 .../tutorials/tutorial-msq-external-data.html      |  117 ++
 docs/24.0.0/tutorials/tutorial-query.html          |  290 ++++
 docs/24.0.0/tutorials/tutorial-retention.html      |  149 ++
 docs/24.0.0/tutorials/tutorial-rollup.html         |  229 +++
 docs/24.0.0/tutorials/tutorial-sketches-theta.html |  363 +++++
 .../tutorials/tutorial-the-druid-cluster.html      |    8 +
 docs/24.0.0/tutorials/tutorial-tranquility.html    |    8 +
 docs/24.0.0/tutorials/tutorial-transform-spec.html |  212 +++
 docs/24.0.0/tutorials/tutorial-update-data.html    |  198 +++
 docs/latest/Firehose.html                          |    8 +
 docs/latest/assets/compaction-config.png           |  Bin 0 -> 103224 bytes
 .../msq-ui-download-query-results.png              |  Bin 0 -> 62538 bytes
 .../multi-stage-query/tutorial-msq-convert.png     |  Bin 0 -> 80379 bytes
 .../assets/multi-stage-query/ui-annotated.png      |  Bin 0 -> 227968 bytes
 docs/latest/assets/multi-stage-query/ui-empty.png  |  Bin 0 -> 77306 bytes
 docs/latest/assets/nested-combined-json.png        |  Bin 0 -> 272858 bytes
 docs/latest/assets/nested-display-data-types.png   |  Bin 0 -> 254224 bytes
 docs/latest/assets/nested-examine-schema.png       |  Bin 0 -> 251706 bytes
 docs/latest/assets/nested-extract-as-type.png      |  Bin 0 -> 288918 bytes
 docs/latest/assets/nested-extract-elements.png     |  Bin 0 -> 317905 bytes
 docs/latest/assets/nested-group-aggregate.png      |  Bin 0 -> 249178 bytes
 .../assets/nested-msq-ingestion-transform.png      |  Bin 0 -> 370419 bytes
 docs/latest/assets/nested-msq-ingestion.png        |  Bin 0 -> 302033 bytes
 docs/latest/assets/nested-parse-deserialize.png    |  Bin 0 -> 213791 bytes
 docs/latest/assets/nested-retrieve-json.png        |  Bin 0 -> 295566 bytes
 docs/latest/assets/nested-return-json.png          |  Bin 0 -> 349144 bytes
 docs/latest/assets/tutorial-quickstart-02.png      |  Bin 0 -> 115511 bytes
 docs/latest/assets/tutorial-quickstart-03.png      |  Bin 0 -> 174445 bytes
 docs/latest/assets/tutorial-quickstart-04.png      |  Bin 0 -> 144088 bytes
 docs/latest/assets/tutorial-quickstart-05.png      |  Bin 0 -> 84116 bytes
 docs/latest/assets/tutorial-theta-01.png           |  Bin 0 -> 160923 bytes
 docs/latest/assets/tutorial-theta-02.png           |  Bin 0 -> 149124 bytes
 docs/latest/assets/tutorial-theta-03.png           |  Bin 0 -> 183232 bytes
 docs/latest/assets/tutorial-theta-04.png           |  Bin 0 -> 162593 bytes
 docs/latest/assets/tutorial-theta-05.png           |  Bin 0 -> 215624 bytes
 docs/latest/assets/tutorial-theta-06.png           |  Bin 0 -> 146114 bytes
 docs/latest/assets/tutorial-theta-07.png           |  Bin 0 -> 125992 bytes
 docs/latest/assets/tutorial-theta-08.png           |  Bin 0 -> 70597 bytes
 docs/latest/assets/tutorial-theta-09.png           |  Bin 0 -> 86495 bytes
 docs/latest/assets/tutorial-theta-10.png           |  Bin 0 -> 86440 bytes
 docs/latest/assets/tutorial-theta-11.png           |  Bin 0 -> 86126 bytes
 docs/latest/assets/web-console-01-home-view.png    |  Bin 62928 -> 74166 bytes
 .../latest/assets/web-console-02-data-loader-1.png |  Bin 80587 -> 99786 bytes
 .../latest/assets/web-console-03-data-loader-2.png |  Bin 280137 -> 275998 bytes
 docs/latest/assets/web-console-04-datasources.png  |  Bin 113501 -> 112268 bytes
 docs/latest/assets/web-console-05-retention.png    |  Bin 99148 -> 83062 bytes
 docs/latest/assets/web-console-06-segments.png     |  Bin 136070 -> 79223 bytes
 docs/latest/assets/web-console-07-supervisors.png  |  Bin 77637 -> 136709 bytes
 .../assets/web-console-08-supervisor-status.png    |  Bin 82538 -> 93077 bytes
 docs/latest/assets/web-console-09-task-status.png  |  Bin 251600 -> 195995 bytes
 docs/latest/assets/web-console-10-servers.png      |  Bin 92508 -> 93976 bytes
 docs/latest/assets/web-console-11-query-sql.png    |  Bin 136714 -> 131799 bytes
 docs/latest/assets/web-console-12-query-rune.png   |  Bin 94341 -> 106246 bytes
 docs/latest/assets/web-console-13-lookups.png      |  Bin 56556 -> 71735 bytes
 .../latest/comparisons/druid-vs-elasticsearch.html |    8 +-
 docs/latest/comparisons/druid-vs-key-value.html    |    8 +-
 docs/latest/comparisons/druid-vs-kudu.html         |    8 +-
 docs/latest/comparisons/druid-vs-redshift.html     |    8 +-
 docs/latest/comparisons/druid-vs-spark.html        |    8 +-
 .../latest/comparisons/druid-vs-sql-on-hadoop.html |   10 +-
 docs/latest/configuration/human-readable-byte.html |    6 +-
 docs/latest/configuration/index.html               |  145 +-
 docs/latest/configuration/logging.html             |   18 +-
 docs/latest/dependencies/deep-storage.html         |    8 +-
 docs/latest/dependencies/metadata-storage.html     |    8 +-
 docs/latest/dependencies/zookeeper.html            |    8 +-
 docs/latest/design/architecture.html               |    8 +-
 docs/latest/design/auth.html                       |    8 +-
 docs/latest/design/broker.html                     |    9 +-
 docs/latest/design/coordinator.html                |   48 +-
 .../design/extensions-contrib/dropwizard.html      |    6 +-
 docs/latest/design/historical.html                 |   25 +-
 docs/latest/design/index.html                      |    8 +-
 docs/latest/design/indexer.html                    |    8 +-
 docs/latest/design/indexing-service.html           |    8 +-
 docs/latest/design/middlemanager.html              |    9 +-
 docs/latest/design/overlord.html                   |    9 +-
 docs/latest/design/peons.html                      |    9 +-
 docs/latest/design/processes.html                  |   10 +-
 docs/latest/design/router.html                     |   15 +-
 docs/latest/design/segments.html                   |  248 ++--
 docs/latest/development/build.html                 |   14 +-
 docs/latest/development/experimental.html          |    8 +-
 .../development/extensions-contrib/aliyun-oss.html |    8 +-
 .../extensions-contrib/ambari-metrics-emitter.html |    8 +-
 .../development/extensions-contrib/cassandra.html  |    8 +-
 .../development/extensions-contrib/cloudfiles.html |    8 +-
 .../extensions-contrib/distinctcount.html          |    8 +-
 .../extensions-contrib/gce-extensions.html         |    8 +-
 .../development/extensions-contrib/graphite.html   |    8 +-
 .../development/extensions-contrib/influx.html     |    8 +-
 .../extensions-contrib/influxdb-emitter.html       |    8 +-
 .../extensions-contrib/kafka-emitter.html          |    8 +-
 .../extensions-contrib/materialized-view.html      |    8 +-
 .../extensions-contrib/momentsketch-quantiles.html |    8 +-
 .../extensions-contrib/moving-average-query.html   |    8 +-
 .../extensions-contrib/opentsdb-emitter.html       |    8 +-
 .../development/extensions-contrib/prometheus.html |   10 +-
 .../extensions-contrib/redis-cache.html            |    8 +-
 .../development/extensions-contrib/sqlserver.html  |    8 +-
 .../development/extensions-contrib/statsd.html     |    8 +-
 .../tdigestsketch-quantiles.html                   |    8 +-
 .../development/extensions-contrib/thrift.html     |    8 +-
 .../extensions-contrib/time-min-max.html           |    8 +-
 .../extensions-core/approximate-histograms.html    |   15 +-
 docs/latest/development/extensions-core/avro.html  |    8 +-
 docs/latest/development/extensions-core/azure.html |    8 +-
 .../development/extensions-core/bloom-filter.html  |    8 +-
 .../extensions-core/datasketches-extension.html    |    8 +-
 .../extensions-core/datasketches-hll.html          |    8 +-
 .../extensions-core/datasketches-quantiles.html    |    8 +-
 .../extensions-core/datasketches-theta.html        |    8 +-
 .../extensions-core/datasketches-tuple.html        |   10 +-
 .../development/extensions-core/druid-aws-rds.html |    8 +-
 .../extensions-core/druid-basic-security.html      |    8 +-
 .../extensions-core/druid-kerberos.html            |    8 +-
 .../development/extensions-core/druid-lookups.html |    8 +-
 .../development/extensions-core/druid-pac4j.html   |   10 +-
 .../extensions-core/druid-ranger-security.html     |    8 +-
 .../development/extensions-core/examples.html      |    6 +-
 .../latest/development/extensions-core/google.html |    8 +-
 docs/latest/development/extensions-core/hdfs.html  |    8 +-
 .../kafka-extraction-namespace.html                |   58 +-
 .../extensions-core/kafka-ingestion.html           |   11 +-
 .../kafka-supervisor-operations.html               |    8 +-
 .../kafka-supervisor-reference.html                |   12 +-
 .../extensions-core/kinesis-ingestion.html         |   11 +-
 .../development/extensions-core/kubernetes.html    |    8 +-
 .../extensions-core/lookups-cached-global.html     |   11 +-
 docs/latest/development/extensions-core/mysql.html |   12 +-
 docs/latest/development/extensions-core/orc.html   |    8 +-
 .../development/extensions-core/parquet.html       |    8 +-
 .../development/extensions-core/postgresql.html    |    8 +-
 .../development/extensions-core/protobuf.html      |    8 +-
 docs/latest/development/extensions-core/s3.html    |    8 +-
 .../extensions-core/simple-client-sslcontext.html  |    8 +-
 docs/latest/development/extensions-core/stats.html |    8 +-
 .../development/extensions-core/test-stats.html    |    8 +-
 docs/latest/development/extensions.html            |    9 +-
 docs/latest/development/geo.html                   |    8 +-
 docs/latest/development/javascript.html            |    8 +-
 docs/latest/development/modules.html               |    8 +-
 docs/latest/development/overview.html              |    8 +-
 docs/latest/development/versioning.html            |    8 +-
 docs/latest/ingestion/automatic-compaction.html    |  232 +++
 docs/latest/ingestion/compaction.html              |   79 +-
 docs/latest/ingestion/data-formats.html            |   16 +-
 docs/latest/ingestion/data-management.html         |    8 +-
 docs/latest/ingestion/data-model.html              |    8 +-
 docs/latest/ingestion/faq.html                     |    8 +-
 docs/latest/ingestion/firehose.html                |    8 +
 docs/latest/ingestion/flatten-json.html            |    8 +
 docs/latest/ingestion/hadoop.html                  |    8 +-
 docs/latest/ingestion/index.html                   |    8 +-
 docs/latest/ingestion/ingestion-spec.html          |   16 +-
 docs/latest/ingestion/native-batch-firehose.html   |    8 +-
 .../ingestion/native-batch-input-sources.html      |  155 +-
 .../latest/ingestion/native-batch-simple-task.html |   11 +-
 docs/latest/ingestion/native-batch.html            |  146 +-
 docs/latest/ingestion/partitioning.html            |    8 +-
 docs/latest/ingestion/rollup.html                  |   22 +-
 docs/latest/ingestion/schema-design.html           |   23 +-
 docs/latest/ingestion/standalone-realtime.html     |    8 +-
 docs/latest/ingestion/tasks.html                   |   12 +-
 docs/latest/ingestion/tranquility.html             |    6 +-
 docs/latest/ingestion/transform-spec.html          |    8 +
 docs/latest/misc/math-expr.html                    |   45 +-
 docs/latest/misc/papers-and-talks.html             |    8 +-
 docs/latest/multi-stage-query/api.html             | 1528 ++++++++++++++++++++
 docs/latest/multi-stage-query/concepts.html        |  222 +++
 .../multi-stage-query/connect-external-data.html   |  203 +++
 .../multi-stage-query/convert-json-spec.html       |  233 +++
 docs/latest/multi-stage-query/examples.html        |  529 +++++++
 docs/latest/multi-stage-query/index.html           |  355 +++++
 docs/latest/multi-stage-query/known-issues.html    |  181 +++
 docs/latest/multi-stage-query/reference.html       |  219 +++
 docs/latest/multi-stage-query/security.html        |  117 ++
 docs/latest/operations/alerts.html                 |    8 +-
 docs/latest/operations/api-reference.html          |   50 +-
 docs/latest/operations/auth-ldap.html              |    8 +-
 docs/latest/operations/basic-cluster-tuning.html   |    8 +-
 docs/latest/operations/clean-metadata-store.html   |    8 +-
 docs/latest/operations/deep-storage-migration.html |    8 +-
 docs/latest/operations/druid-console.html          |  128 +-
 docs/latest/operations/dump-segment.html           |    8 +-
 .../latest/operations/dynamic-config-provider.html |    8 +-
 docs/latest/operations/export-metadata.html        |    8 +-
 docs/latest/operations/getting-started.html        |    8 +-
 docs/latest/operations/high-availability.html      |    8 +-
 docs/latest/operations/http-compression.html       |    8 +-
 docs/latest/operations/insert-segment-to-db.html   |    8 +-
 docs/latest/operations/java.html                   |  150 ++
 docs/latest/operations/kubernetes.html             |    8 +-
 docs/latest/operations/management-uis.html         |    8 +-
 docs/latest/operations/metadata-migration.html     |    8 +-
 docs/latest/operations/metrics.html                |   52 +-
 docs/latest/operations/mixed-workloads.html        |    8 +-
 docs/latest/operations/other-hadoop.html           |    8 +-
 docs/latest/operations/password-provider.html      |    8 +-
 docs/latest/operations/pull-deps.html              |   20 +-
 docs/latest/operations/request-logging.html        |    9 +-
 docs/latest/operations/reset-cluster.html          |    8 +-
 docs/latest/operations/rolling-updates.html        |    8 +-
 docs/latest/operations/rule-configuration.html     |    8 +-
 docs/latest/operations/security-overview.html      |   14 +-
 docs/latest/operations/security-user-auth.html     |   39 +-
 docs/latest/operations/segment-optimization.html   |   20 +-
 docs/latest/operations/single-server.html          |    8 +-
 docs/latest/operations/tls-support.html            |   10 +-
 .../operations/use_sbt_to_build_fat_jar.html       |    8 +-
 docs/latest/querying/aggregations.html             |    8 +-
 docs/latest/querying/caching.html                  |    8 +-
 docs/latest/querying/datasource.html               |   34 +-
 docs/latest/querying/datasourcemetadataquery.html  |    8 +-
 docs/latest/querying/dimensionspecs.html           |    8 +-
 docs/latest/querying/filters.html                  |   21 +-
 docs/latest/querying/granularities.html            |   36 +-
 docs/latest/querying/groupbyquery.html             |   17 +-
 docs/latest/querying/having.html                   |    8 +-
 docs/latest/querying/hll-old.html                  |    8 +-
 docs/latest/querying/joins.html                    |    8 +-
 docs/latest/querying/limitspec.html                |    8 +-
 docs/latest/querying/lookups.html                  |   14 +-
 docs/latest/querying/multi-value-dimensions.html   |    8 +-
 docs/latest/querying/multitenancy.html             |   13 +-
 docs/latest/querying/nested-columns.html           |  467 ++++++
 docs/latest/querying/post-aggregations.html        |    8 +-
 docs/latest/querying/query-context.html            |   10 +-
 docs/latest/querying/query-execution.html          |    8 +-
 docs/latest/querying/querying.html                 |    8 +-
 docs/latest/querying/scan-query.html               |    8 +-
 docs/latest/querying/searchquery.html              |    9 +-
 docs/latest/querying/segmentmetadataquery.html     |    8 +-
 docs/latest/querying/select-query.html             |    8 +-
 docs/latest/querying/sorting-orders.html           |    8 +-
 docs/latest/querying/sql-aggregations.html         |    8 +-
 docs/latest/querying/sql-api.html                  |    8 +-
 docs/latest/querying/sql-data-types.html           |   53 +-
 docs/latest/querying/sql-functions.html            |  783 ++++++++++
 docs/latest/querying/sql-jdbc.html                 |    8 +-
 docs/latest/querying/sql-json-functions.html       |  148 ++
 docs/latest/querying/sql-metadata-tables.html      |   34 +-
 .../querying/sql-multivalue-string-functions.html  |    8 +-
 docs/latest/querying/sql-operators.html            |    8 +-
 docs/latest/querying/sql-query-context.html        |   10 +-
 docs/latest/querying/sql-scalar.html               |   37 +-
 docs/latest/querying/sql-translation.html          |  156 +-
 docs/latest/querying/sql.html                      |   35 +-
 docs/latest/querying/timeboundaryquery.html        |    8 +-
 docs/latest/querying/timeseriesquery.html          |    9 +-
 docs/latest/querying/topnmetricspec.html           |    8 +-
 docs/latest/querying/topnquery.html                |    9 +-
 docs/latest/querying/troubleshooting.html          |    8 +-
 docs/latest/querying/using-caching.html            |    8 +-
 docs/latest/querying/virtual-columns.html          |  114 +-
 docs/latest/tutorials/cluster.html                 |   23 +-
 docs/latest/tutorials/docker.html                  |   18 +-
 docs/latest/tutorials/index.html                   |  257 ++--
 docs/latest/tutorials/tutorial-batch-hadoop.html   |   12 +-
 docs/latest/tutorials/tutorial-batch-native.html   |  133 ++
 docs/latest/tutorials/tutorial-batch.html          |   14 +-
 docs/latest/tutorials/tutorial-compaction.html     |   88 +-
 docs/latest/tutorials/tutorial-delete-data.html    |    8 +-
 docs/latest/tutorials/tutorial-ingestion-spec.html |   23 +-
 docs/latest/tutorials/tutorial-kafka.html          |   10 +-
 .../latest/tutorials/tutorial-kerberos-hadoop.html |    8 +-
 .../tutorials/tutorial-msq-convert-json.html       |  117 ++
 .../tutorials/tutorial-msq-external-data.html      |  117 ++
 docs/latest/tutorials/tutorial-query.html          |   18 +-
 docs/latest/tutorials/tutorial-retention.html      |   12 +-
 docs/latest/tutorials/tutorial-rollup.html         |   14 +-
 docs/latest/tutorials/tutorial-sketches-theta.html |  363 +++++
 docs/latest/tutorials/tutorial-transform-spec.html |   12 +-
 docs/latest/tutorials/tutorial-update-data.html    |    8 +-
 release.sh                                         |   24 +-
 796 files changed, 40948 insertions(+), 2891 deletions(-)

diff --git a/_config.yml b/_config.yml
index 85ec9917..c2a6fbcd 100644
--- a/_config.yml
+++ b/_config.yml
@@ -26,6 +26,10 @@ description: 'Real²time Exploratory Analytics on Large Datasets'
 
 
 druid_versions:
+  - release: 24.0
+    versions:
+      - version: 24.0.0
+        date: 2022-09-15
   - release: 0.23
     versions:
       - version: 0.23.0
diff --git a/docs/24.0.0/About-Experimental-Features.html b/docs/24.0.0/About-Experimental-Features.html
new file mode 100644
index 00000000..4c16ee2f
--- /dev/null
+++ b/docs/24.0.0/About-Experimental-Features.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="development/experimental.html">
+<meta http-equiv="refresh" content="0; url=development/experimental.html">
+<h1>Redirecting...</h1>
+<a href="development/experimental.html">Click here if you are not redirected.</a>
+<script>location="development/experimental.html"</script>
diff --git a/docs/24.0.0/Aggregations.html b/docs/24.0.0/Aggregations.html
new file mode 100644
index 00000000..08794b9a
--- /dev/null
+++ b/docs/24.0.0/Aggregations.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/aggregations.html">
+<meta http-equiv="refresh" content="0; url=querying/aggregations.html">
+<h1>Redirecting...</h1>
+<a href="querying/aggregations.html">Click here if you are not redirected.</a>
+<script>location="querying/aggregations.html"</script>
diff --git a/docs/24.0.0/ApproxHisto.html b/docs/24.0.0/ApproxHisto.html
new file mode 100644
index 00000000..4e654a9d
--- /dev/null
+++ b/docs/24.0.0/ApproxHisto.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="development/extensions-core/approximate-histograms.html">
+<meta http-equiv="refresh" content="0; url=development/extensions-core/approximate-histograms.html">
+<h1>Redirecting...</h1>
+<a href="development/extensions-core/approximate-histograms.html">Click here if you are not redirected.</a>
+<script>location="development/extensions-core/approximate-histograms.html"</script>
diff --git a/docs/24.0.0/Batch-ingestion.html b/docs/24.0.0/Batch-ingestion.html
new file mode 100644
index 00000000..b571cbdb
--- /dev/null
+++ b/docs/24.0.0/Batch-ingestion.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="ingestion/index.html">
+<meta http-equiv="refresh" content="0; url=ingestion/index.html">
+<h1>Redirecting...</h1>
+<a href="ingestion/index.html">Click here if you are not redirected.</a>
+<script>location="ingestion/index.html"</script>
diff --git a/docs/24.0.0/Booting-a-production-cluster.html b/docs/24.0.0/Booting-a-production-cluster.html
new file mode 100644
index 00000000..bd0e468e
--- /dev/null
+++ b/docs/24.0.0/Booting-a-production-cluster.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/cluster.html">
+<meta http-equiv="refresh" content="0; url=tutorials/cluster.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/cluster.html">Click here if you are not redirected.</a>
+<script>location="tutorials/cluster.html"</script>
diff --git a/docs/24.0.0/Broker-Config.html b/docs/24.0.0/Broker-Config.html
new file mode 100644
index 00000000..01b38ae1
--- /dev/null
+++ b/docs/24.0.0/Broker-Config.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="configuration/index.html#broker">
+<meta http-equiv="refresh" content="0; url=configuration/index.html#broker">
+<h1>Redirecting...</h1>
+<a href="configuration/index.html#broker">Click here if you are not redirected.</a>
+<script>location="configuration/index.html#broker"</script>
diff --git a/docs/24.0.0/Broker.html b/docs/24.0.0/Broker.html
new file mode 100644
index 00000000..a28166f0
--- /dev/null
+++ b/docs/24.0.0/Broker.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="design/broker.html">
+<meta http-equiv="refresh" content="0; url=design/broker.html">
+<h1>Redirecting...</h1>
+<a href="design/broker.html">Click here if you are not redirected.</a>
+<script>location="design/broker.html"</script>
diff --git a/docs/24.0.0/Build-from-source.html b/docs/24.0.0/Build-from-source.html
new file mode 100644
index 00000000..30898e7b
--- /dev/null
+++ b/docs/24.0.0/Build-from-source.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="development/build.html">
+<meta http-equiv="refresh" content="0; url=development/build.html">
+<h1>Redirecting...</h1>
+<a href="development/build.html">Click here if you are not redirected.</a>
+<script>location="development/build.html"</script>
diff --git a/docs/24.0.0/Cassandra-Deep-Storage.html b/docs/24.0.0/Cassandra-Deep-Storage.html
new file mode 100644
index 00000000..31d68412
--- /dev/null
+++ b/docs/24.0.0/Cassandra-Deep-Storage.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="configuration/index.html#cassandra-deep-storage">
+<meta http-equiv="refresh" content="0; url=configuration/index.html#cassandra-deep-storage">
+<h1>Redirecting...</h1>
+<a href="configuration/index.html#cassandra-deep-storage">Click here if you are not redirected.</a>
+<script>location="configuration/index.html#cassandra-deep-storage"</script>
diff --git a/docs/24.0.0/Cluster-setup.html b/docs/24.0.0/Cluster-setup.html
new file mode 100644
index 00000000..bd0e468e
--- /dev/null
+++ b/docs/24.0.0/Cluster-setup.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/cluster.html">
+<meta http-equiv="refresh" content="0; url=tutorials/cluster.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/cluster.html">Click here if you are not redirected.</a>
+<script>location="tutorials/cluster.html"</script>
diff --git a/docs/24.0.0/Compute.html b/docs/24.0.0/Compute.html
new file mode 100644
index 00000000..c3bea73f
--- /dev/null
+++ b/docs/24.0.0/Compute.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="design/processes.html">
+<meta http-equiv="refresh" content="0; url=design/processes.html">
+<h1>Redirecting...</h1>
+<a href="design/processes.html">Click here if you are not redirected.</a>
+<script>location="design/processes.html"</script>
diff --git a/docs/24.0.0/Concepts-and-Terminology.html b/docs/24.0.0/Concepts-and-Terminology.html
new file mode 100644
index 00000000..57986ec4
--- /dev/null
+++ b/docs/24.0.0/Concepts-and-Terminology.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="design/index.html">
+<meta http-equiv="refresh" content="0; url=design/index.html">
+<h1>Redirecting...</h1>
+<a href="design/index.html">Click here if you are not redirected.</a>
+<script>location="design/index.html"</script>
diff --git a/docs/24.0.0/Configuration.html b/docs/24.0.0/Configuration.html
new file mode 100644
index 00000000..ea6ae539
--- /dev/null
+++ b/docs/24.0.0/Configuration.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="configuration/index.html">
+<meta http-equiv="refresh" content="0; url=configuration/index.html">
+<h1>Redirecting...</h1>
+<a href="configuration/index.html">Click here if you are not redirected.</a>
+<script>location="configuration/index.html"</script>
diff --git a/docs/24.0.0/Contribute.html b/docs/24.0.0/Contribute.html
new file mode 100644
index 00000000..ea714083
--- /dev/null
+++ b/docs/24.0.0/Contribute.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="/community/">
+<meta http-equiv="refresh" content="0; url=/community/">
+<h1>Redirecting...</h1>
+<a href="/community/">Click here if you are not redirected.</a>
+<script>location="/community/"</script>
diff --git a/docs/24.0.0/Coordinator-Config.html b/docs/24.0.0/Coordinator-Config.html
new file mode 100644
index 00000000..bb3def4f
--- /dev/null
+++ b/docs/24.0.0/Coordinator-Config.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="configuration/index.html#coordinator">
+<meta http-equiv="refresh" content="0; url=configuration/index.html#coordinator">
+<h1>Redirecting...</h1>
+<a href="configuration/index.html#coordinator">Click here if you are not redirected.</a>
+<script>location="configuration/index.html#coordinator"</script>
diff --git a/docs/24.0.0/Coordinator.html b/docs/24.0.0/Coordinator.html
new file mode 100644
index 00000000..accfe43e
--- /dev/null
+++ b/docs/24.0.0/Coordinator.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="design/coordinator.html">
+<meta http-equiv="refresh" content="0; url=design/coordinator.html">
+<h1>Redirecting...</h1>
+<a href="design/coordinator.html">Click here if you are not redirected.</a>
+<script>location="design/coordinator.html"</script>
diff --git a/docs/24.0.0/DataSource.html b/docs/24.0.0/DataSource.html
new file mode 100644
index 00000000..cde17710
--- /dev/null
+++ b/docs/24.0.0/DataSource.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/datasource.html">
+<meta http-equiv="refresh" content="0; url=querying/datasource.html">
+<h1>Redirecting...</h1>
+<a href="querying/datasource.html">Click here if you are not redirected.</a>
+<script>location="querying/datasource.html"</script>
diff --git a/docs/24.0.0/DataSourceMetadataQuery.html b/docs/24.0.0/DataSourceMetadataQuery.html
new file mode 100644
index 00000000..6c7cd572
--- /dev/null
+++ b/docs/24.0.0/DataSourceMetadataQuery.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/datasourcemetadataquery.html">
+<meta http-equiv="refresh" content="0; url=querying/datasourcemetadataquery.html">
+<h1>Redirecting...</h1>
+<a href="querying/datasourcemetadataquery.html">Click here if you are not redirected.</a>
+<script>location="querying/datasourcemetadataquery.html"</script>
diff --git a/docs/24.0.0/Data_formats.html b/docs/24.0.0/Data_formats.html
new file mode 100644
index 00000000..ae6f6734
--- /dev/null
+++ b/docs/24.0.0/Data_formats.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="ingestion/data-formats.html">
+<meta http-equiv="refresh" content="0; url=ingestion/data-formats.html">
+<h1>Redirecting...</h1>
+<a href="ingestion/data-formats.html">Click here if you are not redirected.</a>
+<script>location="ingestion/data-formats.html"</script>
diff --git a/docs/24.0.0/Deep-Storage.html b/docs/24.0.0/Deep-Storage.html
new file mode 100644
index 00000000..07a7cd5c
--- /dev/null
+++ b/docs/24.0.0/Deep-Storage.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="dependencies/deep-storage.html">
+<meta http-equiv="refresh" content="0; url=dependencies/deep-storage.html">
+<h1>Redirecting...</h1>
+<a href="dependencies/deep-storage.html">Click here if you are not redirected.</a>
+<script>location="dependencies/deep-storage.html"</script>
diff --git a/docs/24.0.0/Design.html b/docs/24.0.0/Design.html
new file mode 100644
index 00000000..57986ec4
--- /dev/null
+++ b/docs/24.0.0/Design.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="design/index.html">
+<meta http-equiv="refresh" content="0; url=design/index.html">
+<h1>Redirecting...</h1>
+<a href="design/index.html">Click here if you are not redirected.</a>
+<script>location="design/index.html"</script>
diff --git a/docs/24.0.0/DimensionSpecs.html b/docs/24.0.0/DimensionSpecs.html
new file mode 100644
index 00000000..7ab536ae
--- /dev/null
+++ b/docs/24.0.0/DimensionSpecs.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/dimensionspecs.html">
+<meta http-equiv="refresh" content="0; url=querying/dimensionspecs.html">
+<h1>Redirecting...</h1>
+<a href="querying/dimensionspecs.html">Click here if you are not redirected.</a>
+<script>location="querying/dimensionspecs.html"</script>
diff --git a/docs/24.0.0/Download.html b/docs/24.0.0/Download.html
new file mode 100644
index 00000000..cfb2d2b1
--- /dev/null
+++ b/docs/24.0.0/Download.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="/downloads.html">
+<meta http-equiv="refresh" content="0; url=/downloads.html">
+<h1>Redirecting...</h1>
+<a href="/downloads.html">Click here if you are not redirected.</a>
+<script>location="/downloads.html"</script>
diff --git a/docs/24.0.0/Druid-Personal-Demo-Cluster.html b/docs/24.0.0/Druid-Personal-Demo-Cluster.html
new file mode 100644
index 00000000..94e7c062
--- /dev/null
+++ b/docs/24.0.0/Druid-Personal-Demo-Cluster.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/index.html">
+<meta http-equiv="refresh" content="0; url=tutorials/index.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/index.html">Click here if you are not redirected.</a>
+<script>location="tutorials/index.html"</script>
diff --git a/docs/24.0.0/Druid-vs-Cassandra.html b/docs/24.0.0/Druid-vs-Cassandra.html
new file mode 100644
index 00000000..1a0249a5
--- /dev/null
+++ b/docs/24.0.0/Druid-vs-Cassandra.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="comparisons/druid-vs-key-value.html">
+<meta http-equiv="refresh" content="0; url=comparisons/druid-vs-key-value.html">
+<h1>Redirecting...</h1>
+<a href="comparisons/druid-vs-key-value.html">Click here if you are not redirected.</a>
+<script>location="comparisons/druid-vs-key-value.html"</script>
diff --git a/docs/24.0.0/Druid-vs-Elasticsearch.html b/docs/24.0.0/Druid-vs-Elasticsearch.html
new file mode 100644
index 00000000..5d519fb9
--- /dev/null
+++ b/docs/24.0.0/Druid-vs-Elasticsearch.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="comparisons/druid-vs-elasticsearch.html">
+<meta http-equiv="refresh" content="0; url=comparisons/druid-vs-elasticsearch.html">
+<h1>Redirecting...</h1>
+<a href="comparisons/druid-vs-elasticsearch.html">Click here if you are not redirected.</a>
+<script>location="comparisons/druid-vs-elasticsearch.html"</script>
diff --git a/docs/24.0.0/Druid-vs-Hadoop.html b/docs/24.0.0/Druid-vs-Hadoop.html
new file mode 100644
index 00000000..d5202e75
--- /dev/null
+++ b/docs/24.0.0/Druid-vs-Hadoop.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="comparisons/druid-vs-sql-on-hadoop.html">
+<meta http-equiv="refresh" content="0; url=comparisons/druid-vs-sql-on-hadoop.html">
+<h1>Redirecting...</h1>
+<a href="comparisons/druid-vs-sql-on-hadoop.html">Click here if you are not redirected.</a>
+<script>location="comparisons/druid-vs-sql-on-hadoop.html"</script>
diff --git a/docs/24.0.0/Druid-vs-Impala-or-Shark.html b/docs/24.0.0/Druid-vs-Impala-or-Shark.html
new file mode 100644
index 00000000..d5202e75
--- /dev/null
+++ b/docs/24.0.0/Druid-vs-Impala-or-Shark.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="comparisons/druid-vs-sql-on-hadoop.html">
+<meta http-equiv="refresh" content="0; url=comparisons/druid-vs-sql-on-hadoop.html">
+<h1>Redirecting...</h1>
+<a href="comparisons/druid-vs-sql-on-hadoop.html">Click here if you are not redirected.</a>
+<script>location="comparisons/druid-vs-sql-on-hadoop.html"</script>
diff --git a/docs/24.0.0/Druid-vs-Redshift.html b/docs/24.0.0/Druid-vs-Redshift.html
new file mode 100644
index 00000000..41996966
--- /dev/null
+++ b/docs/24.0.0/Druid-vs-Redshift.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="comparisons/druid-vs-redshift.html">
+<meta http-equiv="refresh" content="0; url=comparisons/druid-vs-redshift.html">
+<h1>Redirecting...</h1>
+<a href="comparisons/druid-vs-redshift.html">Click here if you are not redirected.</a>
+<script>location="comparisons/druid-vs-redshift.html"</script>
diff --git a/docs/24.0.0/Druid-vs-Spark.html b/docs/24.0.0/Druid-vs-Spark.html
new file mode 100644
index 00000000..31713ad3
--- /dev/null
+++ b/docs/24.0.0/Druid-vs-Spark.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="comparisons/druid-vs-spark.html">
+<meta http-equiv="refresh" content="0; url=comparisons/druid-vs-spark.html">
+<h1>Redirecting...</h1>
+<a href="comparisons/druid-vs-spark.html">Click here if you are not redirected.</a>
+<script>location="comparisons/druid-vs-spark.html"</script>
diff --git a/docs/24.0.0/Druid-vs-Vertica.html b/docs/24.0.0/Druid-vs-Vertica.html
new file mode 100644
index 00000000..41996966
--- /dev/null
+++ b/docs/24.0.0/Druid-vs-Vertica.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="comparisons/druid-vs-redshift.html">
+<meta http-equiv="refresh" content="0; url=comparisons/druid-vs-redshift.html">
+<h1>Redirecting...</h1>
+<a href="comparisons/druid-vs-redshift.html">Click here if you are not redirected.</a>
+<script>location="comparisons/druid-vs-redshift.html"</script>
diff --git a/docs/24.0.0/Evaluate.html b/docs/24.0.0/Evaluate.html
new file mode 100644
index 00000000..bd0e468e
--- /dev/null
+++ b/docs/24.0.0/Evaluate.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/cluster.html">
+<meta http-equiv="refresh" content="0; url=tutorials/cluster.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/cluster.html">Click here if you are not redirected.</a>
+<script>location="tutorials/cluster.html"</script>
diff --git a/docs/24.0.0/Examples.html b/docs/24.0.0/Examples.html
new file mode 100644
index 00000000..94e7c062
--- /dev/null
+++ b/docs/24.0.0/Examples.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/index.html">
+<meta http-equiv="refresh" content="0; url=tutorials/index.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/index.html">Click here if you are not redirected.</a>
+<script>location="tutorials/index.html"</script>
diff --git a/docs/24.0.0/Filters.html b/docs/24.0.0/Filters.html
new file mode 100644
index 00000000..a3180951
--- /dev/null
+++ b/docs/24.0.0/Filters.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/filters.html">
+<meta http-equiv="refresh" content="0; url=querying/filters.html">
+<h1>Redirecting...</h1>
+<a href="querying/filters.html">Click here if you are not redirected.</a>
+<script>location="querying/filters.html"</script>
diff --git a/docs/24.0.0/Firehose.html b/docs/24.0.0/Firehose.html
new file mode 100644
index 00000000..8a292178
--- /dev/null
+++ b/docs/24.0.0/Firehose.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="ingestion/native-batch-firehose.html">
+<meta http-equiv="refresh" content="0; url=ingestion/native-batch-firehose.html">
+<h1>Redirecting...</h1>
+<a href="ingestion/native-batch-firehose.html">Click here if you are not redirected.</a>
+<script>location="ingestion/native-batch-firehose.html"</script>
diff --git a/docs/24.0.0/GeographicQueries.html b/docs/24.0.0/GeographicQueries.html
new file mode 100644
index 00000000..566645a8
--- /dev/null
+++ b/docs/24.0.0/GeographicQueries.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="development/geo.html">
+<meta http-equiv="refresh" content="0; url=development/geo.html">
+<h1>Redirecting...</h1>
+<a href="development/geo.html">Click here if you are not redirected.</a>
+<script>location="development/geo.html"</script>
diff --git a/docs/24.0.0/Granularities.html b/docs/24.0.0/Granularities.html
new file mode 100644
index 00000000..05ddc32b
--- /dev/null
+++ b/docs/24.0.0/Granularities.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/granularities.html">
+<meta http-equiv="refresh" content="0; url=querying/granularities.html">
+<h1>Redirecting...</h1>
+<a href="querying/granularities.html">Click here if you are not redirected.</a>
+<script>location="querying/granularities.html"</script>
diff --git a/docs/24.0.0/GroupByQuery.html b/docs/24.0.0/GroupByQuery.html
new file mode 100644
index 00000000..51a97c67
--- /dev/null
+++ b/docs/24.0.0/GroupByQuery.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/groupbyquery.html">
+<meta http-equiv="refresh" content="0; url=querying/groupbyquery.html">
+<h1>Redirecting...</h1>
+<a href="querying/groupbyquery.html">Click here if you are not redirected.</a>
+<script>location="querying/groupbyquery.html"</script>
diff --git a/docs/24.0.0/Hadoop-Configuration.html b/docs/24.0.0/Hadoop-Configuration.html
new file mode 100644
index 00000000..7e5143c1
--- /dev/null
+++ b/docs/24.0.0/Hadoop-Configuration.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="ingestion/hadoop.html">
+<meta http-equiv="refresh" content="0; url=ingestion/hadoop.html">
+<h1>Redirecting...</h1>
+<a href="ingestion/hadoop.html">Click here if you are not redirected.</a>
+<script>location="ingestion/hadoop.html"</script>
diff --git a/docs/24.0.0/Having.html b/docs/24.0.0/Having.html
new file mode 100644
index 00000000..77150186
--- /dev/null
+++ b/docs/24.0.0/Having.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/having.html">
+<meta http-equiv="refresh" content="0; url=querying/having.html">
+<h1>Redirecting...</h1>
+<a href="querying/having.html">Click here if you are not redirected.</a>
+<script>location="querying/having.html"</script>
diff --git a/docs/24.0.0/Historical-Config.html b/docs/24.0.0/Historical-Config.html
new file mode 100644
index 00000000..20901ecc
--- /dev/null
+++ b/docs/24.0.0/Historical-Config.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="configuration/index.html#historical">
+<meta http-equiv="refresh" content="0; url=configuration/index.html#historical">
+<h1>Redirecting...</h1>
+<a href="configuration/index.html#historical">Click here if you are not redirected.</a>
+<script>location="configuration/index.html#historical"</script>
diff --git a/docs/24.0.0/Historical.html b/docs/24.0.0/Historical.html
new file mode 100644
index 00000000..4654f6a7
--- /dev/null
+++ b/docs/24.0.0/Historical.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="design/historical.html">
+<meta http-equiv="refresh" content="0; url=design/historical.html">
+<h1>Redirecting...</h1>
+<a href="design/historical.html">Click here if you are not redirected.</a>
+<script>location="design/historical.html"</script>
diff --git a/docs/24.0.0/Home.html b/docs/24.0.0/Home.html
new file mode 100644
index 00000000..57986ec4
--- /dev/null
+++ b/docs/24.0.0/Home.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="design/index.html">
+<meta http-equiv="refresh" content="0; url=design/index.html">
+<h1>Redirecting...</h1>
+<a href="design/index.html">Click here if you are not redirected.</a>
+<script>location="design/index.html"</script>
diff --git a/docs/24.0.0/Including-Extensions.html b/docs/24.0.0/Including-Extensions.html
new file mode 100644
index 00000000..89a2675c
--- /dev/null
+++ b/docs/24.0.0/Including-Extensions.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="development/extensions.html#loading-extensions">
+<meta http-equiv="refresh" content="0; url=development/extensions.html#loading-extensions">
+<h1>Redirecting...</h1>
+<a href="development/extensions.html#loading-extensions">Click here if you are not redirected.</a>
+<script>location="development/extensions.html#loading-extensions"</script>
diff --git a/docs/24.0.0/Indexing-Service-Config.html b/docs/24.0.0/Indexing-Service-Config.html
new file mode 100644
index 00000000..b6aa3871
--- /dev/null
+++ b/docs/24.0.0/Indexing-Service-Config.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="configuration/index.html#overlord">
+<meta http-equiv="refresh" content="0; url=configuration/index.html#overlord">
+<h1>Redirecting...</h1>
+<a href="configuration/index.html#overlord">Click here if you are not redirected.</a>
+<script>location="configuration/index.html#overlord"</script>
diff --git a/docs/24.0.0/Indexing-Service.html b/docs/24.0.0/Indexing-Service.html
new file mode 100644
index 00000000..20f139d2
--- /dev/null
+++ b/docs/24.0.0/Indexing-Service.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="design/indexing-service.html">
+<meta http-equiv="refresh" content="0; url=design/indexing-service.html">
+<h1>Redirecting...</h1>
+<a href="design/indexing-service.html">Click here if you are not redirected.</a>
+<script>location="design/indexing-service.html"</script>
diff --git a/docs/24.0.0/Ingestion-FAQ.html b/docs/24.0.0/Ingestion-FAQ.html
new file mode 100644
index 00000000..dddd3a4a
--- /dev/null
+++ b/docs/24.0.0/Ingestion-FAQ.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="ingestion/faq.html">
+<meta http-equiv="refresh" content="0; url=ingestion/faq.html">
+<h1>Redirecting...</h1>
+<a href="ingestion/faq.html">Click here if you are not redirected.</a>
+<script>location="ingestion/faq.html"</script>
diff --git a/docs/24.0.0/Ingestion-overview.html b/docs/24.0.0/Ingestion-overview.html
new file mode 100644
index 00000000..94e7c062
--- /dev/null
+++ b/docs/24.0.0/Ingestion-overview.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/index.html">
+<meta http-equiv="refresh" content="0; url=tutorials/index.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/index.html">Click here if you are not redirected.</a>
+<script>location="tutorials/index.html"</script>
diff --git a/docs/24.0.0/Ingestion.html b/docs/24.0.0/Ingestion.html
new file mode 100644
index 00000000..b571cbdb
--- /dev/null
+++ b/docs/24.0.0/Ingestion.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="ingestion/index.html">
+<meta http-equiv="refresh" content="0; url=ingestion/index.html">
+<h1>Redirecting...</h1>
+<a href="ingestion/index.html">Click here if you are not redirected.</a>
+<script>location="ingestion/index.html"</script>
diff --git a/docs/24.0.0/Integrating-Druid-With-Other-Technologies.html b/docs/24.0.0/Integrating-Druid-With-Other-Technologies.html
new file mode 100644
index 00000000..b571cbdb
--- /dev/null
+++ b/docs/24.0.0/Integrating-Druid-With-Other-Technologies.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="ingestion/index.html">
+<meta http-equiv="refresh" content="0; url=ingestion/index.html">
+<h1>Redirecting...</h1>
+<a href="ingestion/index.html">Click here if you are not redirected.</a>
+<script>location="ingestion/index.html"</script>
diff --git a/docs/24.0.0/Kafka-Eight.html b/docs/24.0.0/Kafka-Eight.html
new file mode 100644
index 00000000..b654b03f
--- /dev/null
+++ b/docs/24.0.0/Kafka-Eight.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="development/extensions-core/kafka-ingestion.html">
+<meta http-equiv="refresh" content="0; url=development/extensions-core/kafka-ingestion.html">
+<h1>Redirecting...</h1>
+<a href="development/extensions-core/kafka-ingestion.html">Click here if you are not redirected.</a>
+<script>location="development/extensions-core/kafka-ingestion.html"</script>
diff --git a/docs/24.0.0/Libraries.html b/docs/24.0.0/Libraries.html
new file mode 100644
index 00000000..545edee5
--- /dev/null
+++ b/docs/24.0.0/Libraries.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="/libraries.html">
+<meta http-equiv="refresh" content="0; url=/libraries.html">
+<h1>Redirecting...</h1>
+<a href="/libraries.html">Click here if you are not redirected.</a>
+<script>location="/libraries.html"</script>
diff --git a/docs/24.0.0/LimitSpec.html b/docs/24.0.0/LimitSpec.html
new file mode 100644
index 00000000..8b6a28db
--- /dev/null
+++ b/docs/24.0.0/LimitSpec.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/limitspec.html">
+<meta http-equiv="refresh" content="0; url=querying/limitspec.html">
+<h1>Redirecting...</h1>
+<a href="querying/limitspec.html">Click here if you are not redirected.</a>
+<script>location="querying/limitspec.html"</script>
diff --git a/docs/24.0.0/Loading-Your-Data.html b/docs/24.0.0/Loading-Your-Data.html
new file mode 100644
index 00000000..b571cbdb
--- /dev/null
+++ b/docs/24.0.0/Loading-Your-Data.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="ingestion/index.html">
+<meta http-equiv="refresh" content="0; url=ingestion/index.html">
+<h1>Redirecting...</h1>
+<a href="ingestion/index.html">Click here if you are not redirected.</a>
+<script>location="ingestion/index.html"</script>
diff --git a/docs/24.0.0/Logging.html b/docs/24.0.0/Logging.html
new file mode 100644
index 00000000..3b2b1357
--- /dev/null
+++ b/docs/24.0.0/Logging.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="configuration/logging.html">
+<meta http-equiv="refresh" content="0; url=configuration/logging.html">
+<h1>Redirecting...</h1>
+<a href="configuration/logging.html">Click here if you are not redirected.</a>
+<script>location="configuration/logging.html"</script>
diff --git a/docs/24.0.0/Master.html b/docs/24.0.0/Master.html
new file mode 100644
index 00000000..c3bea73f
--- /dev/null
+++ b/docs/24.0.0/Master.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="design/processes.html">
+<meta http-equiv="refresh" content="0; url=design/processes.html">
+<h1>Redirecting...</h1>
+<a href="design/processes.html">Click here if you are not redirected.</a>
+<script>location="design/processes.html"</script>
diff --git a/docs/24.0.0/Metadata-storage.html b/docs/24.0.0/Metadata-storage.html
new file mode 100644
index 00000000..f13b3652
--- /dev/null
+++ b/docs/24.0.0/Metadata-storage.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="dependencies/metadata-storage.html">
+<meta http-equiv="refresh" content="0; url=dependencies/metadata-storage.html">
+<h1>Redirecting...</h1>
+<a href="dependencies/metadata-storage.html">Click here if you are not redirected.</a>
+<script>location="dependencies/metadata-storage.html"</script>
diff --git a/docs/24.0.0/Metrics.html b/docs/24.0.0/Metrics.html
new file mode 100644
index 00000000..011ab0b1
--- /dev/null
+++ b/docs/24.0.0/Metrics.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="operations/metrics.html">
+<meta http-equiv="refresh" content="0; url=operations/metrics.html">
+<h1>Redirecting...</h1>
+<a href="operations/metrics.html">Click here if you are not redirected.</a>
+<script>location="operations/metrics.html"</script>
diff --git a/docs/24.0.0/Middlemanager.html b/docs/24.0.0/Middlemanager.html
new file mode 100644
index 00000000..8e9da094
--- /dev/null
+++ b/docs/24.0.0/Middlemanager.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="design/middlemanager.html">
+<meta http-equiv="refresh" content="0; url=design/middlemanager.html">
+<h1>Redirecting...</h1>
+<a href="design/middlemanager.html">Click here if you are not redirected.</a>
+<script>location="design/middlemanager.html"</script>
diff --git a/docs/24.0.0/Modules.html b/docs/24.0.0/Modules.html
new file mode 100644
index 00000000..93a8be19
--- /dev/null
+++ b/docs/24.0.0/Modules.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="development/modules.html">
+<meta http-equiv="refresh" content="0; url=development/modules.html">
+<h1>Redirecting...</h1>
+<a href="development/modules.html">Click here if you are not redirected.</a>
+<script>location="development/modules.html"</script>
diff --git a/docs/24.0.0/MySQL.html b/docs/24.0.0/MySQL.html
new file mode 100644
index 00000000..5c90272d
--- /dev/null
+++ b/docs/24.0.0/MySQL.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="development/extensions-core/mysql.html">
+<meta http-equiv="refresh" content="0; url=development/extensions-core/mysql.html">
+<h1>Redirecting...</h1>
+<a href="development/extensions-core/mysql.html">Click here if you are not redirected.</a>
+<script>location="development/extensions-core/mysql.html"</script>
diff --git a/docs/24.0.0/OrderBy.html b/docs/24.0.0/OrderBy.html
new file mode 100644
index 00000000..8b6a28db
--- /dev/null
+++ b/docs/24.0.0/OrderBy.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/limitspec.html">
+<meta http-equiv="refresh" content="0; url=querying/limitspec.html">
+<h1>Redirecting...</h1>
+<a href="querying/limitspec.html">Click here if you are not redirected.</a>
+<script>location="querying/limitspec.html"</script>
diff --git a/docs/24.0.0/Other-Hadoop.html b/docs/24.0.0/Other-Hadoop.html
new file mode 100644
index 00000000..b7bdd994
--- /dev/null
+++ b/docs/24.0.0/Other-Hadoop.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="operations/other-hadoop.html">
+<meta http-equiv="refresh" content="0; url=operations/other-hadoop.html">
+<h1>Redirecting...</h1>
+<a href="operations/other-hadoop.html">Click here if you are not redirected.</a>
+<script>location="operations/other-hadoop.html"</script>
diff --git a/docs/24.0.0/Papers-and-talks.html b/docs/24.0.0/Papers-and-talks.html
new file mode 100644
index 00000000..4602adbc
--- /dev/null
+++ b/docs/24.0.0/Papers-and-talks.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="misc/papers-and-talks.html">
+<meta http-equiv="refresh" content="0; url=misc/papers-and-talks.html">
+<h1>Redirecting...</h1>
+<a href="misc/papers-and-talks.html">Click here if you are not redirected.</a>
+<script>location="misc/papers-and-talks.html"</script>
diff --git a/docs/24.0.0/Peons.html b/docs/24.0.0/Peons.html
new file mode 100644
index 00000000..e9793f47
--- /dev/null
+++ b/docs/24.0.0/Peons.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="design/peons.html">
+<meta http-equiv="refresh" content="0; url=design/peons.html">
+<h1>Redirecting...</h1>
+<a href="design/peons.html">Click here if you are not redirected.</a>
+<script>location="design/peons.html"</script>
diff --git a/docs/24.0.0/Performance-FAQ.html b/docs/24.0.0/Performance-FAQ.html
new file mode 100644
index 00000000..e6da9b2a
--- /dev/null
+++ b/docs/24.0.0/Performance-FAQ.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="operations/basic-cluster-tuning.html">
+<meta http-equiv="refresh" content="0; url=operations/basic-cluster-tuning.html">
+<h1>Redirecting...</h1>
+<a href="operations/basic-cluster-tuning.html">Click here if you are not redirected.</a>
+<script>location="operations/basic-cluster-tuning.html"</script>
diff --git a/docs/24.0.0/Plumber.html b/docs/24.0.0/Plumber.html
new file mode 100644
index 00000000..b571cbdb
--- /dev/null
+++ b/docs/24.0.0/Plumber.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="ingestion/index.html">
+<meta http-equiv="refresh" content="0; url=ingestion/index.html">
+<h1>Redirecting...</h1>
+<a href="ingestion/index.html">Click here if you are not redirected.</a>
+<script>location="ingestion/index.html"</script>
diff --git a/docs/24.0.0/Post-aggregations.html b/docs/24.0.0/Post-aggregations.html
new file mode 100644
index 00000000..e0c4e24a
--- /dev/null
+++ b/docs/24.0.0/Post-aggregations.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/post-aggregations.html">
+<meta http-equiv="refresh" content="0; url=querying/post-aggregations.html">
+<h1>Redirecting...</h1>
+<a href="querying/post-aggregations.html">Click here if you are not redirected.</a>
+<script>location="querying/post-aggregations.html"</script>
diff --git a/docs/24.0.0/Production-Cluster-Configuration.html b/docs/24.0.0/Production-Cluster-Configuration.html
new file mode 100644
index 00000000..bd0e468e
--- /dev/null
+++ b/docs/24.0.0/Production-Cluster-Configuration.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/cluster.html">
+<meta http-equiv="refresh" content="0; url=tutorials/cluster.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/cluster.html">Click here if you are not redirected.</a>
+<script>location="tutorials/cluster.html"</script>
diff --git a/docs/24.0.0/Query-Context.html b/docs/24.0.0/Query-Context.html
new file mode 100644
index 00000000..711a21e3
--- /dev/null
+++ b/docs/24.0.0/Query-Context.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/query-context.html">
+<meta http-equiv="refresh" content="0; url=querying/query-context.html">
+<h1>Redirecting...</h1>
+<a href="querying/query-context.html">Click here if you are not redirected.</a>
+<script>location="querying/query-context.html"</script>
diff --git a/docs/24.0.0/Querying-your-data.html b/docs/24.0.0/Querying-your-data.html
new file mode 100644
index 00000000..702ed7a7
--- /dev/null
+++ b/docs/24.0.0/Querying-your-data.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/querying.html">
+<meta http-equiv="refresh" content="0; url=querying/querying.html">
+<h1>Redirecting...</h1>
+<a href="querying/querying.html">Click here if you are not redirected.</a>
+<script>location="querying/querying.html"</script>
diff --git a/docs/24.0.0/Querying.html b/docs/24.0.0/Querying.html
new file mode 100644
index 00000000..702ed7a7
--- /dev/null
+++ b/docs/24.0.0/Querying.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/querying.html">
+<meta http-equiv="refresh" content="0; url=querying/querying.html">
+<h1>Redirecting...</h1>
+<a href="querying/querying.html">Click here if you are not redirected.</a>
+<script>location="querying/querying.html"</script>
diff --git a/docs/24.0.0/Realtime-Config.html b/docs/24.0.0/Realtime-Config.html
new file mode 100644
index 00000000..3b8f656e
--- /dev/null
+++ b/docs/24.0.0/Realtime-Config.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="ingestion/standalone-realtime.html">
+<meta http-equiv="refresh" content="0; url=ingestion/standalone-realtime.html">
+<h1>Redirecting...</h1>
+<a href="ingestion/standalone-realtime.html">Click here if you are not redirected.</a>
+<script>location="ingestion/standalone-realtime.html"</script>
diff --git a/docs/24.0.0/Realtime-ingestion.html b/docs/24.0.0/Realtime-ingestion.html
new file mode 100644
index 00000000..b571cbdb
--- /dev/null
+++ b/docs/24.0.0/Realtime-ingestion.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="ingestion/index.html">
+<meta http-equiv="refresh" content="0; url=ingestion/index.html">
+<h1>Redirecting...</h1>
+<a href="ingestion/index.html">Click here if you are not redirected.</a>
+<script>location="ingestion/index.html"</script>
diff --git a/docs/24.0.0/Realtime.html b/docs/24.0.0/Realtime.html
new file mode 100644
index 00000000..3b8f656e
--- /dev/null
+++ b/docs/24.0.0/Realtime.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="ingestion/standalone-realtime.html">
+<meta http-equiv="refresh" content="0; url=ingestion/standalone-realtime.html">
+<h1>Redirecting...</h1>
+<a href="ingestion/standalone-realtime.html">Click here if you are not redirected.</a>
+<script>location="ingestion/standalone-realtime.html"</script>
diff --git a/docs/24.0.0/Recommendations.html b/docs/24.0.0/Recommendations.html
new file mode 100644
index 00000000..e6da9b2a
--- /dev/null
+++ b/docs/24.0.0/Recommendations.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="operations/basic-cluster-tuning.html">
+<meta http-equiv="refresh" content="0; url=operations/basic-cluster-tuning.html">
+<h1>Redirecting...</h1>
+<a href="operations/basic-cluster-tuning.html">Click here if you are not redirected.</a>
+<script>location="operations/basic-cluster-tuning.html"</script>
diff --git a/docs/24.0.0/Rolling-Updates.html b/docs/24.0.0/Rolling-Updates.html
new file mode 100644
index 00000000..90bc8b02
--- /dev/null
+++ b/docs/24.0.0/Rolling-Updates.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="operations/rolling-updates.html">
+<meta http-equiv="refresh" content="0; url=operations/rolling-updates.html">
+<h1>Redirecting...</h1>
+<a href="operations/rolling-updates.html">Click here if you are not redirected.</a>
+<script>location="operations/rolling-updates.html"</script>
diff --git a/docs/24.0.0/Router.html b/docs/24.0.0/Router.html
new file mode 100644
index 00000000..64ba7f4f
--- /dev/null
+++ b/docs/24.0.0/Router.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="design/router.html">
+<meta http-equiv="refresh" content="0; url=design/router.html">
+<h1>Redirecting...</h1>
+<a href="design/router.html">Click here if you are not redirected.</a>
+<script>location="design/router.html"</script>
diff --git a/docs/24.0.0/Rule-Configuration.html b/docs/24.0.0/Rule-Configuration.html
new file mode 100644
index 00000000..19c0e7ea
--- /dev/null
+++ b/docs/24.0.0/Rule-Configuration.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="operations/rule-configuration.html">
+<meta http-equiv="refresh" content="0; url=operations/rule-configuration.html">
+<h1>Redirecting...</h1>
+<a href="operations/rule-configuration.html">Click here if you are not redirected.</a>
+<script>location="operations/rule-configuration.html"</script>
diff --git a/docs/24.0.0/SearchQuery.html b/docs/24.0.0/SearchQuery.html
new file mode 100644
index 00000000..ee66987e
--- /dev/null
+++ b/docs/24.0.0/SearchQuery.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/searchquery.html">
+<meta http-equiv="refresh" content="0; url=querying/searchquery.html">
+<h1>Redirecting...</h1>
+<a href="querying/searchquery.html">Click here if you are not redirected.</a>
+<script>location="querying/searchquery.html"</script>
diff --git a/docs/24.0.0/SearchQuerySpec.html b/docs/24.0.0/SearchQuerySpec.html
new file mode 100644
index 00000000..ee66987e
--- /dev/null
+++ b/docs/24.0.0/SearchQuerySpec.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/searchquery.html">
+<meta http-equiv="refresh" content="0; url=querying/searchquery.html">
+<h1>Redirecting...</h1>
+<a href="querying/searchquery.html">Click here if you are not redirected.</a>
+<script>location="querying/searchquery.html"</script>
diff --git a/docs/24.0.0/SegmentMetadataQuery.html b/docs/24.0.0/SegmentMetadataQuery.html
new file mode 100644
index 00000000..21294cbe
--- /dev/null
+++ b/docs/24.0.0/SegmentMetadataQuery.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/segmentmetadataquery.html">
+<meta http-equiv="refresh" content="0; url=querying/segmentmetadataquery.html">
+<h1>Redirecting...</h1>
+<a href="querying/segmentmetadataquery.html">Click here if you are not redirected.</a>
+<script>location="querying/segmentmetadataquery.html"</script>
diff --git a/docs/24.0.0/Segments.html b/docs/24.0.0/Segments.html
new file mode 100644
index 00000000..040d647a
--- /dev/null
+++ b/docs/24.0.0/Segments.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="design/segments.html">
+<meta http-equiv="refresh" content="0; url=design/segments.html">
+<h1>Redirecting...</h1>
+<a href="design/segments.html">Click here if you are not redirected.</a>
+<script>location="design/segments.html"</script>
diff --git a/docs/24.0.0/SelectQuery.html b/docs/24.0.0/SelectQuery.html
new file mode 100644
index 00000000..526110d4
--- /dev/null
+++ b/docs/24.0.0/SelectQuery.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/select-query.html">
+<meta http-equiv="refresh" content="0; url=querying/select-query.html">
+<h1>Redirecting...</h1>
+<a href="querying/select-query.html">Click here if you are not redirected.</a>
+<script>location="querying/select-query.html"</script>
diff --git a/docs/24.0.0/Simple-Cluster-Configuration.html b/docs/24.0.0/Simple-Cluster-Configuration.html
new file mode 100644
index 00000000..bd0e468e
--- /dev/null
+++ b/docs/24.0.0/Simple-Cluster-Configuration.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/cluster.html">
+<meta http-equiv="refresh" content="0; url=tutorials/cluster.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/cluster.html">Click here if you are not redirected.</a>
+<script>location="tutorials/cluster.html"</script>
diff --git a/docs/24.0.0/Spatial-Filters.html b/docs/24.0.0/Spatial-Filters.html
new file mode 100644
index 00000000..566645a8
--- /dev/null
+++ b/docs/24.0.0/Spatial-Filters.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="development/geo.html">
+<meta http-equiv="refresh" content="0; url=development/geo.html">
+<h1>Redirecting...</h1>
+<a href="development/geo.html">Click here if you are not redirected.</a>
+<script>location="development/geo.html"</script>
diff --git a/docs/24.0.0/Spatial-Indexing.html b/docs/24.0.0/Spatial-Indexing.html
new file mode 100644
index 00000000..566645a8
--- /dev/null
+++ b/docs/24.0.0/Spatial-Indexing.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="development/geo.html">
+<meta http-equiv="refresh" content="0; url=development/geo.html">
+<h1>Redirecting...</h1>
+<a href="development/geo.html">Click here if you are not redirected.</a>
+<script>location="development/geo.html"</script>
diff --git a/docs/24.0.0/Stand-Alone-With-Riak-CS.html b/docs/24.0.0/Stand-Alone-With-Riak-CS.html
new file mode 100644
index 00000000..57986ec4
--- /dev/null
+++ b/docs/24.0.0/Stand-Alone-With-Riak-CS.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="design/index.html">
+<meta http-equiv="refresh" content="0; url=design/index.html">
+<h1>Redirecting...</h1>
+<a href="design/index.html">Click here if you are not redirected.</a>
+<script>location="design/index.html"</script>
diff --git a/docs/24.0.0/Support.html b/docs/24.0.0/Support.html
new file mode 100644
index 00000000..ea714083
--- /dev/null
+++ b/docs/24.0.0/Support.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="/community/">
+<meta http-equiv="refresh" content="0; url=/community/">
+<h1>Redirecting...</h1>
+<a href="/community/">Click here if you are not redirected.</a>
+<script>location="/community/"</script>
diff --git a/docs/24.0.0/Tasks.html b/docs/24.0.0/Tasks.html
new file mode 100644
index 00000000..71e90f8f
--- /dev/null
+++ b/docs/24.0.0/Tasks.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="ingestion/tasks.html">
+<meta http-equiv="refresh" content="0; url=ingestion/tasks.html">
+<h1>Redirecting...</h1>
+<a href="ingestion/tasks.html">Click here if you are not redirected.</a>
+<script>location="ingestion/tasks.html"</script>
diff --git a/docs/24.0.0/Thanks.html b/docs/24.0.0/Thanks.html
new file mode 100644
index 00000000..ea714083
--- /dev/null
+++ b/docs/24.0.0/Thanks.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="/community/">
+<meta http-equiv="refresh" content="0; url=/community/">
+<h1>Redirecting...</h1>
+<a href="/community/">Click here if you are not redirected.</a>
+<script>location="/community/"</script>
diff --git a/docs/24.0.0/TimeBoundaryQuery.html b/docs/24.0.0/TimeBoundaryQuery.html
new file mode 100644
index 00000000..8e512e1a
--- /dev/null
+++ b/docs/24.0.0/TimeBoundaryQuery.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/timeboundaryquery.html">
+<meta http-equiv="refresh" content="0; url=querying/timeboundaryquery.html">
+<h1>Redirecting...</h1>
+<a href="querying/timeboundaryquery.html">Click here if you are not redirected.</a>
+<script>location="querying/timeboundaryquery.html"</script>
diff --git a/docs/24.0.0/TimeseriesQuery.html b/docs/24.0.0/TimeseriesQuery.html
new file mode 100644
index 00000000..8d7f3e8d
--- /dev/null
+++ b/docs/24.0.0/TimeseriesQuery.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/timeseriesquery.html">
+<meta http-equiv="refresh" content="0; url=querying/timeseriesquery.html">
+<h1>Redirecting...</h1>
+<a href="querying/timeseriesquery.html">Click here if you are not redirected.</a>
+<script>location="querying/timeseriesquery.html"</script>
diff --git a/docs/24.0.0/TopNMetricSpec.html b/docs/24.0.0/TopNMetricSpec.html
new file mode 100644
index 00000000..14acf270
--- /dev/null
+++ b/docs/24.0.0/TopNMetricSpec.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/topnmetricspec.html">
+<meta http-equiv="refresh" content="0; url=querying/topnmetricspec.html">
+<h1>Redirecting...</h1>
+<a href="querying/topnmetricspec.html">Click here if you are not redirected.</a>
+<script>location="querying/topnmetricspec.html"</script>
diff --git a/docs/24.0.0/TopNQuery.html b/docs/24.0.0/TopNQuery.html
new file mode 100644
index 00000000..dd719fd5
--- /dev/null
+++ b/docs/24.0.0/TopNQuery.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="querying/topnquery.html">
+<meta http-equiv="refresh" content="0; url=querying/topnquery.html">
+<h1>Redirecting...</h1>
+<a href="querying/topnquery.html">Click here if you are not redirected.</a>
+<script>location="querying/topnquery.html"</script>
diff --git a/docs/24.0.0/Tutorial-A-First-Look-at-Druid.html b/docs/24.0.0/Tutorial-A-First-Look-at-Druid.html
new file mode 100644
index 00000000..94e7c062
--- /dev/null
+++ b/docs/24.0.0/Tutorial-A-First-Look-at-Druid.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/index.html">
+<meta http-equiv="refresh" content="0; url=tutorials/index.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/index.html">Click here if you are not redirected.</a>
+<script>location="tutorials/index.html"</script>
diff --git a/docs/24.0.0/Tutorial-All-About-Queries.html b/docs/24.0.0/Tutorial-All-About-Queries.html
new file mode 100644
index 00000000..94e7c062
--- /dev/null
+++ b/docs/24.0.0/Tutorial-All-About-Queries.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/index.html">
+<meta http-equiv="refresh" content="0; url=tutorials/index.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/index.html">Click here if you are not redirected.</a>
+<script>location="tutorials/index.html"</script>
diff --git a/docs/24.0.0/Tutorial-Loading-Batch-Data.html b/docs/24.0.0/Tutorial-Loading-Batch-Data.html
new file mode 100644
index 00000000..94e7c062
--- /dev/null
+++ b/docs/24.0.0/Tutorial-Loading-Batch-Data.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/index.html">
+<meta http-equiv="refresh" content="0; url=tutorials/index.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/index.html">Click here if you are not redirected.</a>
+<script>location="tutorials/index.html"</script>
diff --git a/docs/24.0.0/Tutorial-Loading-Streaming-Data.html b/docs/24.0.0/Tutorial-Loading-Streaming-Data.html
new file mode 100644
index 00000000..94e7c062
--- /dev/null
+++ b/docs/24.0.0/Tutorial-Loading-Streaming-Data.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/index.html">
+<meta http-equiv="refresh" content="0; url=tutorials/index.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/index.html">Click here if you are not redirected.</a>
+<script>location="tutorials/index.html"</script>
diff --git a/docs/24.0.0/Tutorial-The-Druid-Cluster.html b/docs/24.0.0/Tutorial-The-Druid-Cluster.html
new file mode 100644
index 00000000..94e7c062
--- /dev/null
+++ b/docs/24.0.0/Tutorial-The-Druid-Cluster.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/index.html">
+<meta http-equiv="refresh" content="0; url=tutorials/index.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/index.html">Click here if you are not redirected.</a>
+<script>location="tutorials/index.html"</script>
diff --git a/docs/24.0.0/Tutorial:-A-First-Look-at-Druid.html b/docs/24.0.0/Tutorial:-A-First-Look-at-Druid.html
new file mode 100644
index 00000000..94e7c062
--- /dev/null
+++ b/docs/24.0.0/Tutorial:-A-First-Look-at-Druid.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/index.html">
+<meta http-equiv="refresh" content="0; url=tutorials/index.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/index.html">Click here if you are not redirected.</a>
+<script>location="tutorials/index.html"</script>
diff --git a/docs/24.0.0/Tutorial:-All-About-Queries.html b/docs/24.0.0/Tutorial:-All-About-Queries.html
new file mode 100644
index 00000000..94e7c062
--- /dev/null
+++ b/docs/24.0.0/Tutorial:-All-About-Queries.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/index.html">
+<meta http-equiv="refresh" content="0; url=tutorials/index.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/index.html">Click here if you are not redirected.</a>
+<script>location="tutorials/index.html"</script>
diff --git a/docs/24.0.0/Tutorial:-Loading-Batch-Data.html b/docs/24.0.0/Tutorial:-Loading-Batch-Data.html
new file mode 100644
index 00000000..744d5b63
--- /dev/null
+++ b/docs/24.0.0/Tutorial:-Loading-Batch-Data.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/tutorial-batch.html">
+<meta http-equiv="refresh" content="0; url=tutorials/tutorial-batch.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/tutorial-batch.html">Click here if you are not redirected.</a>
+<script>location="tutorials/tutorial-batch.html"</script>
diff --git a/docs/24.0.0/Tutorial:-Loading-Streaming-Data.html b/docs/24.0.0/Tutorial:-Loading-Streaming-Data.html
new file mode 100644
index 00000000..487fb6d8
--- /dev/null
+++ b/docs/24.0.0/Tutorial:-Loading-Streaming-Data.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/tutorial-kafka.html">
+<meta http-equiv="refresh" content="0; url=tutorials/tutorial-kafka.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/tutorial-kafka.html">Click here if you are not redirected.</a>
+<script>location="tutorials/tutorial-kafka.html"</script>
diff --git a/docs/24.0.0/Tutorial:-Loading-Your-Data-Part-1.html b/docs/24.0.0/Tutorial:-Loading-Your-Data-Part-1.html
new file mode 100644
index 00000000..94e7c062
--- /dev/null
+++ b/docs/24.0.0/Tutorial:-Loading-Your-Data-Part-1.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/index.html">
+<meta http-equiv="refresh" content="0; url=tutorials/index.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/index.html">Click here if you are not redirected.</a>
+<script>location="tutorials/index.html"</script>
diff --git a/docs/24.0.0/Tutorial:-Loading-Your-Data-Part-2.html b/docs/24.0.0/Tutorial:-Loading-Your-Data-Part-2.html
new file mode 100644
index 00000000..94e7c062
--- /dev/null
+++ b/docs/24.0.0/Tutorial:-Loading-Your-Data-Part-2.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/index.html">
+<meta http-equiv="refresh" content="0; url=tutorials/index.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/index.html">Click here if you are not redirected.</a>
+<script>location="tutorials/index.html"</script>
diff --git a/docs/24.0.0/Tutorial:-The-Druid-Cluster.html b/docs/24.0.0/Tutorial:-The-Druid-Cluster.html
new file mode 100644
index 00000000..bd0e468e
--- /dev/null
+++ b/docs/24.0.0/Tutorial:-The-Druid-Cluster.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/cluster.html">
+<meta http-equiv="refresh" content="0; url=tutorials/cluster.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/cluster.html">Click here if you are not redirected.</a>
+<script>location="tutorials/cluster.html"</script>
diff --git a/docs/24.0.0/Tutorial:-Webstream.html b/docs/24.0.0/Tutorial:-Webstream.html
new file mode 100644
index 00000000..94e7c062
--- /dev/null
+++ b/docs/24.0.0/Tutorial:-Webstream.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/index.html">
+<meta http-equiv="refresh" content="0; url=tutorials/index.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/index.html">Click here if you are not redirected.</a>
+<script>location="tutorials/index.html"</script>
diff --git a/docs/24.0.0/Tutorials.html b/docs/24.0.0/Tutorials.html
new file mode 100644
index 00000000..94e7c062
--- /dev/null
+++ b/docs/24.0.0/Tutorials.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/index.html">
+<meta http-equiv="refresh" content="0; url=tutorials/index.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/index.html">Click here if you are not redirected.</a>
+<script>location="tutorials/index.html"</script>
diff --git a/docs/24.0.0/Twitter-Tutorial.html b/docs/24.0.0/Twitter-Tutorial.html
new file mode 100644
index 00000000..94e7c062
--- /dev/null
+++ b/docs/24.0.0/Twitter-Tutorial.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="tutorials/index.html">
+<meta http-equiv="refresh" content="0; url=tutorials/index.html">
+<h1>Redirecting...</h1>
+<a href="tutorials/index.html">Click here if you are not redirected.</a>
+<script>location="tutorials/index.html"</script>
diff --git a/docs/24.0.0/Versioning.html b/docs/24.0.0/Versioning.html
new file mode 100644
index 00000000..fe2eb7c1
--- /dev/null
+++ b/docs/24.0.0/Versioning.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="development/versioning.html">
+<meta http-equiv="refresh" content="0; url=development/versioning.html">
+<h1>Redirecting...</h1>
+<a href="development/versioning.html">Click here if you are not redirected.</a>
+<script>location="development/versioning.html"</script>
diff --git a/docs/24.0.0/ZooKeeper.html b/docs/24.0.0/ZooKeeper.html
new file mode 100644
index 00000000..52406acf
--- /dev/null
+++ b/docs/24.0.0/ZooKeeper.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="dependencies/zookeeper.html">
+<meta http-equiv="refresh" content="0; url=dependencies/zookeeper.html">
+<h1>Redirecting...</h1>
+<a href="dependencies/zookeeper.html">Click here if you are not redirected.</a>
+<script>location="dependencies/zookeeper.html"</script>
diff --git a/docs/24.0.0/alerts.html b/docs/24.0.0/alerts.html
new file mode 100644
index 00000000..6286bcd8
--- /dev/null
+++ b/docs/24.0.0/alerts.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="operations/alerts.html">
+<meta http-equiv="refresh" content="0; url=operations/alerts.html">
+<h1>Redirecting...</h1>
+<a href="operations/alerts.html">Click here if you are not redirected.</a>
+<script>location="operations/alerts.html"</script>
diff --git a/docs/24.0.0/assets/compaction-config.png b/docs/24.0.0/assets/compaction-config.png
new file mode 100644
index 00000000..9dbcfefa
Binary files /dev/null and b/docs/24.0.0/assets/compaction-config.png differ
diff --git a/docs/24.0.0/assets/datasources-action-button.png b/docs/24.0.0/assets/datasources-action-button.png
new file mode 100644
index 00000000..6a52b844
Binary files /dev/null and b/docs/24.0.0/assets/datasources-action-button.png differ
diff --git a/docs/24.0.0/assets/druid-architecture.png b/docs/24.0.0/assets/druid-architecture.png
new file mode 100644
index 00000000..954a87bc
Binary files /dev/null and b/docs/24.0.0/assets/druid-architecture.png differ
diff --git a/docs/24.0.0/assets/druid-column-types.png b/docs/24.0.0/assets/druid-column-types.png
new file mode 100644
index 00000000..9db56c06
Binary files /dev/null and b/docs/24.0.0/assets/druid-column-types.png differ
diff --git a/docs/24.0.0/assets/druid-dataflow-2x.png b/docs/24.0.0/assets/druid-dataflow-2x.png
new file mode 100644
index 00000000..ab1c583e
Binary files /dev/null and b/docs/24.0.0/assets/druid-dataflow-2x.png differ
diff --git a/docs/24.0.0/assets/druid-dataflow-3.png b/docs/24.0.0/assets/druid-dataflow-3.png
new file mode 100644
index 00000000..355215cb
Binary files /dev/null and b/docs/24.0.0/assets/druid-dataflow-3.png differ
diff --git a/docs/24.0.0/assets/druid-manage-1.png b/docs/24.0.0/assets/druid-manage-1.png
new file mode 100644
index 00000000..0d10c6e7
Binary files /dev/null and b/docs/24.0.0/assets/druid-manage-1.png differ
diff --git a/docs/24.0.0/assets/druid-timeline.png b/docs/24.0.0/assets/druid-timeline.png
new file mode 100644
index 00000000..40380e27
Binary files /dev/null and b/docs/24.0.0/assets/druid-timeline.png differ
diff --git a/docs/24.0.0/assets/indexing_service.png b/docs/24.0.0/assets/indexing_service.png
new file mode 100644
index 00000000..a4462a41
Binary files /dev/null and b/docs/24.0.0/assets/indexing_service.png differ
diff --git a/docs/24.0.0/assets/multi-stage-query/msq-ui-download-query-results.png b/docs/24.0.0/assets/multi-stage-query/msq-ui-download-query-results.png
new file mode 100644
index 00000000..e428cb2d
Binary files /dev/null and b/docs/24.0.0/assets/multi-stage-query/msq-ui-download-query-results.png differ
diff --git a/docs/24.0.0/assets/multi-stage-query/tutorial-msq-convert.png b/docs/24.0.0/assets/multi-stage-query/tutorial-msq-convert.png
new file mode 100644
index 00000000..f16941af
Binary files /dev/null and b/docs/24.0.0/assets/multi-stage-query/tutorial-msq-convert.png differ
diff --git a/docs/24.0.0/assets/multi-stage-query/ui-annotated.png b/docs/24.0.0/assets/multi-stage-query/ui-annotated.png
new file mode 100644
index 00000000..5a98c00d
Binary files /dev/null and b/docs/24.0.0/assets/multi-stage-query/ui-annotated.png differ
diff --git a/docs/24.0.0/assets/multi-stage-query/ui-empty.png b/docs/24.0.0/assets/multi-stage-query/ui-empty.png
new file mode 100644
index 00000000..7c30d5a6
Binary files /dev/null and b/docs/24.0.0/assets/multi-stage-query/ui-empty.png differ
diff --git a/docs/24.0.0/assets/native-queries-01.png b/docs/24.0.0/assets/native-queries-01.png
new file mode 100644
index 00000000..27fd29b6
Binary files /dev/null and b/docs/24.0.0/assets/native-queries-01.png differ
diff --git a/docs/24.0.0/assets/nested-combined-json.png b/docs/24.0.0/assets/nested-combined-json.png
new file mode 100644
index 00000000..f98bfcf5
Binary files /dev/null and b/docs/24.0.0/assets/nested-combined-json.png differ
diff --git a/docs/24.0.0/assets/nested-display-data-types.png b/docs/24.0.0/assets/nested-display-data-types.png
new file mode 100644
index 00000000..2776068e
Binary files /dev/null and b/docs/24.0.0/assets/nested-display-data-types.png differ
diff --git a/docs/24.0.0/assets/nested-examine-schema.png b/docs/24.0.0/assets/nested-examine-schema.png
new file mode 100644
index 00000000..11769a16
Binary files /dev/null and b/docs/24.0.0/assets/nested-examine-schema.png differ
diff --git a/docs/24.0.0/assets/nested-extract-as-type.png b/docs/24.0.0/assets/nested-extract-as-type.png
new file mode 100644
index 00000000..c54a5eeb
Binary files /dev/null and b/docs/24.0.0/assets/nested-extract-as-type.png differ
diff --git a/docs/24.0.0/assets/nested-extract-elements.png b/docs/24.0.0/assets/nested-extract-elements.png
new file mode 100644
index 00000000..9f7076b5
Binary files /dev/null and b/docs/24.0.0/assets/nested-extract-elements.png differ
diff --git a/docs/24.0.0/assets/nested-group-aggregate.png b/docs/24.0.0/assets/nested-group-aggregate.png
new file mode 100644
index 00000000..2d1907fe
Binary files /dev/null and b/docs/24.0.0/assets/nested-group-aggregate.png differ
diff --git a/docs/24.0.0/assets/nested-msq-ingestion-transform.png b/docs/24.0.0/assets/nested-msq-ingestion-transform.png
new file mode 100644
index 00000000..b46fde85
Binary files /dev/null and b/docs/24.0.0/assets/nested-msq-ingestion-transform.png differ
diff --git a/docs/24.0.0/assets/nested-msq-ingestion.png b/docs/24.0.0/assets/nested-msq-ingestion.png
new file mode 100644
index 00000000..0487ee18
Binary files /dev/null and b/docs/24.0.0/assets/nested-msq-ingestion.png differ
diff --git a/docs/24.0.0/assets/nested-parse-deserialize.png b/docs/24.0.0/assets/nested-parse-deserialize.png
new file mode 100644
index 00000000..881a6716
Binary files /dev/null and b/docs/24.0.0/assets/nested-parse-deserialize.png differ
diff --git a/docs/24.0.0/assets/nested-retrieve-json.png b/docs/24.0.0/assets/nested-retrieve-json.png
new file mode 100644
index 00000000..4f5fa0f9
Binary files /dev/null and b/docs/24.0.0/assets/nested-retrieve-json.png differ
diff --git a/docs/24.0.0/assets/nested-return-json.png b/docs/24.0.0/assets/nested-return-json.png
new file mode 100644
index 00000000..9a67aaa7
Binary files /dev/null and b/docs/24.0.0/assets/nested-return-json.png differ
diff --git a/docs/24.0.0/assets/security-model-1.png b/docs/24.0.0/assets/security-model-1.png
new file mode 100644
index 00000000..55c7f24c
Binary files /dev/null and b/docs/24.0.0/assets/security-model-1.png differ
diff --git a/docs/24.0.0/assets/security-model-2.png b/docs/24.0.0/assets/security-model-2.png
new file mode 100644
index 00000000..dcb256ba
Binary files /dev/null and b/docs/24.0.0/assets/security-model-2.png differ
diff --git a/docs/24.0.0/assets/segmentPropagation.png b/docs/24.0.0/assets/segmentPropagation.png
new file mode 100644
index 00000000..e1ec8202
Binary files /dev/null and b/docs/24.0.0/assets/segmentPropagation.png differ
diff --git a/docs/24.0.0/assets/services-overview.png b/docs/24.0.0/assets/services-overview.png
new file mode 100644
index 00000000..157ce608
Binary files /dev/null and b/docs/24.0.0/assets/services-overview.png differ
diff --git a/docs/24.0.0/assets/tutorial-batch-data-loader-00.png b/docs/24.0.0/assets/tutorial-batch-data-loader-00.png
new file mode 100644
index 00000000..793b6c12
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-batch-data-loader-00.png differ
diff --git a/docs/24.0.0/assets/tutorial-batch-data-loader-01.png b/docs/24.0.0/assets/tutorial-batch-data-loader-01.png
new file mode 100644
index 00000000..2ff1d639
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-batch-data-loader-01.png differ
diff --git a/docs/24.0.0/assets/tutorial-batch-data-loader-015.png b/docs/24.0.0/assets/tutorial-batch-data-loader-015.png
new file mode 100644
index 00000000..fd588cae
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-batch-data-loader-015.png differ
diff --git a/docs/24.0.0/assets/tutorial-batch-data-loader-02.png b/docs/24.0.0/assets/tutorial-batch-data-loader-02.png
new file mode 100644
index 00000000..736188cb
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-batch-data-loader-02.png differ
diff --git a/docs/24.0.0/assets/tutorial-batch-data-loader-03.png b/docs/24.0.0/assets/tutorial-batch-data-loader-03.png
new file mode 100644
index 00000000..74bb8c88
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-batch-data-loader-03.png differ
diff --git a/docs/24.0.0/assets/tutorial-batch-data-loader-04.png b/docs/24.0.0/assets/tutorial-batch-data-loader-04.png
new file mode 100644
index 00000000..e4237cda
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-batch-data-loader-04.png differ
diff --git a/docs/24.0.0/assets/tutorial-batch-data-loader-05.png b/docs/24.0.0/assets/tutorial-batch-data-loader-05.png
new file mode 100644
index 00000000..d245dde6
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-batch-data-loader-05.png differ
diff --git a/docs/24.0.0/assets/tutorial-batch-data-loader-06.png b/docs/24.0.0/assets/tutorial-batch-data-loader-06.png
new file mode 100644
index 00000000..285fd57b
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-batch-data-loader-06.png differ
diff --git a/docs/24.0.0/assets/tutorial-batch-data-loader-07.png b/docs/24.0.0/assets/tutorial-batch-data-loader-07.png
new file mode 100644
index 00000000..481838d7
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-batch-data-loader-07.png differ
diff --git a/docs/24.0.0/assets/tutorial-batch-data-loader-08.png b/docs/24.0.0/assets/tutorial-batch-data-loader-08.png
new file mode 100644
index 00000000..b64c5a4e
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-batch-data-loader-08.png differ
diff --git a/docs/24.0.0/assets/tutorial-batch-data-loader-09.png b/docs/24.0.0/assets/tutorial-batch-data-loader-09.png
new file mode 100644
index 00000000..bec3085f
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-batch-data-loader-09.png differ
diff --git a/docs/24.0.0/assets/tutorial-batch-data-loader-10.png b/docs/24.0.0/assets/tutorial-batch-data-loader-10.png
new file mode 100644
index 00000000..857a5a5c
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-batch-data-loader-10.png differ
diff --git a/docs/24.0.0/assets/tutorial-batch-data-loader-11.png b/docs/24.0.0/assets/tutorial-batch-data-loader-11.png
new file mode 100644
index 00000000..bf7e304b
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-batch-data-loader-11.png differ
diff --git a/docs/24.0.0/assets/tutorial-batch-data-loader-12.png b/docs/24.0.0/assets/tutorial-batch-data-loader-12.png
new file mode 100644
index 00000000..f195b9ca
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-batch-data-loader-12.png differ
diff --git a/docs/24.0.0/assets/tutorial-batch-submit-task-01.png b/docs/24.0.0/assets/tutorial-batch-submit-task-01.png
new file mode 100644
index 00000000..01b91427
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-batch-submit-task-01.png differ
diff --git a/docs/24.0.0/assets/tutorial-batch-submit-task-02.png b/docs/24.0.0/assets/tutorial-batch-submit-task-02.png
new file mode 100644
index 00000000..ba7caeb2
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-batch-submit-task-02.png differ
diff --git a/docs/24.0.0/assets/tutorial-compaction-01.png b/docs/24.0.0/assets/tutorial-compaction-01.png
new file mode 100644
index 00000000..aeb9bf36
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-compaction-01.png differ
diff --git a/docs/24.0.0/assets/tutorial-compaction-02.png b/docs/24.0.0/assets/tutorial-compaction-02.png
new file mode 100644
index 00000000..836d8a7a
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-compaction-02.png differ
diff --git a/docs/24.0.0/assets/tutorial-compaction-03.png b/docs/24.0.0/assets/tutorial-compaction-03.png
new file mode 100644
index 00000000..d51f8f8a
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-compaction-03.png differ
diff --git a/docs/24.0.0/assets/tutorial-compaction-04.png b/docs/24.0.0/assets/tutorial-compaction-04.png
new file mode 100644
index 00000000..46c5b1d2
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-compaction-04.png differ
diff --git a/docs/24.0.0/assets/tutorial-compaction-05.png b/docs/24.0.0/assets/tutorial-compaction-05.png
new file mode 100644
index 00000000..e692694a
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-compaction-05.png differ
diff --git a/docs/24.0.0/assets/tutorial-compaction-06.png b/docs/24.0.0/assets/tutorial-compaction-06.png
new file mode 100644
index 00000000..55c999f9
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-compaction-06.png differ
diff --git a/docs/24.0.0/assets/tutorial-compaction-07.png b/docs/24.0.0/assets/tutorial-compaction-07.png
new file mode 100644
index 00000000..661e8978
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-compaction-07.png differ
diff --git a/docs/24.0.0/assets/tutorial-compaction-08.png b/docs/24.0.0/assets/tutorial-compaction-08.png
new file mode 100644
index 00000000..6e3f1aa0
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-compaction-08.png differ
diff --git a/docs/24.0.0/assets/tutorial-deletion-01.png b/docs/24.0.0/assets/tutorial-deletion-01.png
new file mode 100644
index 00000000..de68d381
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-deletion-01.png differ
diff --git a/docs/24.0.0/assets/tutorial-deletion-02.png b/docs/24.0.0/assets/tutorial-deletion-02.png
new file mode 100644
index 00000000..ffe45852
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-deletion-02.png differ
diff --git a/docs/24.0.0/assets/tutorial-deletion-03.png b/docs/24.0.0/assets/tutorial-deletion-03.png
new file mode 100644
index 00000000..221774f1
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-deletion-03.png differ
diff --git a/docs/24.0.0/assets/tutorial-kafka-data-loader-01.png b/docs/24.0.0/assets/tutorial-kafka-data-loader-01.png
new file mode 100644
index 00000000..12e28207
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-kafka-data-loader-01.png differ
diff --git a/docs/24.0.0/assets/tutorial-kafka-data-loader-02.png b/docs/24.0.0/assets/tutorial-kafka-data-loader-02.png
new file mode 100644
index 00000000..fb67d06d
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-kafka-data-loader-02.png differ
diff --git a/docs/24.0.0/assets/tutorial-kafka-data-loader-03.png b/docs/24.0.0/assets/tutorial-kafka-data-loader-03.png
new file mode 100644
index 00000000..022cd751
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-kafka-data-loader-03.png differ
diff --git a/docs/24.0.0/assets/tutorial-kafka-data-loader-04.png b/docs/24.0.0/assets/tutorial-kafka-data-loader-04.png
new file mode 100644
index 00000000..c6c6da25
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-kafka-data-loader-04.png differ
diff --git a/docs/24.0.0/assets/tutorial-kafka-data-loader-05.png b/docs/24.0.0/assets/tutorial-kafka-data-loader-05.png
new file mode 100644
index 00000000..4b6ba4dd
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-kafka-data-loader-05.png differ
diff --git a/docs/24.0.0/assets/tutorial-kafka-data-loader-06.png b/docs/24.0.0/assets/tutorial-kafka-data-loader-06.png
new file mode 100644
index 00000000..bcd9567f
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-kafka-data-loader-06.png differ
diff --git a/docs/24.0.0/assets/tutorial-kafka-data-loader-07.png b/docs/24.0.0/assets/tutorial-kafka-data-loader-07.png
new file mode 100644
index 00000000..b2b9c25a
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-kafka-data-loader-07.png differ
diff --git a/docs/24.0.0/assets/tutorial-kafka-data-loader-08.png b/docs/24.0.0/assets/tutorial-kafka-data-loader-08.png
new file mode 100644
index 00000000..1b202b4d
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-kafka-data-loader-08.png differ
diff --git a/docs/24.0.0/assets/tutorial-kafka-data-loader-09.png b/docs/24.0.0/assets/tutorial-kafka-data-loader-09.png
new file mode 100644
index 00000000..1775ecd1
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-kafka-data-loader-09.png differ
diff --git a/docs/24.0.0/assets/tutorial-kafka-data-loader-10.png b/docs/24.0.0/assets/tutorial-kafka-data-loader-10.png
new file mode 100644
index 00000000..cb9c44c6
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-kafka-data-loader-10.png differ
diff --git a/docs/24.0.0/assets/tutorial-kafka-data-loader-11.png b/docs/24.0.0/assets/tutorial-kafka-data-loader-11.png
new file mode 100644
index 00000000..9b6aa24c
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-kafka-data-loader-11.png differ
diff --git a/docs/24.0.0/assets/tutorial-kafka-data-loader-12.png b/docs/24.0.0/assets/tutorial-kafka-data-loader-12.png
new file mode 100644
index 00000000..c62276da
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-kafka-data-loader-12.png differ
diff --git a/docs/24.0.0/assets/tutorial-kafka-submit-supervisor-01.png b/docs/24.0.0/assets/tutorial-kafka-submit-supervisor-01.png
new file mode 100644
index 00000000..debf3e2d
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-kafka-submit-supervisor-01.png differ
diff --git a/docs/24.0.0/assets/tutorial-query-01.png b/docs/24.0.0/assets/tutorial-query-01.png
new file mode 100644
index 00000000..371d35de
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-query-01.png differ
diff --git a/docs/24.0.0/assets/tutorial-query-02.png b/docs/24.0.0/assets/tutorial-query-02.png
new file mode 100644
index 00000000..f459bd69
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-query-02.png differ
diff --git a/docs/24.0.0/assets/tutorial-query-03.png b/docs/24.0.0/assets/tutorial-query-03.png
new file mode 100644
index 00000000..29443edb
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-query-03.png differ
diff --git a/docs/24.0.0/assets/tutorial-query-035.png b/docs/24.0.0/assets/tutorial-query-035.png
new file mode 100644
index 00000000..f22db18f
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-query-035.png differ
diff --git a/docs/24.0.0/assets/tutorial-query-04.png b/docs/24.0.0/assets/tutorial-query-04.png
new file mode 100644
index 00000000..9cfef34c
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-query-04.png differ
diff --git a/docs/24.0.0/assets/tutorial-query-05.png b/docs/24.0.0/assets/tutorial-query-05.png
new file mode 100644
index 00000000..2fc59ceb
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-query-05.png differ
diff --git a/docs/24.0.0/assets/tutorial-query-06.png b/docs/24.0.0/assets/tutorial-query-06.png
new file mode 100644
index 00000000..70560560
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-query-06.png differ
diff --git a/docs/24.0.0/assets/tutorial-query-07.png b/docs/24.0.0/assets/tutorial-query-07.png
new file mode 100644
index 00000000..5997ba2f
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-query-07.png differ
diff --git a/docs/24.0.0/assets/tutorial-query-08.png b/docs/24.0.0/assets/tutorial-query-08.png
new file mode 100644
index 00000000..32aa5d48
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-query-08.png differ
diff --git a/docs/24.0.0/assets/tutorial-quickstart-01.png b/docs/24.0.0/assets/tutorial-quickstart-01.png
new file mode 100644
index 00000000..45760eaf
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-quickstart-01.png differ
diff --git a/docs/24.0.0/assets/tutorial-quickstart-02.png b/docs/24.0.0/assets/tutorial-quickstart-02.png
new file mode 100644
index 00000000..5edec67c
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-quickstart-02.png differ
diff --git a/docs/24.0.0/assets/tutorial-quickstart-03.png b/docs/24.0.0/assets/tutorial-quickstart-03.png
new file mode 100644
index 00000000..cff8fecf
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-quickstart-03.png differ
diff --git a/docs/24.0.0/assets/tutorial-quickstart-04.png b/docs/24.0.0/assets/tutorial-quickstart-04.png
new file mode 100644
index 00000000..431d8b97
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-quickstart-04.png differ
diff --git a/docs/24.0.0/assets/tutorial-quickstart-05.png b/docs/24.0.0/assets/tutorial-quickstart-05.png
new file mode 100644
index 00000000..6178289f
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-quickstart-05.png differ
diff --git a/docs/24.0.0/assets/tutorial-retention-00.png b/docs/24.0.0/assets/tutorial-retention-00.png
new file mode 100644
index 00000000..a3f84a9f
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-retention-00.png differ
diff --git a/docs/24.0.0/assets/tutorial-retention-01.png b/docs/24.0.0/assets/tutorial-retention-01.png
new file mode 100644
index 00000000..35a97c26
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-retention-01.png differ
diff --git a/docs/24.0.0/assets/tutorial-retention-02.png b/docs/24.0.0/assets/tutorial-retention-02.png
new file mode 100644
index 00000000..f38fad0d
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-retention-02.png differ
diff --git a/docs/24.0.0/assets/tutorial-retention-03.png b/docs/24.0.0/assets/tutorial-retention-03.png
new file mode 100644
index 00000000..256836a2
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-retention-03.png differ
diff --git a/docs/24.0.0/assets/tutorial-retention-04.png b/docs/24.0.0/assets/tutorial-retention-04.png
new file mode 100644
index 00000000..d39495f8
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-retention-04.png differ
diff --git a/docs/24.0.0/assets/tutorial-retention-05.png b/docs/24.0.0/assets/tutorial-retention-05.png
new file mode 100644
index 00000000..638a752f
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-retention-05.png differ
diff --git a/docs/24.0.0/assets/tutorial-retention-06.png b/docs/24.0.0/assets/tutorial-retention-06.png
new file mode 100644
index 00000000..f47cbffb
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-retention-06.png differ
diff --git a/docs/24.0.0/assets/tutorial-theta-01.png b/docs/24.0.0/assets/tutorial-theta-01.png
new file mode 100644
index 00000000..2411fbf1
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-theta-01.png differ
diff --git a/docs/24.0.0/assets/tutorial-theta-02.png b/docs/24.0.0/assets/tutorial-theta-02.png
new file mode 100644
index 00000000..ce849fd3
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-theta-02.png differ
diff --git a/docs/24.0.0/assets/tutorial-theta-03.png b/docs/24.0.0/assets/tutorial-theta-03.png
new file mode 100644
index 00000000..ec07597a
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-theta-03.png differ
diff --git a/docs/24.0.0/assets/tutorial-theta-04.png b/docs/24.0.0/assets/tutorial-theta-04.png
new file mode 100644
index 00000000..5a382ca7
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-theta-04.png differ
diff --git a/docs/24.0.0/assets/tutorial-theta-05.png b/docs/24.0.0/assets/tutorial-theta-05.png
new file mode 100644
index 00000000..1a171be2
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-theta-05.png differ
diff --git a/docs/24.0.0/assets/tutorial-theta-06.png b/docs/24.0.0/assets/tutorial-theta-06.png
new file mode 100644
index 00000000..e32af33d
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-theta-06.png differ
diff --git a/docs/24.0.0/assets/tutorial-theta-07.png b/docs/24.0.0/assets/tutorial-theta-07.png
new file mode 100644
index 00000000..37dab135
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-theta-07.png differ
diff --git a/docs/24.0.0/assets/tutorial-theta-08.png b/docs/24.0.0/assets/tutorial-theta-08.png
new file mode 100644
index 00000000..c4452d55
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-theta-08.png differ
diff --git a/docs/24.0.0/assets/tutorial-theta-09.png b/docs/24.0.0/assets/tutorial-theta-09.png
new file mode 100644
index 00000000..6e0e5140
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-theta-09.png differ
diff --git a/docs/24.0.0/assets/tutorial-theta-10.png b/docs/24.0.0/assets/tutorial-theta-10.png
new file mode 100644
index 00000000..0ad9963e
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-theta-10.png differ
diff --git a/docs/24.0.0/assets/tutorial-theta-11.png b/docs/24.0.0/assets/tutorial-theta-11.png
new file mode 100644
index 00000000..53dcaa81
Binary files /dev/null and b/docs/24.0.0/assets/tutorial-theta-11.png differ
diff --git a/docs/24.0.0/assets/web-console-01-home-view.png b/docs/24.0.0/assets/web-console-01-home-view.png
new file mode 100644
index 00000000..958767b6
Binary files /dev/null and b/docs/24.0.0/assets/web-console-01-home-view.png differ
diff --git a/docs/24.0.0/assets/web-console-02-data-loader-1.png b/docs/24.0.0/assets/web-console-02-data-loader-1.png
new file mode 100644
index 00000000..6b6f7baa
Binary files /dev/null and b/docs/24.0.0/assets/web-console-02-data-loader-1.png differ
diff --git a/docs/24.0.0/assets/web-console-03-data-loader-2.png b/docs/24.0.0/assets/web-console-03-data-loader-2.png
new file mode 100644
index 00000000..059b18ed
Binary files /dev/null and b/docs/24.0.0/assets/web-console-03-data-loader-2.png differ
diff --git a/docs/24.0.0/assets/web-console-04-datasources.png b/docs/24.0.0/assets/web-console-04-datasources.png
new file mode 100644
index 00000000..d4c466e8
Binary files /dev/null and b/docs/24.0.0/assets/web-console-04-datasources.png differ
diff --git a/docs/24.0.0/assets/web-console-05-retention.png b/docs/24.0.0/assets/web-console-05-retention.png
new file mode 100644
index 00000000..32166b7d
Binary files /dev/null and b/docs/24.0.0/assets/web-console-05-retention.png differ
diff --git a/docs/24.0.0/assets/web-console-06-segments.png b/docs/24.0.0/assets/web-console-06-segments.png
new file mode 100644
index 00000000..4f9cefa7
Binary files /dev/null and b/docs/24.0.0/assets/web-console-06-segments.png differ
diff --git a/docs/24.0.0/assets/web-console-07-supervisors.png b/docs/24.0.0/assets/web-console-07-supervisors.png
new file mode 100644
index 00000000..fa7202c8
Binary files /dev/null and b/docs/24.0.0/assets/web-console-07-supervisors.png differ
diff --git a/docs/24.0.0/assets/web-console-08-supervisor-status.png b/docs/24.0.0/assets/web-console-08-supervisor-status.png
new file mode 100644
index 00000000..22a515db
Binary files /dev/null and b/docs/24.0.0/assets/web-console-08-supervisor-status.png differ
diff --git a/docs/24.0.0/assets/web-console-09-task-status.png b/docs/24.0.0/assets/web-console-09-task-status.png
new file mode 100644
index 00000000..347ec03b
Binary files /dev/null and b/docs/24.0.0/assets/web-console-09-task-status.png differ
diff --git a/docs/24.0.0/assets/web-console-10-servers.png b/docs/24.0.0/assets/web-console-10-servers.png
new file mode 100644
index 00000000..37740b17
Binary files /dev/null and b/docs/24.0.0/assets/web-console-10-servers.png differ
diff --git a/docs/24.0.0/assets/web-console-11-query-sql.png b/docs/24.0.0/assets/web-console-11-query-sql.png
new file mode 100644
index 00000000..a144774f
Binary files /dev/null and b/docs/24.0.0/assets/web-console-11-query-sql.png differ
diff --git a/docs/24.0.0/assets/web-console-12-query-rune.png b/docs/24.0.0/assets/web-console-12-query-rune.png
new file mode 100644
index 00000000..8c5e2705
Binary files /dev/null and b/docs/24.0.0/assets/web-console-12-query-rune.png differ
diff --git a/docs/24.0.0/assets/web-console-13-lookups.png b/docs/24.0.0/assets/web-console-13-lookups.png
new file mode 100644
index 00000000..f34f8672
Binary files /dev/null and b/docs/24.0.0/assets/web-console-13-lookups.png differ
diff --git a/docs/24.0.0/comparisons/druid-vs-cassandra.html b/docs/24.0.0/comparisons/druid-vs-cassandra.html
new file mode 100644
index 00000000..235af8f8
--- /dev/null
+++ b/docs/24.0.0/comparisons/druid-vs-cassandra.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="druid-vs-key-value.html">
+<meta http-equiv="refresh" content="0; url=druid-vs-key-value.html">
+<h1>Redirecting...</h1>
+<a href="druid-vs-key-value.html">Click here if you are not redirected.</a>
+<script>location="druid-vs-key-value.html"</script>
diff --git a/docs/24.0.0/comparisons/druid-vs-elasticsearch.html b/docs/24.0.0/comparisons/druid-vs-elasticsearch.html
new file mode 100644
index 00000000..2ca2220f
--- /dev/null
+++ b/docs/24.0.0/comparisons/druid-vs-elasticsearch.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Apache Druid vs Elasticsearch · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/comparisons/druid-vs-elasticsearch.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:ver [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/comparisons/druid-vs-elasticsearch.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Apache Druid vs Elasticsearch</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>We are not experts on search systems, if anything is incorrect about our portrayal, please let us know on the mailing list or via some other means.</p>
+<p>Elasticsearch is a search system based on Apache Lucene. It provides full text search for schema-free documents
+and provides access to raw event level data. Elasticsearch is increasingly adding more support for analytics and aggregations.
+<a href="https://groups.google.com/forum/#!msg/druid-development/nlpwTHNclj8/sOuWlKOzPpYJ">Some members of the community</a> have pointed out
+the resource requirements for data ingestion and aggregation in Elasticsearch is much higher than those of Druid.</p>
+<p>Elasticsearch also does not support data summarization/roll-up at ingestion time, which can compact the data that needs to be
+stored up to 100x with real-world data sets. This leads to Elasticsearch having greater storage requirements.</p>
+<p>Druid focuses on OLAP work flows. Druid is optimized for high performance (fast aggregation and ingestion) at low cost,
+and supports a wide range of analytic operations. Druid has some basic search support for structured event data, but does not support
+full text search. Druid also does not support completely unstructured data. Measures must be defined in a Druid schema such that
+summarization/roll-up can be done.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/misc/papers-and-talks.html"><span class="arrow-prev">← </span><span>Papers</span></a><a class="docs-next button" href="/docs/24.0.0/comparisons/druid-vs-key-value.html"><span class="function-name-prevnext">Apache Druid vs. Key/Value Stores (HBase/Cassandra/OpenTSDB)</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/comparisons/druid-vs-hadoop.html b/docs/24.0.0/comparisons/druid-vs-hadoop.html
new file mode 100644
index 00000000..cab995ed
--- /dev/null
+++ b/docs/24.0.0/comparisons/druid-vs-hadoop.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="druid-vs-sql-on-hadoop.html">
+<meta http-equiv="refresh" content="0; url=druid-vs-sql-on-hadoop.html">
+<h1>Redirecting...</h1>
+<a href="druid-vs-sql-on-hadoop.html">Click here if you are not redirected.</a>
+<script>location="druid-vs-sql-on-hadoop.html"</script>
diff --git a/docs/24.0.0/comparisons/druid-vs-impala-or-shark.html b/docs/24.0.0/comparisons/druid-vs-impala-or-shark.html
new file mode 100644
index 00000000..cab995ed
--- /dev/null
+++ b/docs/24.0.0/comparisons/druid-vs-impala-or-shark.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="druid-vs-sql-on-hadoop.html">
+<meta http-equiv="refresh" content="0; url=druid-vs-sql-on-hadoop.html">
+<h1>Redirecting...</h1>
+<a href="druid-vs-sql-on-hadoop.html">Click here if you are not redirected.</a>
+<script>location="druid-vs-sql-on-hadoop.html"</script>
diff --git a/docs/24.0.0/comparisons/druid-vs-key-value.html b/docs/24.0.0/comparisons/druid-vs-key-value.html
new file mode 100644
index 00000000..cba34f68
--- /dev/null
+++ b/docs/24.0.0/comparisons/druid-vs-key-value.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Apache Druid vs. Key/Value Stores (HBase/Cassandra/OpenTSDB) · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/comparisons/druid-vs-key-value.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en" [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/comparisons/druid-vs-key-value.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Apache Druid vs. Key/Value Stores (HBase/Cassandra/OpenTSDB)</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>Druid is highly optimized for scans and aggregations, it supports arbitrarily deep drill downs into data sets. This same functionality
+is supported in key/value stores in 2 ways:</p>
+<ol>
+<li>Pre-compute all permutations of possible user queries</li>
+<li>Range scans on event data</li>
+</ol>
+<p>When pre-computing results, the key is the exact parameters of the query, and the value is the result of the query.
+The queries return extremely quickly, but at the cost of flexibility, as ad-hoc exploratory queries are not possible with
+pre-computing every possible query permutation. Pre-computing all permutations of all ad-hoc queries leads to result sets
+that grow exponentially with the number of columns of a data set, and pre-computing queries for complex real-world data sets
+can require hours of pre-processing time.</p>
+<p>The other approach to using key/value stores for aggregations to use the dimensions of an event as the key and the event measures as the value.
+Aggregations are done by issuing range scans on this data. Timeseries specific databases such as OpenTSDB use this approach.
+One of the limitations here is that the key/value storage model does not have indexes for any kind of filtering other than prefix ranges,
+which can be used to filter a query down to a metric and time range, but cannot resolve complex predicates to narrow the exact data to scan.
+When the number of rows to scan gets large, this limitation can greatly reduce performance. It is also harder to achieve good
+locality with key/value stores because most don’t support pushing down aggregates to the storage layer.</p>
+<p>For arbitrary exploration of data (flexible data filtering), Druid's custom column format enables ad-hoc queries without pre-computation. The format
+also enables fast scans on columns, which is important for good aggregation performance.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/comparisons/druid-vs-elasticsearch.html"><span class="arrow-prev">← </span><span>Apache Druid vs Elasticsearch</span></a><a class="docs-next button" href="/docs/24.0.0/comparisons/druid-vs-kudu.html"><span>Apache Druid vs Kudu</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer druid-footer" id="footer"><div class="c [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/comparisons/druid-vs-kudu.html b/docs/24.0.0/comparisons/druid-vs-kudu.html
new file mode 100644
index 00000000..5f5d1d62
--- /dev/null
+++ b/docs/24.0.0/comparisons/druid-vs-kudu.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Apache Druid vs Kudu · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/comparisons/druid-vs-kudu.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24. [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/comparisons/druid-vs-kudu.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Apache Druid vs Kudu</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>Kudu's storage format enables single row updates, whereas updates to existing Druid segments requires recreating the segment, so theoretically
+the process for updating old values should be higher latency in Druid. However, the requirements in Kudu for maintaining extra head space to store
+updates as well as organizing data by id instead of time has the potential to introduce some extra latency and accessing
+of data that is not needed to answer a query at query time.</p>
+<p>Druid summarizes/rollups up data at ingestion time, which in practice reduces the raw data that needs to be
+stored significantly (up to 40 times on average), and increases performance of scanning raw data significantly.
+Druid segments also contain bitmap indexes for fast filtering, which Kudu does not currently support.
+Druid's segment architecture is heavily geared towards fast aggregates and filters, and for OLAP workflows. Appends are very
+fast in Druid, whereas updates of older data are higher latency. This is by design as the data Druid is good for is typically event data,
+and does not need to be updated too frequently. Kudu supports arbitrary primary keys with uniqueness constraints, and
+efficient lookup by ranges of those keys. Kudu chooses not to include the execution engine, but supports sufficient
+operations so as to allow node-local processing from the execution engines. This means that Kudu can support multiple frameworks on the same data (e.g., MR, Spark, and SQL).
+Druid includes its own query layer that allows it to push down aggregations and computations directly to data processes for faster query processing.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/comparisons/druid-vs-key-value.html"><span class="arrow-prev">← </span><span class="function-name-prevnext">Apache Druid vs. Key/Value Stores (HBase/Cassandra/OpenTSDB)</span></a><a class="docs-next button" href="/docs/24.0.0/comparisons/druid-vs-redshift.html"><span>Apache Druid vs Redshift</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/comparisons/druid-vs-redshift.html b/docs/24.0.0/comparisons/druid-vs-redshift.html
new file mode 100644
index 00000000..5947bd9a
--- /dev/null
+++ b/docs/24.0.0/comparisons/druid-vs-redshift.html
@@ -0,0 +1,121 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Apache Druid vs Redshift · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/comparisons/druid-vs-redshift.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" cont [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/comparisons/druid-vs-redshift.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Apache Druid vs Redshift</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<h3><a class="anchor" aria-hidden="true" id="how-does-druid-compare-to-redshift"></a><a href="#how-does-druid-compare-to-redshift" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
+<p>In terms of drawing a differentiation, Redshift started out as ParAccel (Actian), which Amazon is licensing and has since heavily modified.</p>
+<p>Aside from potential performance differences, there are some functional differences:</p>
+<h3><a class="anchor" aria-hidden="true" id="real-time-data-ingestion"></a><a href="#real-time-data-ingestion" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
+<p>Because Druid is optimized to provide insight against massive quantities of streaming data; it is able to load and aggregate data in real-time.</p>
+<p>Generally traditional data warehouses including column stores work only with batch ingestion and are not optimal for streaming data in regularly.</p>
+<h3><a class="anchor" aria-hidden="true" id="druid-is-a-read-oriented-analytical-data-store"></a><a href="#druid-is-a-read-oriented-analytical-data-store" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3 [...]
+<p>Druid’s write semantics are not as fluid and does not support full joins (we support large table to small table joins). Redshift provides full SQL support including joins and insert/update statements.</p>
+<h3><a class="anchor" aria-hidden="true" id="data-distribution-model"></a><a href="#data-distribution-model" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
+<p>Druid’s data distribution is segment-based and leverages a highly available &quot;deep&quot; storage such as S3 or HDFS. Scaling up (or down) does not require massive copy actions or downtime; in fact, losing any number of Historical processes does not result in data loss because new Historical processes can always be brought up by reading data from &quot;deep&quot; storage.</p>
+<p>To contrast, ParAccel’s data distribution model is hash-based. Expanding the cluster requires re-hashing the data across the nodes, making it difficult to perform without taking downtime. Amazon’s Redshift works around this issue with a multi-step process:</p>
+<ul>
+<li>set cluster into read-only mode</li>
+<li>copy data from cluster to new cluster that exists in parallel</li>
+<li>redirect traffic to new cluster</li>
+</ul>
+<h3><a class="anchor" aria-hidden="true" id="replication-strategy"></a><a href="#replication-strategy" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<p>Druid employs segment-level data distribution meaning that more processes can be added and rebalanced without having to perform a staged swap. The replication strategy also makes all replicas available for querying. Replication is done automatically and without any impact to performance.</p>
+<p>ParAccel’s hash-based distribution generally means that replication is conducted via hot spares. This puts a numerical limit on the number of nodes you can lose without losing data, and this replication strategy often does not allow the hot spare to help share query load.</p>
+<h3><a class="anchor" aria-hidden="true" id="indexing-strategy"></a><a href="#indexing-strategy" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
+<p>Along with column oriented structures, Druid uses indexing structures to speed up query execution when a filter is provided. Indexing structures do increase storage overhead (and make it more difficult to allow for mutation), but they also significantly speed up queries.</p>
+<p>ParAccel does not appear to employ indexing strategies.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/comparisons/druid-vs-kudu.html"><span class="arrow-prev">← </span><span>Apache Druid vs Kudu</span></a><a class="docs-next button" href="/docs/24.0.0/comparisons/druid-vs-spark.html"><span>Apache Druid vs Spark</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer druid-footer" id="footer"><div class="container"><div c [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/comparisons/druid-vs-spark.html b/docs/24.0.0/comparisons/druid-vs-spark.html
new file mode 100644
index 00000000..f4b2c3bb
--- /dev/null
+++ b/docs/24.0.0/comparisons/druid-vs-spark.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Apache Druid vs Spark · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/comparisons/druid-vs-spark.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="2 [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/comparisons/druid-vs-spark.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Apache Druid vs Spark</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>Druid and Spark are complementary solutions as Druid can be used to accelerate OLAP queries in Spark.</p>
+<p>Spark is a general cluster computing framework initially designed around the concept of Resilient Distributed Datasets (RDDs).
+RDDs enable data reuse by persisting intermediate results
+in memory and enable Spark to provide fast computations for iterative algorithms.
+This is especially beneficial for certain work flows such as machine
+learning, where the same operation may be applied over and over
+again until some result is converged upon. The generality of Spark makes it very suitable as an engine to process (clean or transform) data.
+Although Spark provides the ability to query data through Spark SQL, much like Hadoop, the query latencies are not specifically targeted to be interactive (sub-second).</p>
+<p>Druid's focus is on extremely low latency queries, and is ideal for powering applications used by thousands of users, and where each query must
+return fast enough such that users can interactively explore through data. Druid fully indexes all data, and can act as a middle layer between Spark and your application.
+One typical setup seen in production is to process data in Spark, and load the processed data into Druid for faster access.</p>
+<p>For more information about using Druid and Spark together, including benchmarks of the two systems, please see:</p>
+<p><a href="https://www.linkedin.com/pulse/combining-druid-spark-interactive-flexible-analytics-scale-butani">https://www.linkedin.com/pulse/combining-druid-spark-interactive-flexible-analytics-scale-butani</a></p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/comparisons/druid-vs-redshift.html"><span class="arrow-prev">← </span><span>Apache Druid vs Redshift</span></a><a class="docs-next button" href="/docs/24.0.0/comparisons/druid-vs-sql-on-hadoop.html"><span>Apache Druid vs SQL-on-Hadoop</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer druid-footer" id="footer"><div  [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/comparisons/druid-vs-sql-on-hadoop.html b/docs/24.0.0/comparisons/druid-vs-sql-on-hadoop.html
new file mode 100644
index 00000000..02ea2900
--- /dev/null
+++ b/docs/24.0.0/comparisons/druid-vs-sql-on-hadoop.html
@@ -0,0 +1,143 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Apache Druid vs SQL-on-Hadoop · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/comparisons/druid-vs-sql-on-hadoop.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:ver [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/comparisons/druid-vs-sql-on-hadoop.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Apache Druid vs SQL-on-Hadoop</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>SQL-on-Hadoop engines provide an
+execution engine for various data formats and data stores, and
+many can be made to push down computations down to Druid, while providing a SQL interface to Druid.</p>
+<p>For a direct comparison between the technologies and when to only use one or the other, things basically comes down to your
+product requirements and what the systems were designed to do.</p>
+<p>Druid was designed to</p>
+<ol>
+<li>be an always on service</li>
+<li>ingest data in real-time</li>
+<li>handle slice-n-dice style ad-hoc queries</li>
+</ol>
+<p>SQL-on-Hadoop engines generally sidestep Map/Reduce, instead querying data directly from HDFS or, in some cases, other storage systems.
+Some of these engines (including Impala and Presto) can be co-located with HDFS data nodes and coordinate with them to achieve data locality for queries.
+What does this mean?  We can talk about it in terms of three general areas</p>
+<ol>
+<li>Queries</li>
+<li>Data Ingestion</li>
+<li>Query Flexibility</li>
+</ol>
+<h3><a class="anchor" aria-hidden="true" id="queries"></a><a href="#queries" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
+<p>Druid segments stores data in a custom column format. Segments are scanned directly as part of queries and each Druid server
+calculates a set of results that are eventually merged at the Broker level. This means the data that is transferred between servers
+are queries and results, and all computation is done internally as part of the Druid servers.</p>
+<p>Most SQL-on-Hadoop engines are responsible for query planning and execution for underlying storage layers and storage formats.
+They are processes that stay on even if there is no query running (eliminating the JVM startup costs from Hadoop MapReduce).
+Some (Impala/Presto) SQL-on-Hadoop engines have daemon processes that can be run where the data is stored, virtually eliminating network transfer costs. There is still
+some latency overhead (e.g. serialization/deserialization time) associated with pulling data from the underlying storage layer into the computation layer. We are unaware of exactly
+how much of a performance impact this makes.</p>
+<h3><a class="anchor" aria-hidden="true" id="data-ingestion"></a><a href="#data-ingestion" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p>Druid is built to allow for real-time ingestion of data.  You can ingest data and query it immediately upon ingestion,
+the latency between how quickly the event is reflected in the data is dominated by how long it takes to deliver the event to Druid.</p>
+<p>SQL-on-Hadoop, being based on data in HDFS or some other backing store, are limited in their data ingestion rates by the
+rate at which that backing store can make data available.  Generally, the backing store is the biggest bottleneck for
+how quickly data can become available.</p>
+<h3><a class="anchor" aria-hidden="true" id="query-flexibility"></a><a href="#query-flexibility" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
+<p>Druid's query language is fairly low level and maps to how Druid operates internally. Although Druid can be combined with a high level query
+planner to support most SQL queries and analytic SQL queries (minus joins among large tables),
+base Druid is less flexible than SQL-on-Hadoop solutions for generic processing.</p>
+<p>SQL-on-Hadoop support SQL style queries with full joins.</p>
+<h2><a class="anchor" aria-hidden="true" id="druid-vs-parquet"></a><a href="#druid-vs-parquet" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<p>Parquet is a column storage format that is designed to work with SQL-on-Hadoop engines. Parquet doesn't have a query execution engine, and instead
+relies on external sources to pull data out of it.</p>
+<p>Druid's storage format is highly optimized for linear scans. Although Druid has support for nested data, Parquet's storage format is much
+more hierarchical, and is more designed for binary chunking. In theory, this should lead to faster scans in Druid.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/comparisons/druid-vs-spark.html"><span class="arrow-prev">← </span><span>Apache Druid vs Spark</span></a><a class="docs-next button" href="/docs/24.0.0/design/auth.html"><span>Authentication and Authorization</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#druid-vs-parquet">Druid vs Parquet</a></li></ul></nav></ [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/comparisons/druid-vs-vertica.html b/docs/24.0.0/comparisons/druid-vs-vertica.html
new file mode 100644
index 00000000..a1d74ac6
--- /dev/null
+++ b/docs/24.0.0/comparisons/druid-vs-vertica.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="druid-vs-redshift.html">
+<meta http-equiv="refresh" content="0; url=druid-vs-redshift.html">
+<h1>Redirecting...</h1>
+<a href="druid-vs-redshift.html">Click here if you are not redirected.</a>
+<script>location="druid-vs-redshift.html"</script>
diff --git a/docs/24.0.0/configuration/auth.html b/docs/24.0.0/configuration/auth.html
new file mode 100644
index 00000000..ea2aebee
--- /dev/null
+++ b/docs/24.0.0/configuration/auth.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../design/auth.html">
+<meta http-equiv="refresh" content="0; url=../design/auth.html">
+<h1>Redirecting...</h1>
+<a href="../design/auth.html">Click here if you are not redirected.</a>
+<script>location="../design/auth.html"</script>
diff --git a/docs/24.0.0/configuration/broker.html b/docs/24.0.0/configuration/broker.html
new file mode 100644
index 00000000..72363c4a
--- /dev/null
+++ b/docs/24.0.0/configuration/broker.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../configuration/index.html#broker">
+<meta http-equiv="refresh" content="0; url=../configuration/index.html#broker">
+<h1>Redirecting...</h1>
+<a href="../configuration/index.html#broker">Click here if you are not redirected.</a>
+<script>location="../configuration/index.html#broker"</script>
diff --git a/docs/24.0.0/configuration/caching.html b/docs/24.0.0/configuration/caching.html
new file mode 100644
index 00000000..dcb5dd6c
--- /dev/null
+++ b/docs/24.0.0/configuration/caching.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../configuration/index.html#cache-configuration">
+<meta http-equiv="refresh" content="0; url=../configuration/index.html#cache-configuration">
+<h1>Redirecting...</h1>
+<a href="../configuration/index.html#cache-configuration">Click here if you are not redirected.</a>
+<script>location="../configuration/index.html#cache-configuration"</script>
diff --git a/docs/24.0.0/configuration/coordinator.html b/docs/24.0.0/configuration/coordinator.html
new file mode 100644
index 00000000..e32a17a0
--- /dev/null
+++ b/docs/24.0.0/configuration/coordinator.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../configuration/index.html#coordinator">
+<meta http-equiv="refresh" content="0; url=../configuration/index.html#coordinator">
+<h1>Redirecting...</h1>
+<a href="../configuration/index.html#coordinator">Click here if you are not redirected.</a>
+<script>location="../configuration/index.html#coordinator"</script>
diff --git a/docs/24.0.0/configuration/hadoop.html b/docs/24.0.0/configuration/hadoop.html
new file mode 100644
index 00000000..a14b2fb4
--- /dev/null
+++ b/docs/24.0.0/configuration/hadoop.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../ingestion/hadoop.html">
+<meta http-equiv="refresh" content="0; url=../ingestion/hadoop.html">
+<h1>Redirecting...</h1>
+<a href="../ingestion/hadoop.html">Click here if you are not redirected.</a>
+<script>location="../ingestion/hadoop.html"</script>
diff --git a/docs/24.0.0/configuration/historical.html b/docs/24.0.0/configuration/historical.html
new file mode 100644
index 00000000..1112bc05
--- /dev/null
+++ b/docs/24.0.0/configuration/historical.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../configuration/index.html#historical">
+<meta http-equiv="refresh" content="0; url=../configuration/index.html#historical">
+<h1>Redirecting...</h1>
+<a href="../configuration/index.html#historical">Click here if you are not redirected.</a>
+<script>location="../configuration/index.html#historical"</script>
diff --git a/docs/latest/configuration/human-readable-byte.html b/docs/24.0.0/configuration/human-readable-byte.html
similarity index 97%
copy from docs/latest/configuration/human-readable-byte.html
copy to docs/24.0.0/configuration/human-readable-byte.html
index 059e489d..854c9166 100644
--- a/docs/latest/configuration/human-readable-byte.html
+++ b/docs/24.0.0/configuration/human-readable-byte.html
@@ -1,9 +1,9 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Human-readable Byte Configuration Reference · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/latest/configuration/human-readable-byte.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name=" [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Human-readable Byte Configuration Reference · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/configuration/human-readable-byte.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name=" [...]
               window.dataLayer = window.dataLayer || [];
               function gtag(){dataLayer.push(arguments); }
               gtag('js', new Date());
               gtag('config', 'UA-131010415-1');
-            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
   ~ Licensed to the Apache Software Foundation (ASF) under one
   ~ or more contributor license agreements.  See the NOTICE file
   ~ distributed with this work for additional information
@@ -75,7 +75,7 @@ Also, only integers are valid as the number part. For example, you can't replace
 <pre><code class="hljs css language-properties"><span class="hljs-comment"># 256Mi = 256MiB = 256 * 1024 * 1024 bytes</span>
 <span class="hljs-meta">druid.cache.sizeInBytes</span>=<span class="hljs-string">256Mi</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#a-number-in-bytes">A number in bytes</a></li><li><a href="#a-number-with-a-unit-suffix">A number with a unit suffix</a><ul class="toc-headings"><li><a href="#supported-units">Supported Units</a></li></ul></li></ul></nav></div><footer class="nav-footer druid-footer" id="footer"><div class="container"><div class="text-center"><p><a href="/technology">Techn [...]
+</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#a-number-in-bytes">A number in bytes</a></li><li><a href="#a-number-with-a-unit-suffix">A number with a unit suffix</a><ul class="toc-headings"><li><a href="#supported-units">Supported Units</a></li></ul></li></ul></nav></div><footer class="nav-footer druid-footer" id="footer"><div class="container"><div class="text-center"><p><a href="/technology">Techn [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
@@ -92,6 +92,6 @@ Also, only integers are valid as the number part. For example, you can't replace
                 apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
                 indexName: 'apache_druid',
                 inputSelector: '#search_input_react',
-                algoliaOptions: {"facetFilters":["language:en","version:0.23.0"]}
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
               });
             </script></body></html>
\ No newline at end of file
diff --git a/docs/latest/configuration/index.html b/docs/24.0.0/configuration/index.html
similarity index 86%
copy from docs/latest/configuration/index.html
copy to docs/24.0.0/configuration/index.html
index 1f037c90..6dc8251b 100644
--- a/docs/latest/configuration/index.html
+++ b/docs/24.0.0/configuration/index.html
@@ -1,9 +1,9 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Configuration reference · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/latest/configuration/index.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="0.23.0 [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Configuration reference · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/configuration/index.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24.0.0 [...]
               window.dataLayer = window.dataLayer || [];
               function gtag(){dataLayer.push(arguments); }
               gtag('js', new Date());
               gtag('config', 'UA-131010415-1');
-            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
@@ -112,7 +112,7 @@ jvm.config         <span class="hljs-keyword">runtime</span>.properties
 <h3><a class="anchor" aria-hidden="true" id="jvm-configuration-best-practices"></a><a href="#jvm-configuration-best-practices" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13. [...]
 <p>There are four JVM parameters that we set on all of our processes:</p>
 <ul>
-<li><p><code>-Duser.timezone=UTC</code>: This sets the default timezone of the JVM to UTC. We always set this and do not test with other default timezones, so local timezones might work, but they also might uncover weird and interesting bugs. To issue queries in a non-UTC timezone, see <a href="/docs/latest/querying/granularities.html#period-granularities">query granularities</a></p></li>
+<li><p><code>-Duser.timezone=UTC</code>: This sets the default timezone of the JVM to UTC. We always set this and do not test with other default timezones, so local timezones might work, but they also might uncover weird and interesting bugs. To issue queries in a non-UTC timezone, see <a href="/docs/24.0.0/querying/granularities.html#period-granularities">query granularities</a></p></li>
 <li><p><code>-Dfile.encoding=UTF-8</code> This is similar to timezone, we test assuming UTF-8. Local encodings might work, but they also might result in weird and interesting bugs.</p></li>
 <li><p><code>-Djava.io.tmpdir=&lt;a path&gt;</code> Various parts of Druid use temporary files to interact with the file system. These files can become quite large. This means that systems that have small <code>/tmp</code> directories can cause problems for Druid. Therefore, set the JVM tmp directory to a location with ample space.</p>
 <p>Also consider the following when configuring the JVM tmp directory:</p>
@@ -149,21 +149,21 @@ jvm.config         <span class="hljs-keyword">runtime</span>.properties
 <tr><td><code>druid.modules.excludeList</code></td><td>A JSON array of canonical class names (e.g., <code>&quot;org.apache.druid.somepackage.SomeModule&quot;</code>) of module classes which shouldn't be loaded, even if they are found in extensions specified by <code>druid.extensions.loadList</code>, or in the list of core modules specified to be loaded on a particular Druid process type. Useful when some useful extension contains some module, which shouldn't be loaded on some Druid proce [...]
 </tbody>
 </table>
-<h3><a class="anchor" aria-hidden="true" id="zookeeper"></a><a href="#zookeeper" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.6 [...]
+<h3><a class="anchor" aria-hidden="true" id="zookeeper"></a><a href="#zookeeper" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.6 [...]
 <p>We recommend just setting the base ZK path and the ZK service host, but all ZK paths that Druid uses can be overwritten to absolute paths.</p>
 <table>
 <thead>
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
-<tr><td><code>druid.zk.paths.base</code></td><td>Base Zookeeper path.</td><td><code>/druid</code></td></tr>
+<tr><td><code>druid.zk.paths.base</code></td><td>Base ZooKeeper path.</td><td><code>/druid</code></td></tr>
 <tr><td><code>druid.zk.service.host</code></td><td>The ZooKeeper hosts to connect to. This is a REQUIRED property and therefore a host address must be supplied.</td><td>none</td></tr>
 <tr><td><code>druid.zk.service.user</code></td><td>The username to authenticate with ZooKeeper. This is an optional property.</td><td>none</td></tr>
-<tr><td><code>druid.zk.service.pwd</code></td><td>The <a href="/docs/latest/operations/password-provider.html">Password Provider</a> or the string password to authenticate with ZooKeeper. This is an optional property.</td><td>none</td></tr>
+<tr><td><code>druid.zk.service.pwd</code></td><td>The <a href="/docs/24.0.0/operations/password-provider.html">Password Provider</a> or the string password to authenticate with ZooKeeper. This is an optional property.</td><td>none</td></tr>
 <tr><td><code>druid.zk.service.authScheme</code></td><td>digest is the only authentication scheme supported.</td><td>digest</td></tr>
 </tbody>
 </table>
-<h4><a class="anchor" aria-hidden="true" id="zookeeper-behavior"></a><a href="#zookeeper-behavior" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
+<h4><a class="anchor" aria-hidden="true" id="zookeeper-behavior"></a><a href="#zookeeper-behavior" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
 <table>
 <thead>
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
@@ -182,13 +182,13 @@ jvm.config         <span class="hljs-keyword">runtime</span>.properties
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
-<tr><td><code>druid.zk.paths.base</code></td><td>Base Zookeeper path.</td><td><code>/druid</code></td></tr>
-<tr><td><code>druid.zk.paths.propertiesPath</code></td><td>Zookeeper properties path.</td><td><code>${druid.zk.paths.base}/properties</code></td></tr>
+<tr><td><code>druid.zk.paths.base</code></td><td>Base ZooKeeper path.</td><td><code>/druid</code></td></tr>
+<tr><td><code>druid.zk.paths.propertiesPath</code></td><td>ZooKeeper properties path.</td><td><code>${druid.zk.paths.base}/properties</code></td></tr>
 <tr><td><code>druid.zk.paths.announcementsPath</code></td><td>Druid process announcement path.</td><td><code>${druid.zk.paths.base}/announcements</code></td></tr>
 <tr><td><code>druid.zk.paths.liveSegmentsPath</code></td><td>Current path for where Druid processes announce their segments.</td><td><code>${druid.zk.paths.base}/segments</code></td></tr>
 <tr><td><code>druid.zk.paths.loadQueuePath</code></td><td>Entries here cause Historical processes to load and drop segments.</td><td><code>${druid.zk.paths.base}/loadQueue</code></td></tr>
 <tr><td><code>druid.zk.paths.coordinatorPath</code></td><td>Used by the Coordinator for leader election.</td><td><code>${druid.zk.paths.base}/coordinator</code></td></tr>
-<tr><td><code>druid.zk.paths.servedSegmentsPath</code></td><td>@Deprecated. Legacy path for where Druid processes announce their segments.</td><td><code>${druid.zk.paths.base}/servedSegments</code></td></tr>
+<tr><td><code>druid.zk.paths.servedSegmentsPath</code></td><td>Deprecated. Legacy path for where Druid processes announce their segments.</td><td><code>${druid.zk.paths.base}/servedSegments</code></td></tr>
 </tbody>
 </table>
 <p>The indexing service also uses its own set of paths. These configs can be included in the common configuration.</p>
@@ -197,7 +197,7 @@ jvm.config         <span class="hljs-keyword">runtime</span>.properties
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
-<tr><td><code>druid.zk.paths.indexer.base</code></td><td>Base zookeeper path for</td><td><code>${druid.zk.paths.base}/indexer</code></td></tr>
+<tr><td><code>druid.zk.paths.indexer.base</code></td><td>Base ZooKeeper path for</td><td><code>${druid.zk.paths.base}/indexer</code></td></tr>
 <tr><td><code>druid.zk.paths.indexer.announcementsPath</code></td><td>Middle managers announce themselves here.</td><td><code>${druid.zk.paths.indexer.base}/announcements</code></td></tr>
 <tr><td><code>druid.zk.paths.indexer.tasksPath</code></td><td>Used to assign tasks to MiddleManagers.</td><td><code>${druid.zk.paths.indexer.base}/tasks</code></td></tr>
 <tr><td><code>druid.zk.paths.indexer.statusPath</code></td><td>Parent path for announcement of task statuses.</td><td><code>${druid.zk.paths.indexer.base}/status</code></td></tr>
@@ -259,7 +259,7 @@ values for the following properties, among others provided by the Java implement
 <tr><td><code>druid.server.https.keyStorePath</code></td><td>The file path or URL of the TLS/SSL Key store.</td><td>none</td><td>yes</td></tr>
 <tr><td><code>druid.server.https.keyStoreType</code></td><td>The type of the key store.</td><td>none</td><td>yes</td></tr>
 <tr><td><code>druid.server.https.certAlias</code></td><td>Alias of TLS/SSL certificate for the connector.</td><td>none</td><td>yes</td></tr>
-<tr><td><code>druid.server.https.keyStorePassword</code></td><td>The <a href="/docs/latest/operations/password-provider.html">Password Provider</a> or String password for the Key Store.</td><td>none</td><td>yes</td></tr>
+<tr><td><code>druid.server.https.keyStorePassword</code></td><td>The <a href="/docs/24.0.0/operations/password-provider.html">Password Provider</a> or String password for the Key Store.</td><td>none</td><td>yes</td></tr>
 </tbody>
 </table>
 <p>Following table contains non-mandatory advanced configuration options, use caution.</p>
@@ -269,7 +269,7 @@ values for the following properties, among others provided by the Java implement
 </thead>
 <tbody>
 <tr><td><code>druid.server.https.keyManagerFactoryAlgorithm</code></td><td>Algorithm to use for creating KeyManager, more details <a href="https://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#KeyManager">here</a>.</td><td><code>javax.net.ssl.KeyManagerFactory.getDefaultAlgorithm()</code></td><td>no</td></tr>
-<tr><td><code>druid.server.https.keyManagerPassword</code></td><td>The <a href="/docs/latest/operations/password-provider.html">Password Provider</a> or String password for the Key Manager.</td><td>none</td><td>no</td></tr>
+<tr><td><code>druid.server.https.keyManagerPassword</code></td><td>The <a href="/docs/24.0.0/operations/password-provider.html">Password Provider</a> or String password for the Key Manager.</td><td>none</td><td>no</td></tr>
 <tr><td><code>druid.server.https.includeCipherSuites</code></td><td>List of cipher suite names to include. You can either use the exact cipher suite name or a regular expression.</td><td>Jetty's default include cipher list</td><td>no</td></tr>
 <tr><td><code>druid.server.https.excludeCipherSuites</code></td><td>List of cipher suite names to exclude. You can either use the exact cipher suite name or a regular expression.</td><td>Jetty's default exclude cipher list</td><td>no</td></tr>
 <tr><td><code>druid.server.https.includeProtocols</code></td><td>List of exact protocols names to include.</td><td>Jetty's default include protocol list</td><td>no</td></tr>
@@ -287,7 +287,7 @@ values for the following properties, among others provided by the Java implement
 <tr><td><code>druid.client.https.trustStoreType</code></td><td>The type of the key store where trusted root certificates are stored.</td><td><code>java.security.KeyStore.getDefaultType()</code></td><td>no</td></tr>
 <tr><td><code>druid.client.https.trustStorePath</code></td><td>The file path or URL of the TLS/SSL Key store where trusted root certificates are stored.</td><td>none</td><td>yes</td></tr>
 <tr><td><code>druid.client.https.trustStoreAlgorithm</code></td><td>Algorithm to be used by TrustManager to validate certificate chains</td><td><code>javax.net.ssl.TrustManagerFactory.getDefaultAlgorithm()</code></td><td>no</td></tr>
-<tr><td><code>druid.client.https.trustStorePassword</code></td><td>The <a href="/docs/latest/operations/password-provider.html">Password Provider</a> or String password for the Trust Store.</td><td>none</td><td>yes</td></tr>
+<tr><td><code>druid.client.https.trustStorePassword</code></td><td>The <a href="/docs/24.0.0/operations/password-provider.html">Password Provider</a> or String password for the Trust Store.</td><td>none</td><td>yes</td></tr>
 </tbody>
 </table>
 <p>This <a href="http://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html">document</a> lists all the possible
@@ -305,7 +305,7 @@ values for the above mentioned configs among others provided by Java implementat
 <tr><td><code>druid.auth.allowUnauthenticatedHttpOptions</code></td><td>Boolean</td><td>If true, skip authentication checks for HTTP OPTIONS requests. This is needed for certain use cases, such as supporting CORS pre-flight requests. Note that disabling authentication checks for OPTIONS requests will allow unauthenticated users to determine what Druid endpoints are valid (by checking if the OPTIONS request returns a 200 instead of 404), so enabling this option may reveal information abou [...]
 </tbody>
 </table>
-<p>For more information, please see <a href="/docs/latest/design/auth.html">Authentication and Authorization</a>.</p>
+<p>For more information, please see <a href="/docs/24.0.0/design/auth.html">Authentication and Authorization</a>.</p>
 <p>For configuration options for specific auth extensions, please refer to the extension documentation.</p>
 <h3><a class="anchor" aria-hidden="true" id="startup-logging"></a><a href="#startup-logging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
 <p>All processes can log debugging information on startup.</p>
@@ -321,7 +321,7 @@ values for the above mentioned configs among others provided by Java implementat
 <p>Note that some sensitive information may be logged if these settings are enabled.</p>
 <h3><a class="anchor" aria-hidden="true" id="request-logging"></a><a href="#request-logging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
 <p>All processes that can serve queries can also log the query requests they see. Broker processes can additionally log the SQL requests (both from HTTP and JDBC) they see.
-For an example of setting up request logging, see <a href="/docs/latest/operations/request-logging.html">Request logging</a>.</p>
+For an example of setting up request logging, see <a href="/docs/24.0.0/operations/request-logging.html">Request logging</a>.</p>
 <table>
 <thead>
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
@@ -330,7 +330,7 @@ For an example of setting up request logging, see <a href="/docs/latest/operatio
 <tr><td><code>druid.request.logging.type</code></td><td>How to log every query request. Choices: <code>noop</code>, <a href="#file-request-logging"><code>file</code></a>, <a href="#emitter-request-logging"><code>emitter</code></a>, <a href="#slf4j-request-logging"><code>slf4j</code></a>, <a href="#filtered-request-logging"><code>filtered</code></a>, <a href="#composing-request-logging"><code>composing</code></a>, <a href="#switching-request-logging"><code>switching</code></a></td><td><co [...]
 </tbody>
 </table>
-<p>Note that you can enable sending all the HTTP requests to log by setting  <code>org.apache.druid.jetty.RequestLog</code> to the <code>DEBUG</code> level. See <a href="/docs/latest/configuration/logging.html">Logging</a> for more information.</p>
+<p>Note that you can enable sending all the HTTP requests to log by setting  <code>org.apache.druid.jetty.RequestLog</code> to the <code>DEBUG</code> level. See <a href="/docs/24.0.0/configuration/logging.html">Logging</a> for more information.</p>
 <h4><a class="anchor" aria-hidden="true" id="file-request-logging"></a><a href="#file-request-logging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
 <p>The <code>file</code> request logger stores daily request logs on disk.</p>
 <table>
@@ -340,6 +340,7 @@ For an example of setting up request logging, see <a href="/docs/latest/operatio
 <tbody>
 <tr><td><code>druid.request.logging.dir</code></td><td>Historical, Realtime and Broker processes maintain request logs of all of the requests they get (interaction is via POST, so normal request logs don’t generally capture information about the actual query), this specifies the directory to store the request logs in</td><td>none</td></tr>
 <tr><td><code>druid.request.logging.filePattern</code></td><td><a href="http://www.joda.org/joda-time/apidocs/org/joda/time/format/DateTimeFormat.html">Joda datetime format</a> for each file</td><td>&quot;yyyy-MM-dd'.log'&quot;</td></tr>
+<tr><td><code>druid.request.logging.durationToRetain</code></td><td>Period to retain the request logs on disk. The period should be at least longer than <code>P1D</code>.</td><td>none</td></tr>
 </tbody>
 </table>
 <p>The format of request logs is TSV, one line per requests, with five fields: timestamp, remote_addr, native_query, query_context, sql_query.</p>
@@ -347,7 +348,7 @@ For an example of setting up request logging, see <a href="/docs/latest/operatio
 <pre><code class="hljs"><span class="hljs-number">2019-01</span><span class="hljs-number">-14T10</span><span class="hljs-symbol">:</span>00<span class="hljs-symbol">:</span>00.000Z        <span class="hljs-number">127.0</span>.0.<span class="hljs-number">1</span>   {<span class="hljs-string">"queryType"</span><span class="hljs-symbol">:<span class="hljs-string">"topN"</span></span>,<span class="hljs-string">"dataSource"</span><span class="hljs-symbol">:</span>{<span class="hljs-string">" [...]
 </code></pre>
 <p>For SQL query request, the <code>native_query</code> field is empty. Example</p>
-<pre><code class="hljs"><span class="hljs-number">2019</span><span class="hljs-number">-01</span><span class="hljs-number">-14</span><span class="hljs-string">T10:</span><span class="hljs-number">00</span>:<span class="hljs-number">00.000</span>Z        <span class="hljs-number">127.0</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span>       {<span class="hljs-string">"sqlQuery/time"</span>:<span class="hljs-number">100</span>,<span class="hljs-string">"sqlQuery/ [...]
+<pre><code class="hljs"><span class="hljs-number">2019</span>-<span class="hljs-number">01</span>-<span class="hljs-number">14</span>T10:<span class="hljs-number">00</span>:<span class="hljs-number">00.000</span>Z        <span class="hljs-number">127.0</span>.<span class="hljs-number">0.1</span>       {<span class="hljs-string">"sqlQuery/time"</span>:<span class="hljs-number">100</span>, <span class="hljs-string">"sqlQuery/planningTimeMs"</span>:<span class="hljs-number">10</span>, <span [...]
 </code></pre>
 <h4><a class="anchor" aria-hidden="true" id="emitter-request-logging"></a><a href="#emitter-request-logging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
 <p>The <code>emitter</code> request logger emits every request to the external location specified in the <a href="#enabling-metrics">emitter</a> configuration.</p>
@@ -391,7 +392,7 @@ For an example of setting up request logging, see <a href="/docs/latest/operatio
 <p>The <code>filtered</code> request logger filters requests based on the query type or how long a query takes to complete.
 For native queries, the logger only logs requests when the <code>query/time</code> metric exceeds the threshold provided in <code>queryTimeThresholdMs</code>.
 For SQL queries, it only logs requests when the <code>sqlQuery/time</code> metric exceeds threshold provided in <code>sqlQueryTimeThresholdMs</code>.
-See <a href="/docs/latest/operations/metrics.html">Metrics</a> for more details on query metrics.</p>
+See <a href="/docs/24.0.0/operations/metrics.html">Metrics</a> for more details on query metrics.</p>
 <p>Requests that meet the threshold are logged using the request logger type set in <code>druid.request.logging.delegate.type</code>.</p>
 <table>
 <thead>
@@ -434,12 +435,12 @@ See <a href="/docs/latest/operations/metrics.html">Metrics</a> for more details
 <tbody>
 <tr><td><code>druid.audit.manager.auditHistoryMillis</code></td><td>Default duration for querying audit history.</td><td>1 week</td></tr>
 <tr><td><code>druid.audit.manager.includePayloadAsDimensionInMetric</code></td><td>Boolean flag on whether to add <code>payload</code> column in service metric.</td><td>false</td></tr>
-<tr><td><code>druid.audit.manager.maxPayloadSizeBytes</code></td><td>The maximum size of audit payload to store in Druid's metadata store audit table. If the size of audit payload exceeds this value, the audit log would be stored with a message indicating that the payload was omitted instead. Setting <code>maxPayloadSizeBytes</code> to -1 (default value) disables this check, meaning Druid will always store audit payload regardless of it's size. Setting to any negative number other than < [...]
+<tr><td><code>druid.audit.manager.maxPayloadSizeBytes</code></td><td>The maximum size of audit payload to store in Druid's metadata store audit table. If the size of audit payload exceeds this value, the audit log would be stored with a message indicating that the payload was omitted instead. Setting <code>maxPayloadSizeBytes</code> to -1 (default value) disables this check, meaning Druid will always store audit payload regardless of it's size. Setting to any negative number other than < [...]
 <tr><td><code>druid.audit.manager.skipNullField</code></td><td>If true, the audit payload stored in metadata store will exclude any field with null value.</td><td>false</td></tr>
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="enabling-metrics"></a><a href="#enabling-metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
-<p>You can configure Druid processes to emit <a href="/docs/latest/operations/metrics.html">metrics</a> regularly from a number of <a href="#metrics-monitors">monitors</a> via <a href="#metrics-emitters">emitters</a>.</p>
+<p>You can configure Druid processes to emit <a href="/docs/24.0.0/operations/metrics.html">metrics</a> regularly from a number of <a href="#metrics-monitors">monitors</a> via <a href="#metrics-emitters">emitters</a>.</p>
 <table>
 <thead>
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
@@ -468,9 +469,12 @@ See <a href="/docs/latest/operations/metrics.html">Metrics</a> for more details
 <tr><td><code>org.apache.druid.java.util.metrics.CgroupMemoryMonitor</code></td><td>Reports memory statistic as per the memory cgroup.</td></tr>
 <tr><td><code>org.apache.druid.server.metrics.EventReceiverFirehoseMonitor</code></td><td>Reports how many events have been queued in the EventReceiverFirehose.</td></tr>
 <tr><td><code>org.apache.druid.server.metrics.HistoricalMetricsMonitor</code></td><td>Reports statistics on Historical processes. Available only on Historical processes.</td></tr>
+<tr><td><code>org.apache.druid.server.metrics.SegmentStatsMonitor</code></td><td><strong>EXPERIMENTAL</strong> Reports statistics about segments on Historical processes. Available only on Historical processes. Not to be used when lazy loading is configured.</td></tr>
 <tr><td><code>org.apache.druid.server.metrics.QueryCountStatsMonitor</code></td><td>Reports how many queries have been successful/failed/interrupted.</td></tr>
 <tr><td><code>org.apache.druid.server.emitter.HttpEmittingMonitor</code></td><td>Reports internal metrics of <code>http</code> or <code>parametrized</code> emitter (see below). Must not be used with another emitter type. See the description of the metrics here: <a href="https://github.com/apache/druid/pull/4973">https://github.com/apache/druid/pull/4973</a>.</td></tr>
 <tr><td><code>org.apache.druid.server.metrics.TaskCountStatsMonitor</code></td><td>Reports how many ingestion tasks are currently running/pending/waiting and also the number of successful/failed tasks per emission period.</td></tr>
+<tr><td><code>org.apache.druid.server.metrics.TaskSlotCountStatsMonitor</code></td><td>Reports metrics about task slot usage per emission period.</td></tr>
+<tr><td><code>org.apache.druid.server.metrics.WorkerTaskCountStatsMonitor</code></td><td>Reports how many ingestion tasks are currently running/pending/waiting, the number of successful/failed tasks, and metrics about task slot usage for the reporting worker, per emission period. Only supported by middleManager node types.</td></tr>
 </tbody>
 </table>
 <p>For example, you might configure monitors on all processes for system and JVM information within <code>common.runtime.properties</code> as follows:</p>
@@ -505,7 +509,7 @@ See <a href="/docs/latest/operations/metrics.html">Metrics</a> for more details
 <tbody>
 <tr><td><code>druid.emitter.http.flushMillis</code></td><td>How often the internal message buffer is flushed (data is sent).</td><td>60000</td></tr>
 <tr><td><code>druid.emitter.http.flushCount</code></td><td>How many messages the internal message buffer can hold before flushing (sending).</td><td>500</td></tr>
-<tr><td><code>druid.emitter.http.basicAuthentication</code></td><td><a href="/docs/latest/operations/password-provider.html">Password Provider</a> for providing Login and password for authentication in &quot;login:password&quot; form, e.g., <code>druid.emitter.http.basicAuthentication=admin:adminpassword</code> uses Default Password Provider which allows plain text passwords.</td><td>not specified = no authentication</td></tr>
+<tr><td><code>druid.emitter.http.basicAuthentication</code></td><td><a href="/docs/24.0.0/operations/password-provider.html">Password Provider</a> for providing Login and password for authentication in &quot;login:password&quot; form, e.g., <code>druid.emitter.http.basicAuthentication=admin:adminpassword</code> uses Default Password Provider which allows plain text passwords.</td><td>not specified = no authentication</td></tr>
 <tr><td><code>druid.emitter.http.flushTimeOut</code></td><td>The timeout after which an event should be sent to the endpoint, even if internal buffers are not filled, in milliseconds.</td><td>not specified = no timeout</td></tr>
 <tr><td><code>druid.emitter.http.batchingStrategy</code></td><td>The strategy of how the batch is formatted. &quot;ARRAY&quot; means <code>[event1,event2]</code>, &quot;NEWLINES&quot; means <code>event1\nevent2</code>, ONLY_EVENTS means <code>event1event2</code>.</td><td>ARRAY</td></tr>
 <tr><td><code>druid.emitter.http.maxBatchSize</code></td><td>The maximum batch size, in bytes.</td><td>the minimum of (10% of JVM heap size divided by 2) or (5242880 (i. e. 5 MiB))</td></tr>
@@ -515,7 +519,7 @@ See <a href="/docs/latest/operations/metrics.html">Metrics</a> for more details
 </tbody>
 </table>
 <h5><a class="anchor" aria-hidden="true" id="http-emitter-module-tls-overrides"></a><a href="#http-emitter-module-tls-overrides" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S1 [...]
-<p>By default, when sending events to a TLS-enabled receiver, the HTTP Emitter uses an SSLContext obtained from the process described at <a href="/docs/latest/operations/tls-support.html">Druid's internal communication over TLS</a>, i.e., the same
+<p>By default, when sending events to a TLS-enabled receiver, the HTTP Emitter uses an SSLContext obtained from the process described at <a href="/docs/24.0.0/operations/tls-support.html">Druid's internal communication over TLS</a>, i.e., the same
 SSLContext that would be used for internal communications between Druid processes.</p>
 <p>In some use cases it may be desirable to have the HTTP Emitter use its own separate truststore configuration. For example, there may be organizational policies that prevent the TLS-enabled metrics receiver's certificate from being added to the same truststore used by Druid's internal HTTP client.</p>
 <p>The following properties allow the HTTP Emitter to use its own truststore configuration when building its SSLContext.</p>
@@ -528,7 +532,7 @@ SSLContext that would be used for internal communications between Druid processe
 <tr><td><code>druid.emitter.http.ssl.trustStorePath</code></td><td>The file path or URL of the TLS/SSL Key store where trusted root certificates are stored. If this is unspecified, the HTTP Emitter will use the same SSLContext as Druid's internal HTTP client, as described in the beginning of this section, and all other properties below are ignored.</td><td>null</td></tr>
 <tr><td><code>druid.emitter.http.ssl.trustStoreType</code></td><td>The type of the key store where trusted root certificates are stored.</td><td><code>java.security.KeyStore.getDefaultType()</code></td></tr>
 <tr><td><code>druid.emitter.http.ssl.trustStoreAlgorithm</code></td><td>Algorithm to be used by TrustManager to validate certificate chains</td><td><code>javax.net.ssl.TrustManagerFactory.getDefaultAlgorithm()</code></td></tr>
-<tr><td><code>druid.emitter.http.ssl.trustStorePassword</code></td><td>The <a href="/docs/latest/operations/password-provider.html">Password Provider</a> or String password for the Trust Store.</td><td>none</td></tr>
+<tr><td><code>druid.emitter.http.ssl.trustStorePassword</code></td><td>The <a href="/docs/24.0.0/operations/password-provider.html">Password Provider</a> or String password for the Trust Store.</td><td>none</td></tr>
 <tr><td><code>druid.emitter.http.ssl.protocol</code></td><td>TLS protocol to use.</td><td>&quot;TLSv1.2&quot;</td></tr>
 </tbody>
 </table>
@@ -560,9 +564,9 @@ Instead use <code>recipientBaseUrlPattern</code> described in the table below.</
 </tbody>
 </table>
 <h5><a class="anchor" aria-hidden="true" id="graphite-emitter"></a><a href="#graphite-emitter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
-<p>To use graphite as emitter set <code>druid.emitter=graphite</code>. For configuration details, see <a href="/docs/latest/development/extensions-contrib/graphite.html">Graphite emitter</a> for the Graphite emitter Druid extension.</p>
+<p>To use graphite as emitter set <code>druid.emitter=graphite</code>. For configuration details, see <a href="/docs/24.0.0/development/extensions-contrib/graphite.html">Graphite emitter</a> for the Graphite emitter Druid extension.</p>
 <h3><a class="anchor" aria-hidden="true" id="metadata-storage"></a><a href="#metadata-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
-<p>These properties specify the JDBC connection and other configuration around the metadata storage. The only processes that connect to the metadata storage with these properties are the <a href="/docs/latest/design/coordinator.html">Coordinator</a> and <a href="/docs/latest/design/overlord.html">Overlord</a>.</p>
+<p>These properties specify the JDBC connection and other configuration around the metadata storage. The only processes that connect to the metadata storage with these properties are the <a href="/docs/24.0.0/design/coordinator.html">Coordinator</a> and <a href="/docs/24.0.0/design/overlord.html">Overlord</a>.</p>
 <table>
 <thead>
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
@@ -571,10 +575,10 @@ Instead use <code>recipientBaseUrlPattern</code> described in the table below.</
 <tr><td><code>druid.metadata.storage.type</code></td><td>The type of metadata storage to use. Choose from &quot;mysql&quot;, &quot;postgresql&quot;, or &quot;derby&quot;.</td><td>derby</td></tr>
 <tr><td><code>druid.metadata.storage.connector.connectURI</code></td><td>The JDBC URI for the database to connect to</td><td>none</td></tr>
 <tr><td><code>druid.metadata.storage.connector.user</code></td><td>The username to connect with.</td><td>none</td></tr>
-<tr><td><code>druid.metadata.storage.connector.password</code></td><td>The <a href="/docs/latest/operations/password-provider.html">Password Provider</a> or String password used to connect with.</td><td>none</td></tr>
+<tr><td><code>druid.metadata.storage.connector.password</code></td><td>The <a href="/docs/24.0.0/operations/password-provider.html">Password Provider</a> or String password used to connect with.</td><td>none</td></tr>
 <tr><td><code>druid.metadata.storage.connector.createTables</code></td><td>If Druid requires a table and it doesn't exist, create it?</td><td>true</td></tr>
 <tr><td><code>druid.metadata.storage.tables.base</code></td><td>The base name for tables.</td><td>druid</td></tr>
-<tr><td><code>druid.metadata.storage.tables.dataSource</code></td><td>The table to use to look for dataSources which created by <a href="/docs/latest/development/extensions-core/kafka-ingestion.html">Kafka Indexing Service</a>.</td><td>druid_dataSource</td></tr>
+<tr><td><code>druid.metadata.storage.tables.dataSource</code></td><td>The table to use to look for dataSources which created by <a href="/docs/24.0.0/development/extensions-core/kafka-ingestion.html">Kafka Indexing Service</a>.</td><td>druid_dataSource</td></tr>
 <tr><td><code>druid.metadata.storage.tables.pendingSegments</code></td><td>The table to use to look for pending segments.</td><td>druid_pendingSegments</td></tr>
 <tr><td><code>druid.metadata.storage.tables.segments</code></td><td>The table to use to look for segments.</td><td>druid_segments</td></tr>
 <tr><td><code>druid.metadata.storage.tables.rules</code></td><td>The table to use to look for segment load/drop rules.</td><td>druid_rules</td></tr>
@@ -587,7 +591,7 @@ Instead use <code>recipientBaseUrlPattern</code> described in the table below.</
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="deep-storage"></a><a href="#deep-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>The configurations concern how to push and pull <a href="/docs/latest/design/segments.html">Segments</a> from deep storage.</p>
+<p>The configurations concern how to push and pull <a href="/docs/24.0.0/design/segments.html">Segments</a> from deep storage.</p>
 <table>
 <thead>
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
@@ -610,7 +614,7 @@ Instead use <code>recipientBaseUrlPattern</code> described in the table below.</
 <p>This deep storage doesn't do anything. There are no configs.</p>
 <h4><a class="anchor" aria-hidden="true" id="s3-deep-storage"></a><a href="#s3-deep-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
 <p>This deep storage is used to interface with Amazon's S3. Note that the <code>druid-s3-extensions</code> extension must be loaded.
-The below table shows some important configurations for S3. See <a href="/docs/latest/development/extensions-core/s3.html">S3 Deep Storage</a> for full configurations.</p>
+The below table shows some important configurations for S3. See <a href="/docs/24.0.0/development/extensions-core/s3.html">S3 Deep Storage</a> for full configurations.</p>
 <table>
 <thead>
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
@@ -618,10 +622,10 @@ The below table shows some important configurations for S3. See <a href="/docs/l
 <tbody>
 <tr><td><code>druid.storage.bucket</code></td><td>S3 bucket name.</td><td>none</td></tr>
 <tr><td><code>druid.storage.baseKey</code></td><td>S3 object key prefix for storage.</td><td>none</td></tr>
-<tr><td><code>druid.storage.disableAcl</code></td><td>Boolean flag for ACL. If this is set to <code>false</code>, the full control would be granted to the bucket owner. This may require to set additional permissions. See <a href="/docs/latest/development/extensions-core/s3.html#s3-permissions-settings">S3 permissions settings</a>.</td><td>false</td></tr>
+<tr><td><code>druid.storage.disableAcl</code></td><td>Boolean flag for ACL. If this is set to <code>false</code>, the full control would be granted to the bucket owner. This may require to set additional permissions. See <a href="/docs/24.0.0/development/extensions-core/s3.html#s3-permissions-settings">S3 permissions settings</a>.</td><td>false</td></tr>
 <tr><td><code>druid.storage.archiveBucket</code></td><td>S3 bucket name for archiving when running the <em>archive task</em>.</td><td>none</td></tr>
 <tr><td><code>druid.storage.archiveBaseKey</code></td><td>S3 object key prefix for archiving.</td><td>none</td></tr>
-<tr><td><code>druid.storage.sse.type</code></td><td>Server-side encryption type. Should be one of <code>s3</code>, <code>kms</code>, and <code>custom</code>. See the below <a href="/docs/latest/development/extensions-core/s3.html#server-side-encryption">Server-side encryption section</a> for more details.</td><td>None</td></tr>
+<tr><td><code>druid.storage.sse.type</code></td><td>Server-side encryption type. Should be one of <code>s3</code>, <code>kms</code>, and <code>custom</code>. See the below <a href="/docs/24.0.0/development/extensions-core/s3.html#server-side-encryption">Server-side encryption section</a> for more details.</td><td>None</td></tr>
 <tr><td><code>druid.storage.sse.kms.keyId</code></td><td>AWS KMS key ID. This is used only when <code>druid.storage.sse.type</code> is <code>kms</code> and can be empty to use the default key ID.</td><td>None</td></tr>
 <tr><td><code>druid.storage.sse.custom.base64EncodedKey</code></td><td>Base64-encoded key. Should be specified if <code>druid.storage.sse.type</code> is <code>custom</code>.</td><td>None</td></tr>
 <tr><td><code>druid.storage.useS3aSchema</code></td><td>If true, use the &quot;s3a&quot; filesystem when using Hadoop-based ingestion. If false, the &quot;s3n&quot; filesystem will be used. Only affects Hadoop-based ingestion.</td><td>false</td></tr>
@@ -651,7 +655,7 @@ The below table shows some important configurations for S3. See <a href="/docs/l
 <h3><a class="anchor" aria-hidden="true" id="ingestion-security-configuration"></a><a href="#ingestion-security-configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13. [...]
 <h4><a class="anchor" aria-hidden="true" id="hdfs-input-source"></a><a href="#hdfs-input-source" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
 <p>You can set the following property to specify permissible protocols for
-the <a href="/docs/latest/ingestion/native-batch-input-sources.html#hdfs-input-source">HDFS input source</a> and the <a href="/docs/latest/ingestion/native-batch-firehose.html#hdfsfirehose">HDFS firehose</a>.</p>
+the <a href="/docs/24.0.0/ingestion/native-batch-input-sources.html#hdfs-input-source">HDFS input source</a> and the <a href="/docs/24.0.0/ingestion/native-batch-firehose.html#hdfsfirehose">HDFS firehose</a>.</p>
 <table>
 <thead>
 <tr><th>Property</th><th>Possible Values</th><th>Description</th><th>Default</th></tr>
@@ -662,7 +666,7 @@ the <a href="/docs/latest/ingestion/native-batch-input-sources.html#hdfs-input-s
 </table>
 <h4><a class="anchor" aria-hidden="true" id="http-input-source"></a><a href="#http-input-source" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
 <p>You can set the following property to specify permissible protocols for
-the <a href="/docs/latest/ingestion/native-batch-input-sources.html#http-input-source">HTTP input source</a> and the <a href="/docs/latest/ingestion/native-batch-firehose.html#httpfirehose">HTTP firehose</a>.</p>
+the <a href="/docs/24.0.0/ingestion/native-batch-input-sources.html#http-input-source">HTTP input source</a> and the <a href="/docs/24.0.0/ingestion/native-batch-firehose.html#httpfirehose">HTTP firehose</a>.</p>
 <table>
 <thead>
 <tr><th>Property</th><th>Possible Values</th><th>Description</th><th>Default</th></tr>
@@ -675,10 +679,10 @@ the <a href="/docs/latest/ingestion/native-batch-input-sources.html#http-input-s
 <h4><a class="anchor" aria-hidden="true" id="jdbc-connections-to-external-databases"></a><a href="#jdbc-connections-to-external-databases" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1. [...]
 <p>You can use the following properties to specify permissible JDBC options for:</p>
 <ul>
-<li><a href="/docs/latest/ingestion/native-batch-input-sources.html#sql-input-source">SQL input source</a></li>
-<li><a href="/docs/latest/ingestion/native-batch-firehose.html#sqlfirehose">SQL firehose</a>,</li>
-<li><a href="/docs/latest/development/extensions-core/lookups-cached-global.html#jdbc-lookup">globally cached JDBC lookups</a></li>
-<li><a href="/docs/latest/development/extensions-core/druid-lookups.html#data-fetcher-layer">JDBC Data Fetcher for per-lookup caching</a>.</li>
+<li><a href="/docs/24.0.0/ingestion/native-batch-input-sources.html#sql-input-source">SQL input source</a></li>
+<li><a href="/docs/24.0.0/ingestion/native-batch-firehose.html#sqlfirehose">SQL firehose</a>,</li>
+<li><a href="/docs/24.0.0/development/extensions-core/lookups-cached-global.html#jdbc-lookup">globally cached JDBC lookups</a></li>
+<li><a href="/docs/24.0.0/development/extensions-core/druid-lookups.html#data-fetcher-layer">JDBC Data Fetcher for per-lookup caching</a>.</li>
 </ul>
 <p>These properties do not apply to metadata storage connections.</p>
 <table>
@@ -687,13 +691,13 @@ the <a href="/docs/latest/ingestion/native-batch-input-sources.html#http-input-s
 </thead>
 <tbody>
 <tr><td><code>druid.access.jdbc.enforceAllowedProperties</code></td><td>Boolean</td><td>When true, Druid applies <code>druid.access.jdbc.allowedProperties</code> to JDBC connections starting with <code>jdbc:postgresql:</code>, <code>jdbc:mysql:</code>, or <code>jdbc:mariadb:</code>. When false, Druid allows any kind of JDBC connections without JDBC property validation. This config is for backward compatibility especially during upgrades since enforcing allow list can break existing inges [...]
-<tr><td><code>druid.access.jdbc.allowedProperties</code></td><td>List of JDBC properties</td><td>Defines a list of allowed JDBC properties. Druid always enforces the list for all JDBC connections starting with <code>jdbc:postgresql:</code>, <code>jdbc:mysql:</code>, and <code>jdbc:mariadb:</code> if <code>druid.access.jdbc.enforceAllowedProperties</code> is set to true.<br/><br/>This option is tested against MySQL connector 5.1.48, MariaDB connector 2.7.4, and PostgreSQL connector 42.2.1 [...]
+<tr><td><code>druid.access.jdbc.allowedProperties</code></td><td>List of JDBC properties</td><td>Defines a list of allowed JDBC properties. Druid always enforces the list for all JDBC connections starting with <code>jdbc:postgresql:</code>, <code>jdbc:mysql:</code>, and <code>jdbc:mariadb:</code> if <code>druid.access.jdbc.enforceAllowedProperties</code> is set to true.<br/><br/>This option is tested against MySQL connector 5.1.49, MariaDB connector 2.7.4, and PostgreSQL connector 42.2.1 [...]
 <tr><td><code>druid.access.jdbc.allowUnknownJdbcUrlFormat</code></td><td>Boolean</td><td>When false, Druid only accepts JDBC connections starting with <code>jdbc:postgresql:</code> or <code>jdbc:mysql:</code>. When true, Druid allows JDBC connections to any kind of database, but only enforces <code>druid.access.jdbc.allowedProperties</code> for PostgreSQL and MySQL/MariaDB.</td><td>true</td></tr>
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="task-logging"></a><a href="#task-logging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
 <p>You can use the <code>druid.indexer</code> configuration to set a <a href="#log-long-term-storage">long-term storage</a> location for task log files, and to set a <a href="#log-retention-policy">retention policy</a>.</p>
-<p>For more information about ingestion tasks and the process of generating logs, see the <a href="/docs/latest/ingestion/tasks.html">task reference</a>.</p>
+<p>For more information about ingestion tasks and the process of generating logs, see the <a href="/docs/24.0.0/ingestion/tasks.html">task reference</a>.</p>
 <h4><a class="anchor" aria-hidden="true" id="log-long-term-storage"></a><a href="#log-long-term-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
 <table>
 <thead>
@@ -813,7 +817,7 @@ This is the default Druid error response mode. To explicitly enable this strateg
 <pre><code class="hljs">{<span class="hljs-attr">"error"</span>:<span class="hljs-string">"Plan validation failed"</span>,<span class="hljs-attr">"errorMessage"</span>:<span class="hljs-string">"org.apache.calcite.runtime.CalciteContextException: From line 1, column 15 to line 1, column 38: Object 'nonexistent-datasource' not found"</span>,<span class="hljs-attr">"errorClass"</span>:<span class="hljs-literal">null</span>,<span class="hljs-attr">"host"</span>:<span class="hljs-literal">nu [...]
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="overlord-discovery"></a><a href="#overlord-discovery" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>This config is used to find the <a href="/docs/latest/design/overlord.html">Overlord</a> using Curator service discovery. Only required if you are actually running an Overlord.</p>
+<p>This config is used to find the <a href="/docs/24.0.0/design/overlord.html">Overlord</a> using Curator service discovery. Only required if you are actually running an Overlord.</p>
 <table>
 <thead>
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
@@ -823,7 +827,7 @@ This is the default Druid error response mode. To explicitly enable this strateg
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="coordinator-discovery"></a><a href="#coordinator-discovery" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
-<p>This config is used to find the <a href="/docs/latest/design/coordinator.html">Coordinator</a> using Curator service discovery. This config is used by the realtime indexing processes to get information about the segments loaded in the cluster.</p>
+<p>This config is used to find the <a href="/docs/24.0.0/design/coordinator.html">Coordinator</a> using Curator service discovery. This config is used by the realtime indexing processes to get information about the segments loaded in the cluster.</p>
 <table>
 <thead>
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
@@ -847,6 +851,15 @@ This is the default Druid error response mode. To explicitly enable this strateg
 <tr><td><code>druid.announcer.skipLoadSpec</code></td><td>Skip segment LoadSpec from segment announcements. NOTE: Enabling this will also remove the loadspec from Coordinator and Broker endpoints.</td><td>false</td></tr>
 </tbody>
 </table>
+<p>If you want to turn off the batch data segment announcer, you can add a property to skip announcing segments. <strong>You do not want to enable this config if you have any services using <code>batch</code> for <code>druid.serverview.type</code></strong></p>
+<table>
+<thead>
+<tr><th>Property</th><th>Description</th><th>Default</th></tr>
+</thead>
+<tbody>
+<tr><td><code>druid.announcer.skipSegmentAnnouncementOnZk</code></td><td>Skip announcing segments to zookeeper. Note that the batch server view will not work if this is set to true.</td><td>false</td></tr>
+</tbody>
+</table>
 <h3><a class="anchor" aria-hidden="true" id="javascript"></a><a href="#javascript" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
 <p>Druid supports dynamic runtime extension through JavaScript functions. This functionality can be configured through
 the following properties.</p>
@@ -859,7 +872,7 @@ the following properties.</p>
 </tbody>
 </table>
 <blockquote>
-<p>JavaScript-based functionality is disabled by default. Please refer to the Druid <a href="/docs/latest/development/javascript.html">JavaScript programming guide</a> for guidelines about using Druid's JavaScript functionality, including instructions on how to enable it.</p>
+<p>JavaScript-based functionality is disabled by default. Please refer to the Druid <a href="/docs/24.0.0/development/javascript.html">JavaScript programming guide</a> for guidelines about using Druid's JavaScript functionality, including instructions on how to enable it.</p>
 </blockquote>
 <h3><a class="anchor" aria-hidden="true" id="double-column-storage"></a><a href="#double-column-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
 <p>Prior to version 0.13.0, Druid's storage layer used a 32-bit float representation to store columns created by the
@@ -888,7 +901,7 @@ Support for 64-bit floating point columns was released in Druid 0.11.0, so if yo
 <tr><td><code>druid.generic.ignoreNullsForStringCardinality</code></td><td>When set to <code>true</code>, <code>null</code> values will be ignored for the built-in cardinality aggregator over string columns. Set to <code>false</code> to include <code>null</code> values while estimating cardinality of only string columns using the built-in cardinality aggregator. This setting takes effect only when <code>druid.generic.useDefaultValueForNull</code> is set to <code>true</code> and is ignore [...]
 </tbody>
 </table>
-<p>This mode does have a storage size and query performance cost, see <a href="/docs/latest/design/segments.html#sql-compatible-null-handling">segment documentation</a> for more details.</p>
+<p>This mode does have a storage size and query performance cost, see <a href="/docs/24.0.0/design/segments.html#handling-null-values">segment documentation</a> for more details.</p>
 <h3><a class="anchor" aria-hidden="true" id="http-client"></a><a href="#http-client" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <p>All Druid components can communicate with each other over HTTP.</p>
 <table>
@@ -904,10 +917,20 @@ Support for 64-bit floating point columns was released in Druid 0.11.0, so if yo
 <tr><td><code>druid.global.http.numMaxThreads</code></td><td>Maximum number of I/O worker threads</td><td><code>max(10, ((number of cores * 17) / 16 + 2) + 30)</code></td></tr>
 </tbody>
 </table>
+<h3><a class="anchor" aria-hidden="true" id="common-endpoints-configuration"></a><a href="#common-endpoints-configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 1 [...]
+<p>This section contains the configuration options for endpoints that are supported by all processes.</p>
+<table>
+<thead>
+<tr><th>Property</th><th>Description</th><th>Default</th></tr>
+</thead>
+<tbody>
+<tr><td><code>druid.server.hiddenProperties</code></td><td>If property names or substring of property names (case insensitive) is in this list, responses of the <code>/status/properties</code> endpoint do not show these properties</td><td><code>[&quot;druid.s3.accessKey&quot;,&quot;druid.s3.secretKey&quot;,&quot;druid.metadata.storage.connector.password&quot;, &quot;password&quot;, &quot;key&quot;, &quot;token&quot;, &quot;pwd&quot;]</code></td></tr>
+</tbody>
+</table>
 <h2><a class="anchor" aria-hidden="true" id="master-server"></a><a href="#master-server" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
-<p>This section contains the configuration options for the processes that reside on Master servers (Coordinators and Overlords) in the suggested <a href="/docs/latest/design/processes.html#server-types">three-server configuration</a>.</p>
+<p>This section contains the configuration options for the processes that reside on Master servers (Coordinators and Overlords) in the suggested <a href="/docs/24.0.0/design/processes.html#server-types">three-server configuration</a>.</p>
 <h3><a class="anchor" aria-hidden="true" id="coordinator"></a><a href="#coordinator" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
-<p>For general Coordinator Process information, see <a href="/docs/latest/design/coordinator.html">here</a>.</p>
+<p>For general Coordinator Process information, see <a href="/docs/24.0.0/design/coordinator.html">here</a>.</p>
 <h4><a class="anchor" aria-hidden="true" id="static-configuration"></a><a href="#static-configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
 <p>These Coordinator static configurations can be defined in the <code>coordinator/runtime.properties</code> file.</p>
 <h5><a class="anchor" aria-hidden="true" id="coordinator-process-config"></a><a href="#coordinator-process-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H [...]
@@ -919,7 +942,7 @@ Support for 64-bit floating point columns was released in Druid 0.11.0, so if yo
 <tr><td><code>druid.host</code></td><td>The host for the current process. This is used to advertise the current processes location as reachable from another process and should generally be specified such that <code>http://${druid.host}/</code> could actually talk to this process</td><td>InetAddress.getLocalHost().getCanonicalHostName()</td></tr>
 <tr><td><code>druid.bindOnHost</code></td><td>Indicating whether the process's internal jetty server bind on <code>druid.host</code>. Default is false, which means binding to all interfaces.</td><td>false</td></tr>
 <tr><td><code>druid.plaintextPort</code></td><td>This is the port to actually listen on; unless port mapping is used, this will be the same port as is on <code>druid.host</code></td><td>8081</td></tr>
-<tr><td><code>druid.tlsPort</code></td><td>TLS port for HTTPS connector, if <a href="/docs/latest/operations/tls-support.html">druid.enableTlsPort</a> is set then this config will be used. If <code>druid.host</code> contains port then that port will be ignored. This should be a non-negative Integer.</td><td>8281</td></tr>
+<tr><td><code>druid.tlsPort</code></td><td>TLS port for HTTPS connector, if <a href="/docs/24.0.0/operations/tls-support.html">druid.enableTlsPort</a> is set then this config will be used. If <code>druid.host</code> contains port then that port will be ignored. This should be a non-negative Integer.</td><td>8281</td></tr>
 <tr><td><code>druid.service</code></td><td>The name of the service. This is used as a dimension when emitting metrics and alerts to differentiate between the various services</td><td>druid/coordinator</td></tr>
 </tbody>
 </table>
@@ -934,9 +957,10 @@ Support for 64-bit floating point columns was released in Druid 0.11.0, so if yo
 <tr><td><code>druid.coordinator.startDelay</code></td><td>The operation of the Coordinator works on the assumption that it has an up-to-date view of the state of the world when it runs, the current ZK interaction code, however, is written in a way that doesn’t allow the Coordinator to know for a fact that it’s done loading the current state of the world. This delay is a hack to give it enough time to believe that it has all the data.</td><td>PT300S</td></tr>
 <tr><td><code>druid.coordinator.load.timeout</code></td><td>The timeout duration for when the Coordinator assigns a segment to a Historical process.</td><td>PT15M</td></tr>
 <tr><td><code>druid.coordinator.kill.pendingSegments.on</code></td><td>Boolean flag for whether or not the Coordinator clean up old entries in the <code>pendingSegments</code> table of metadata store. If set to true, Coordinator will check the created time of most recently complete task. If it doesn't exist, it finds the created time of the earliest running/pending/waiting tasks. Once the created time is found, then for all dataSources not in the <code>killPendingSegmentsSkipList</code>  [...]
-<tr><td><code>druid.coordinator.kill.on</code></td><td>Boolean flag for whether or not the Coordinator should submit kill task for unused segments, that is, hard delete them from metadata store and deep storage. If set to true, then for all whitelisted dataSources (or optionally all), Coordinator will submit tasks periodically based on <code>period</code> specified. These kill tasks will delete all unused segments except for the last <code>durationToRetain</code> period. A whitelist can  [...]
+<tr><td><code>druid.coordinator.kill.on</code></td><td>Boolean flag for whether or not the Coordinator should submit kill task for unused segments, that is, permanently delete them from metadata store and deep storage. If set to true, then for all whitelisted dataSources (or optionally all), Coordinator will submit tasks periodically based on <code>period</code> specified. A whitelist can be set via dynamic configuration <code>killDataSourceWhitelist</code> described later.<br /><br />Wh [...]
 <tr><td><code>druid.coordinator.kill.period</code></td><td>How often to send kill tasks to the indexing service. Value must be greater than <code>druid.coordinator.period.indexingPeriod</code>. Only applies if kill is turned on.</td><td>P1D (1 Day)</td></tr>
-<tr><td><code>druid.coordinator.kill.durationToRetain</code></td><td>Do not kill unused segments in last <code>durationToRetain</code>, must be greater or equal to 0. Only applies and MUST be specified if kill is turned on.</td><td><code>P90D</code></td></tr>
+<tr><td><code>druid.coordinator.kill.durationToRetain</code></td><td>Only applies if you set <code>druid.coordinator.kill.on</code> to <code>true</code>. This value is ignored if <code>druid.coordinator.kill.ignoreDurationToRetain</code> is <code>true</code>. Valid configurations must be a ISO8601 period. Druid will not kill unused segments whose interval end date is beyond <code>now - durationToRetain</code>. <code>durationToRetain</code> can be a negative ISO8601 period, which would re [...]
+<tr><td><code>druid.coordinator.kill.ignoreDurationToRetain</code></td><td>A way to override <code>druid.coordinator.kill.durationToRetain</code> and tell the coordinator that you do not care about the end date of unused segment intervals when it comes to killing them. If true, the coordinator considers all unused segments as eligible to be killed.</td><td>false</td></tr>
 <tr><td><code>druid.coordinator.kill.maxSegments</code></td><td>Kill at most n unused segments per kill task submission, must be greater than 0. Only applies and MUST be specified if kill is turned on.</td><td>100</td></tr>
 <tr><td><code>druid.coordinator.balancer.strategy</code></td><td>Specify the type of balancing strategy for the coordinator to use to distribute segments among the historicals. <code>cachingCost</code> is logically equivalent to <code>cost</code> but is more CPU-efficient on large clusters. <code>diskNormalized</code> weights the costs according to the servers' disk usage ratios - there are known issues with this strategy distributing segments unevenly across the cluster. <code>random</c [...]
 <tr><td><code>druid.coordinator.balancer.cachingCost.awaitInitialization</code></td><td>Whether to wait for segment view initialization before creating the <code>cachingCost</code> balancing strategy. This property is enabled only when <code>druid.coordinator.balancer.strategy</code> is <code>cachingCost</code>. If set to 'true', the Coordinator will not start to assign segments, until the segment view is initialized. If set to 'false', the Coordinator will fallback to use the <code>cost [...]
@@ -974,7 +998,7 @@ Support for 64-bit floating point columns was released in Druid 0.11.0, so if yo
 <tr><th>Property</th><th>Possible Values</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
-<tr><td><code>druid.serverview.type</code></td><td>batch or http</td><td>Segment discovery method to use. &quot;http&quot; enables discovering segments using HTTP instead of zookeeper.</td><td>batch</td></tr>
+<tr><td><code>druid.serverview.type</code></td><td>batch or http</td><td>Segment discovery method to use. &quot;http&quot; enables discovering segments using HTTP instead of ZooKeeper.</td><td>batch</td></tr>
 <tr><td><code>druid.coordinator.loadqueuepeon.type</code></td><td>curator or http</td><td>Whether to use &quot;http&quot; or &quot;curator&quot; implementation to assign segment loads/drops to historical</td><td>curator</td></tr>
 <tr><td><code>druid.coordinator.segment.awaitInitializationOnStart</code></td><td>true or false</td><td>Whether the Coordinator will wait for its view of segments to fully initialize before starting up. If set to 'true', the Coordinator's HTTP server will not start up, and the Coordinator will not announce itself as available, until the server view is initialized.</td><td>true</td></tr>
 </tbody>
@@ -1002,7 +1026,7 @@ Support for 64-bit floating point columns was released in Druid 0.11.0, so if yo
 </tbody>
 </table>
 <h4><a class="anchor" aria-hidden="true" id="dynamic-configuration"></a><a href="#dynamic-configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
-<p>The Coordinator has dynamic configuration to change certain behavior on the fly. The Coordinator uses a JSON spec object from the Druid <a href="/docs/latest/dependencies/metadata-storage.html">metadata storage</a> config table. This object is detailed below:</p>
+<p>The Coordinator has dynamic configuration to change certain behavior on the fly. The Coordinator uses a JSON spec object from the Druid <a href="/docs/24.0.0/dependencies/metadata-storage.html">metadata storage</a> config table. This object is detailed below:</p>
 <p>It is recommended that you use the Coordinator Console to configure these parameters. However, if you need to do it via HTTP, the JSON object can be submitted to the Coordinator via a POST request at:</p>
 <pre><code class="hljs">http:<span class="hljs-regexp">//</span>&lt;COORDINATOR_IP&gt;:&lt;PORT&gt;<span class="hljs-regexp">/druid/</span>coordinator<span class="hljs-regexp">/v1/</span>config
 </code></pre>
@@ -1043,7 +1067,7 @@ Support for 64-bit floating point columns was released in Druid 0.11.0, so if yo
 <tbody>
 <tr><td><code>millisToWaitBeforeDeleting</code></td><td>How long does the Coordinator need to be a leader before it can start marking overshadowed segments as unused in metadata storage.</td><td>900000 (15 mins)</td></tr>
 <tr><td><code>mergeBytesLimit</code></td><td>The maximum total uncompressed size in bytes of segments to merge.</td><td>524288000L</td></tr>
-<tr><td><code>mergeSegmentsLimit</code></td><td>The maximum number of segments that can be in a single <a href="/docs/latest/ingestion/tasks.html">append task</a>.</td><td>100</td></tr>
+<tr><td><code>mergeSegmentsLimit</code></td><td>The maximum number of segments that can be in a single <a href="/docs/24.0.0/ingestion/tasks.html">append task</a>.</td><td>100</td></tr>
 <tr><td><code>maxSegmentsToMove</code></td><td>The maximum number of segments that can be moved at any given time.</td><td>5</td></tr>
 <tr><td><code>useBatchedSegmentSampler</code></td><td>Boolean flag for whether or not we should use the Reservoir Sampling with a reservoir of size k instead of fixed size 1 to pick segments to move. This option can be enabled to speed up segment balancing process, especially if there are huge number of segments in the cluster or if there are too many segments to move.</td><td>false</td></tr>
 <tr><td><code>percentOfSegmentsToConsiderPerMove</code></td><td>Deprecated. This will eventually be phased out by the batched segment sampler. You can enable the batched segment sampler now by setting the dynamic Coordinator config, <code>useBatchedSegmentSampler</code>, to <code>true</code>. Note that if you choose to enable the batched segment sampler, <code>percentOfSegmentsToConsiderPerMove</code> will no longer have any effect on balancing. If <code>useBatchedSegmentSampler == false [...]
@@ -1069,7 +1093,7 @@ Support for 64-bit floating point columns was released in Druid 0.11.0, so if yo
 <pre><code class="hljs">http://<span class="hljs-symbol">&lt;COORDINATOR_IP&gt;</span>:<span class="hljs-symbol">&lt;PORT&gt;</span>/druid/coordinator/v1/config/<span class="hljs-keyword">history</span>?<span class="hljs-built_in">count</span>=<span class="hljs-symbol">&lt;n&gt;</span>
 </code></pre>
 <h5><a class="anchor" aria-hidden="true" id="lookups-dynamic-configuration"></a><a href="#lookups-dynamic-configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12  [...]
-<p>These configuration options control the behavior of the Lookup dynamic configuration described in the <a href="/docs/latest/querying/lookups.html">lookups page</a></p>
+<p>These configuration options control the behavior of the Lookup dynamic configuration described in the <a href="/docs/24.0.0/querying/lookups.html">lookups page</a></p>
 <table>
 <thead>
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
@@ -1083,31 +1107,30 @@ Support for 64-bit floating point columns was released in Druid 0.11.0, so if yo
 <tr><td><code>druid.manager.lookups.period</code></td><td>How many milliseconds between checks for configuration changes</td><td>30_000</td></tr>
 </tbody>
 </table>
-<h5><a class="anchor" aria-hidden="true" id="compaction-dynamic-configuration"></a><a href="#compaction-dynamic-configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13. [...]
-<p>Compaction configurations can also be set or updated dynamically using
-<a href="/docs/latest/operations/api-reference.html#compaction-configuration">Coordinator's API</a> without restarting Coordinators.</p>
-<p>For details about segment compaction, please check <a href="/docs/latest/operations/segment-optimization.html">Segment Size Optimization</a>.</p>
-<p>A description of the compaction config is:</p>
+<h5><a class="anchor" aria-hidden="true" id="automatic-compaction-dynamic-configuration"></a><a href="#automatic-compaction-dynamic-configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c [...]
+<p>You can set or update <a href="/docs/24.0.0/ingestion/automatic-compaction.html">automatic compaction</a> properties dynamically using the
+<a href="/docs/24.0.0/operations/api-reference.html#automatic-compaction-configuration">Coordinator API</a> without restarting Coordinators.</p>
+<p>For details about segment compaction, see <a href="/docs/24.0.0/operations/segment-optimization.html">Segment size optimization</a>.</p>
+<p>You can configure automatic compaction through the following properties:</p>
 <table>
 <thead>
 <tr><th>Property</th><th>Description</th><th>Required</th></tr>
 </thead>
 <tbody>
 <tr><td><code>dataSource</code></td><td>dataSource name to be compacted.</td><td>yes</td></tr>
-<tr><td><code>taskPriority</code></td><td><a href="/docs/latest/ingestion/tasks.html#priority">Priority</a> of compaction task.</td><td>no (default = 25)</td></tr>
-<tr><td><code>inputSegmentSizeBytes</code></td><td>Maximum number of total segment bytes processed per compaction task. Since a time chunk must be processed in its entirety, if the segments for a particular time chunk have a total size in bytes greater than this parameter, compaction will not run for that time chunk. Because each compaction task runs with a single thread, setting this value too far above 1–2GB will result in compaction tasks taking an excessive amount of time.</td><td>no [...]
-<tr><td><code>maxRowsPerSegment</code></td><td>Max number of rows per segment after compaction.</td><td>no</td></tr>
-<tr><td><code>skipOffsetFromLatest</code></td><td>The offset for searching segments to be compacted in <a href="https://en.wikipedia.org/wiki/ISO_8601">ISO 8601</a> duration format. Strongly recommended to set for realtime dataSources. See <a href="/docs/latest/ingestion/compaction.html#data-handling-with-compaction">Data handling with compaction</a></td><td>no (default = &quot;P1D&quot;)</td></tr>
-<tr><td><code>tuningConfig</code></td><td>Tuning config for compaction tasks. See below <a href="#automatic-compaction-tuningconfig">Compaction Task TuningConfig</a>.</td><td>no</td></tr>
-<tr><td><code>taskContext</code></td><td><a href="/docs/latest/ingestion/tasks.html#context">Task context</a> for compaction tasks.</td><td>no</td></tr>
-<tr><td><code>granularitySpec</code></td><td>Custom <code>granularitySpec</code>. See <a href="#automatic-compaction-granularityspec">Automatic compaction granularitySpec</a></td><td>No</td></tr>
-<tr><td><code>dimensionsSpec</code></td><td>Custom <code>dimensionsSpec</code>. See <a href="#automatic-compaction-dimensions-spec">Automatic compaction dimensionsSpec</a></td><td>No</td></tr>
-<tr><td><code>transformSpec</code></td><td>Custom <code>transformSpec</code>. See <a href="#automatic-compaction-transform-spec">Automatic compaction transformSpec</a></td><td>No</td></tr>
-<tr><td><code>metricsSpec</code></td><td>Custom <a href="/docs/latest/ingestion/ingestion-spec.html#metricsspec"><code>metricsSpec</code></a>. The compaction task preserves any existing metrics regardless of whether <code>metricsSpec</code> is specified. If <code>metricsSpec</code> is specified, Druid does not reapply any aggregators matching the metric names specified in <code>metricsSpec</code> to rows that already have the associated metrics. For rows that do not already have the metr [...]
-<tr><td><code>ioConfig</code></td><td>IO config for compaction tasks. See below <a href="#automatic-compaction-ioconfig">Compaction Task IOConfig</a>.</td><td>no</td></tr>
-</tbody>
-</table>
-<p>An example of compaction config is:</p>
+<tr><td><code>taskPriority</code></td><td><a href="/docs/24.0.0/ingestion/tasks.html#priority">Priority</a> of compaction task.</td><td>no (default = 25)</td></tr>
+<tr><td><code>inputSegmentSizeBytes</code></td><td>Maximum number of total segment bytes processed per compaction task. Since a time chunk must be processed in its entirety, if the segments for a particular time chunk have a total size in bytes greater than this parameter, compaction will not run for that time chunk. Because each compaction task runs with a single thread, setting this value too far above 1–2GB will result in compaction tasks taking an excessive amount of time.</td><td>no [...]
+<tr><td><code>skipOffsetFromLatest</code></td><td>The offset for searching segments to be compacted in <a href="https://en.wikipedia.org/wiki/ISO_8601">ISO 8601</a> duration format. Strongly recommended to set for realtime dataSources. See <a href="/docs/24.0.0/ingestion/compaction.html#data-handling-with-compaction">Data handling with compaction</a>.</td><td>no (default = &quot;P1D&quot;)</td></tr>
+<tr><td><code>tuningConfig</code></td><td>Tuning config for compaction tasks. See below <a href="#automatic-compaction-tuningconfig">Automatic compaction tuningConfig</a>.</td><td>no</td></tr>
+<tr><td><code>taskContext</code></td><td><a href="/docs/24.0.0/ingestion/tasks.html#context">Task context</a> for compaction tasks.</td><td>no</td></tr>
+<tr><td><code>granularitySpec</code></td><td>Custom <code>granularitySpec</code>. See <a href="#automatic-compaction-granularityspec">Automatic compaction granularitySpec</a>.</td><td>No</td></tr>
+<tr><td><code>dimensionsSpec</code></td><td>Custom <code>dimensionsSpec</code>. See <a href="#automatic-compaction-dimensionsspec">Automatic compaction dimensionsSpec</a>.</td><td>No</td></tr>
+<tr><td><code>transformSpec</code></td><td>Custom <code>transformSpec</code>. See <a href="#automatic-compaction-transformspec">Automatic compaction transformSpec</a>.</td><td>No</td></tr>
+<tr><td><code>metricsSpec</code></td><td>Custom <a href="/docs/24.0.0/ingestion/ingestion-spec.html#metricsspec"><code>metricsSpec</code></a>. The compaction task preserves any existing metrics regardless of whether <code>metricsSpec</code> is specified. If <code>metricsSpec</code> is specified, Druid does not reapply any aggregators matching the metric names specified in <code>metricsSpec</code> to rows that already have the associated metrics. For rows that do not already have the metr [...]
+<tr><td><code>ioConfig</code></td><td>IO config for compaction tasks. See <a href="#automatic-compaction-ioconfig">Automatic compaction ioConfig</a>.</td><td>no</td></tr>
+</tbody>
+</table>
+<p>Automatic compaction config example:</p>
 <pre><code class="hljs css language-json">{
   <span class="hljs-attr">"dataSource"</span>: <span class="hljs-string">"wikiticker"</span>,
   <span class="hljs-attr">"granularitySpec"</span> : {
@@ -1115,11 +1138,14 @@ Support for 64-bit floating point columns was released in Druid 0.11.0, so if yo
   }
 }
 </code></pre>
-<p>Compaction tasks fail when higher priority tasks cause Druid to revoke their locks. By default, realtime tasks like ingestion have a higher priority than compaction tasks. Therefore frequent conflicts between compaction tasks and realtime tasks can cause the coordinator's automatic compaction to get stuck.
-You may see this issue with streaming ingestion from Kafka and Kinesis, which ingest late-arriving data. To mitigate this problem, set <code>skipOffsetFromLatest</code> to a value large enough so that arriving data tends to fall outside the offset value from the current time. This way you can avoid conflicts between compaction tasks and realtime ingestion tasks.</p>
-<h6><a class="anchor" aria-hidden="true" id="automatic-compaction-tuningconfig"></a><a href="#automatic-compaction-tuningconfig" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S1 [...]
-<p>Auto compaction supports a subset of the <a href="/docs/latest/ingestion/native-batch.html#tuningconfig">tuningConfig for Parallel task</a>.
-The below is a list of the supported configurations for auto compaction.</p>
+<p>Compaction tasks fail when higher priority tasks cause Druid to revoke their locks. By default, realtime tasks like ingestion have a higher priority than compaction tasks. Frequent conflicts between compaction tasks and realtime tasks can cause the Coordinator's automatic compaction to hang.
+You may see this issue with streaming ingestion from Kafka and Kinesis, which ingest late-arriving data.</p>
+<p>To mitigate this problem, set <code>skipOffsetFromLatest</code> to a value large enough so that arriving data tends to fall outside the offset value from the current time. This way you can avoid conflicts between compaction tasks and realtime ingestion tasks.
+For example, if you want to skip over segments from thirty days prior to the end time of the most recent segment, assign <code>&quot;skipOffsetFromLatest&quot;: &quot;P30D&quot;</code>.
+For more information, see <a href="/docs/24.0.0/ingestion/automatic-compaction.html#avoid-conflicts-with-ingestion">Avoid conflicts with ingestion</a>.</p>
+<h6><a class="anchor" aria-hidden="true" id="automatic-compaction-tuningconfig"></a><a href="#automatic-compaction-tuningconfig" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S1 [...]
+<p>Auto-compaction supports a subset of the <a href="/docs/24.0.0/ingestion/native-batch.html#tuningconfig">tuningConfig for Parallel task</a>.
+The below is a list of the supported configurations for auto-compaction.</p>
 <table>
 <thead>
 <tr><th>Property</th><th>Description</th><th>Required</th></tr>
@@ -1128,14 +1154,14 @@ The below is a list of the supported configurations for auto compaction.</p>
 <tr><td>type</td><td>The task type, this should always be <code>index_parallel</code>.</td><td>yes</td></tr>
 <tr><td><code>maxRowsInMemory</code></td><td>Used in determining when intermediate persists to disk should occur. Normally user does not need to set this, but depending on the nature of data, if rows are short in terms of bytes, user may not want to store a million rows in memory and this value should be set.</td><td>no (default = 1000000)</td></tr>
 <tr><td><code>maxBytesInMemory</code></td><td>Used in determining when intermediate persists to disk should occur. Normally this is computed internally and user does not need to set it. This value represents number of bytes to aggregate in heap memory before persisting. This is based on a rough estimate of memory usage and not actual usage. The maximum heap memory usage for indexing is <code>maxBytesInMemory</code> * (2 + <code>maxPendingPersists</code>)</td><td>no (default = 1/6 of max  [...]
-<tr><td><code>splitHintSpec</code></td><td>Used to give a hint to control the amount of data that each first phase task reads. This hint could be ignored depending on the implementation of the input source. See <a href="/docs/latest/ingestion/native-batch.html#split-hint-spec">Split hint spec</a> for more details.</td><td>no (default = size-based split hint spec)</td></tr>
-<tr><td><code>partitionsSpec</code></td><td>Defines how to partition data in each time chunk, see <a href="/docs/latest/ingestion/native-batch.html#partitionsspec"><code>PartitionsSpec</code></a></td><td>no (default = <code>dynamic</code>)</td></tr>
-<tr><td><code>indexSpec</code></td><td>Defines segment storage format options to be used at indexing time, see <a href="/docs/latest/ingestion/ingestion-spec.html#indexspec">IndexSpec</a></td><td>no</td></tr>
-<tr><td><code>indexSpecForIntermediatePersists</code></td><td>Defines segment storage format options to be used at indexing time for intermediate persisted temporary segments. this can be used to disable dimension/metric compression on intermediate segments to reduce memory required for final merging. however, disabling compression on intermediate segments might increase page cache use while they are used before getting merged into final segment published, see <a href="/docs/latest/inges [...]
+<tr><td><code>splitHintSpec</code></td><td>Used to give a hint to control the amount of data that each first phase task reads. This hint could be ignored depending on the implementation of the input source. See <a href="/docs/24.0.0/ingestion/native-batch.html#split-hint-spec">Split hint spec</a> for more details.</td><td>no (default = size-based split hint spec)</td></tr>
+<tr><td><code>partitionsSpec</code></td><td>Defines how to partition data in each time chunk, see <a href="/docs/24.0.0/ingestion/native-batch.html#partitionsspec"><code>PartitionsSpec</code></a></td><td>no (default = <code>dynamic</code>)</td></tr>
+<tr><td><code>indexSpec</code></td><td>Defines segment storage format options to be used at indexing time, see <a href="/docs/24.0.0/ingestion/ingestion-spec.html#indexspec">IndexSpec</a></td><td>no</td></tr>
+<tr><td><code>indexSpecForIntermediatePersists</code></td><td>Defines segment storage format options to be used at indexing time for intermediate persisted temporary segments. this can be used to disable dimension/metric compression on intermediate segments to reduce memory required for final merging. however, disabling compression on intermediate segments might increase page cache use while they are used before getting merged into final segment published, see <a href="/docs/24.0.0/inges [...]
 <tr><td><code>maxPendingPersists</code></td><td>Maximum number of persists that can be pending but not started. If this limit would be exceeded by a new intermediate persist, ingestion will block until the currently-running persist finishes. Maximum heap memory usage for indexing scales with <code>maxRowsInMemory</code> * (2 + <code>maxPendingPersists</code>).</td><td>no (default = 0, meaning one persist can be running concurrently with ingestion, and none can be queued up)</td></tr>
 <tr><td><code>pushTimeout</code></td><td>Milliseconds to wait for pushing segments. It must be &gt;= 0, where 0 means to wait forever.</td><td>no (default = 0)</td></tr>
-<tr><td><code>segmentWriteOutMediumFactory</code></td><td>Segment write-out medium to use when creating segments. See <a href="/docs/latest/ingestion/native-batch-simple-task.html#segmentwriteoutmediumfactory">SegmentWriteOutMediumFactory</a>.</td><td>no (default is the value from <code>druid.peon.defaultSegmentWriteOutMediumFactory.type</code> is used)</td></tr>
-<tr><td><code>maxNumConcurrentSubTasks</code></td><td>Maximum number of worker tasks which can be run in parallel at the same time. The supervisor task would spawn worker tasks up to <code>maxNumConcurrentSubTasks</code> regardless of the current available task slots. If this value is set to 1, the supervisor task processes data ingestion on its own instead of spawning worker tasks. If this value is set to too large, too many worker tasks can be created which might block other ingestion. [...]
+<tr><td><code>segmentWriteOutMediumFactory</code></td><td>Segment write-out medium to use when creating segments. See <a href="/docs/24.0.0/ingestion/native-batch-simple-task.html#segmentwriteoutmediumfactory">SegmentWriteOutMediumFactory</a>.</td><td>no (default is the value from <code>druid.peon.defaultSegmentWriteOutMediumFactory.type</code> is used)</td></tr>
+<tr><td><code>maxNumConcurrentSubTasks</code></td><td>Maximum number of worker tasks which can be run in parallel at the same time. The supervisor task would spawn worker tasks up to <code>maxNumConcurrentSubTasks</code> regardless of the current available task slots. If this value is set to 1, the supervisor task processes data ingestion on its own instead of spawning worker tasks. If this value is set to too large, too many worker tasks can be created which might block other ingestion. [...]
 <tr><td><code>maxRetry</code></td><td>Maximum number of retries on task failures.</td><td>no (default = 3)</td></tr>
 <tr><td><code>maxNumSegmentsToMerge</code></td><td>Max limit for the number of segments that a single task can merge at the same time in the second phase. Used only with <code>hashed</code> or <code>single_dim</code> partitionsSpec.</td><td>no (default = 100)</td></tr>
 <tr><td><code>totalNumMergeTasks</code></td><td>Total number of tasks to merge segments in the merge phase when <code>partitionsSpec</code> is set to <code>hashed</code> or <code>single_dim</code>.</td><td>no (default = 10)</td></tr>
@@ -1150,12 +1176,12 @@ The below is a list of the supported configurations for auto compaction.</p>
 <tr><th>Field</th><th>Description</th><th>Required</th></tr>
 </thead>
 <tbody>
-<tr><td><code>segmentGranularity</code></td><td>Time chunking period for the segment granularity. Defaults to 'null', which preserves the original segment granularity. Accepts all <a href="/docs/latest/querying/granularities.html">Query granularity</a> values.</td><td>No</td></tr>
-<tr><td><code>queryGranularity</code></td><td>The resolution of timestamp storage within each segment. Defaults to 'null', which preserves the original query granularity. Accepts all <a href="/docs/latest/querying/granularities.html">Query granularity</a> values.</td><td>No</td></tr>
+<tr><td><code>segmentGranularity</code></td><td>Time chunking period for the segment granularity. Defaults to 'null', which preserves the original segment granularity. Accepts all <a href="/docs/24.0.0/querying/granularities.html">Query granularity</a> values.</td><td>No</td></tr>
+<tr><td><code>queryGranularity</code></td><td>The resolution of timestamp storage within each segment. Defaults to 'null', which preserves the original query granularity. Accepts all <a href="/docs/24.0.0/querying/granularities.html">Query granularity</a> values.</td><td>No</td></tr>
 <tr><td><code>rollup</code></td><td>Whether to enable ingestion-time rollup or not. Defaults to 'null', which preserves the original setting. Note that once data is rollup, individual records can no longer be recovered.</td><td>No</td></tr>
 </tbody>
 </table>
-<h6><a class="anchor" aria-hidden="true" id="automatic-compaction-dimensions-spec"></a><a href="#automatic-compaction-dimensions-spec" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 [...]
+<h6><a class="anchor" aria-hidden="true" id="automatic-compaction-dimensionsspec"></a><a href="#automatic-compaction-dimensionsspec" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2 [...]
 <table>
 <thead>
 <tr><th>Field</th><th>Description</th><th>Required</th></tr>
@@ -1164,18 +1190,18 @@ The below is a list of the supported configurations for auto compaction.</p>
 <tr><td><code>dimensions</code></td><td>A list of dimension names or objects. Defaults to 'null', which preserves the original dimensions. Note that setting this will cause segments manually compacted with <code>dimensionExclusions</code> to be compacted again.</td><td>No</td></tr>
 </tbody>
 </table>
-<h6><a class="anchor" aria-hidden="true" id="automatic-compaction-transform-spec"></a><a href="#automatic-compaction-transform-spec" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2 [...]
+<h6><a class="anchor" aria-hidden="true" id="automatic-compaction-transformspec"></a><a href="#automatic-compaction-transformspec" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
 <table>
 <thead>
 <tr><th>Field</th><th>Description</th><th>Required</th></tr>
 </thead>
 <tbody>
-<tr><td><code>filter</code></td><td>The <code>filter</code> conditionally filters input rows during compaction. Only rows that pass the filter will be included in the compacted segments. Any of Druid's standard <a href="/docs/latest/querying/filters.html">query filters</a> can be used. Defaults to 'null', which will not filter any row.</td><td>No</td></tr>
+<tr><td><code>filter</code></td><td>The <code>filter</code> conditionally filters input rows during compaction. Only rows that pass the filter will be included in the compacted segments. Any of Druid's standard <a href="/docs/24.0.0/querying/filters.html">query filters</a> can be used. Defaults to 'null', which will not filter any row.</td><td>No</td></tr>
 </tbody>
 </table>
-<h6><a class="anchor" aria-hidden="true" id="automatic-compaction-ioconfig"></a><a href="#automatic-compaction-ioconfig" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12  [...]
-<p>Auto compaction supports a subset of the <a href="/docs/latest/ingestion/native-batch.html">IOConfig for Parallel task</a>.
-The below is a list of the supported configurations for auto compaction.</p>
+<h6><a class="anchor" aria-hidden="true" id="automatic-compaction-ioconfig"></a><a href="#automatic-compaction-ioconfig" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12  [...]
+<p>Auto-compaction supports a subset of the <a href="/docs/24.0.0/ingestion/native-batch.html">ioConfig for Parallel task</a>.
+The below is a list of the supported configurations for auto-compaction.</p>
 <table>
 <thead>
 <tr><th>Property</th><th>Description</th><th>Default</th><th>Required</th></tr>
@@ -1185,7 +1211,7 @@ The below is a list of the supported configurations for auto compaction.</p>
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="overlord"></a><a href="#overlord" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>For general Overlord Process information, see <a href="/docs/latest/design/overlord.html">here</a>.</p>
+<p>For general Overlord Process information, see <a href="/docs/24.0.0/design/overlord.html">here</a>.</p>
 <h4><a class="anchor" aria-hidden="true" id="overlord-static-configuration"></a><a href="#overlord-static-configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12  [...]
 <p>These Overlord static configurations can be defined in the <code>overlord/runtime.properties</code> file.</p>
 <h5><a class="anchor" aria-hidden="true" id="overlord-process-configs"></a><a href="#overlord-process-configs" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
@@ -1197,7 +1223,7 @@ The below is a list of the supported configurations for auto compaction.</p>
 <tr><td><code>druid.host</code></td><td>The host for the current process. This is used to advertise the current processes location as reachable from another process and should generally be specified such that <code>http://${druid.host}/</code> could actually talk to this process</td><td>InetAddress.getLocalHost().getCanonicalHostName()</td></tr>
 <tr><td><code>druid.bindOnHost</code></td><td>Indicating whether the process's internal jetty server bind on <code>druid.host</code>. Default is false, which means binding to all interfaces.</td><td>false</td></tr>
 <tr><td><code>druid.plaintextPort</code></td><td>This is the port to actually listen on; unless port mapping is used, this will be the same port as is on <code>druid.host</code></td><td>8090</td></tr>
-<tr><td><code>druid.tlsPort</code></td><td>TLS port for HTTPS connector, if <a href="/docs/latest/operations/tls-support.html">druid.enableTlsPort</a> is set then this config will be used. If <code>druid.host</code> contains port then that port will be ignored. This should be a non-negative Integer.</td><td>8290</td></tr>
+<tr><td><code>druid.tlsPort</code></td><td>TLS port for HTTPS connector, if <a href="/docs/24.0.0/operations/tls-support.html">druid.enableTlsPort</a> is set then this config will be used. If <code>druid.host</code> contains port then that port will be ignored. This should be a non-negative Integer.</td><td>8290</td></tr>
 <tr><td><code>druid.service</code></td><td>The name of the service. This is used as a dimension when emitting metrics and alerts to differentiate between the various services</td><td>druid/overlord</td></tr>
 </tbody>
 </table>
@@ -1207,10 +1233,10 @@ The below is a list of the supported configurations for auto compaction.</p>
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
-<tr><td><code>druid.indexer.runner.type</code></td><td>Choices &quot;local&quot; or &quot;remote&quot;. Indicates whether tasks should be run locally or in a distributed environment. Experimental task runner &quot;httpRemote&quot; is also available which is same as &quot;remote&quot; but uses HTTP to interact with Middle Managers instead of Zookeeper.</td><td>local</td></tr>
+<tr><td><code>druid.indexer.runner.type</code></td><td>Choices &quot;local&quot; or &quot;remote&quot;. Indicates whether tasks should be run locally or in a distributed environment. Experimental task runner &quot;httpRemote&quot; is also available which is same as &quot;remote&quot; but uses HTTP to interact with Middle Managers instead of ZooKeeper.</td><td>local</td></tr>
 <tr><td><code>druid.indexer.storage.type</code></td><td>Choices are &quot;local&quot; or &quot;metadata&quot;. Indicates whether incoming tasks should be stored locally (in heap) or in metadata storage. &quot;local&quot; is mainly for internal testing while &quot;metadata&quot; is recommended in production because storing incoming tasks in metadata storage allows for tasks to be resumed if the Overlord should fail.</td><td>local</td></tr>
 <tr><td><code>druid.indexer.storage.recentlyFinishedThreshold</code></td><td>Duration of time to store task results. Default is 24 hours. If you have hundreds of tasks running in a day, consider increasing this threshold.</td><td>PT24H</td></tr>
-<tr><td><code>druid.indexer.tasklock.forceTimeChunkLock</code></td><td><em><strong>Setting this to false is still experimental</strong></em><br/> If set, all tasks are enforced to use time chunk lock. If not set, each task automatically chooses a lock type to use. This configuration can be overwritten by setting <code>forceTimeChunkLock</code> in the <a href="/docs/latest/ingestion/tasks.html#context">task context</a>. See <a href="/docs/latest/ingestion/tasks.html#context">Task Locking  [...]
+<tr><td><code>druid.indexer.tasklock.forceTimeChunkLock</code></td><td><em><strong>Setting this to false is still experimental</strong></em><br/> If set, all tasks are enforced to use time chunk lock. If not set, each task automatically chooses a lock type to use. This configuration can be overwritten by setting <code>forceTimeChunkLock</code> in the <a href="/docs/24.0.0/ingestion/tasks.html#context">task context</a>. See <a href="/docs/24.0.0/ingestion/tasks.html#context">Task Locking  [...]
 <tr><td><code>druid.indexer.task.default.context</code></td><td>Default task context that is applied to all tasks submitted to the Overlord. Any default in this config does not override neither the context values the user provides nor <code>druid.indexer.tasklock.forceTimeChunkLock</code>.</td><td>empty context</td></tr>
 <tr><td><code>druid.indexer.queue.maxSize</code></td><td>Maximum number of active tasks at one time.</td><td>Integer.MAX_VALUE</td></tr>
 <tr><td><code>druid.indexer.queue.startDelay</code></td><td>Sleep this long before starting Overlord queue management. This can be useful to give a cluster time to re-orient itself after e.g. a widespread network issue.</td><td>PT1M</td></tr>
@@ -1218,18 +1244,18 @@ The below is a list of the supported configurations for auto compaction.</p>
 <tr><td><code>druid.indexer.queue.storageSyncRate</code></td><td>Sync Overlord state this often with an underlying task persistence mechanism.</td><td>PT1M</td></tr>
 </tbody>
 </table>
-<p>The following configs only apply if the Overlord is running in remote mode. For a description of local vs. remote mode, see <a href="/docs/latest/design/overlord.html">Overlord Process</a>.</p>
+<p>The following configs only apply if the Overlord is running in remote mode. For a description of local vs. remote mode, see <a href="/docs/24.0.0/design/overlord.html">Overlord Process</a>.</p>
 <table>
 <thead>
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
 <tr><td><code>druid.indexer.runner.taskAssignmentTimeout</code></td><td>How long to wait after a task as been assigned to a MiddleManager before throwing an error.</td><td>PT5M</td></tr>
-<tr><td><code>druid.indexer.runner.minWorkerVersion</code></td><td>The minimum MiddleManager version to send tasks to.</td><td>&quot;0&quot;</td></tr>
+<tr><td><code>druid.indexer.runner.minWorkerVersion</code></td><td>The minimum MiddleManager version to send tasks to. The version number is a string. This affects the expected behavior during certain operations like comparison against <code>druid.worker.version</code>. Specifically, the version comparison follows dictionary order. Use ISO8601 date format for the version to accommodate date comparisons.</td><td>&quot;0&quot;</td></tr>
 <tr><td><code>druid.indexer.runner.parallelIndexTaskSlotRatio</code></td><td>The ratio of task slots available for parallel indexing supervisor tasks per worker. The specified value must be in the range [0, 1].</td><td>1</td></tr>
 <tr><td><code>druid.indexer.runner.compressZnodes</code></td><td>Indicates whether or not the Overlord should expect MiddleManagers to compress Znodes.</td><td>true</td></tr>
-<tr><td><code>druid.indexer.runner.maxZnodeBytes</code></td><td>The maximum size Znode in bytes that can be created in Zookeeper, should be in the range of [10KiB, 2GiB). <a href="/docs/latest/configuration/human-readable-byte.html">Human-readable format</a> is supported.</td><td>512 KiB</td></tr>
-<tr><td><code>druid.indexer.runner.taskCleanupTimeout</code></td><td>How long to wait before failing a task after a MiddleManager is disconnected from Zookeeper.</td><td>PT15M</td></tr>
+<tr><td><code>druid.indexer.runner.maxZnodeBytes</code></td><td>The maximum size Znode in bytes that can be created in ZooKeeper, should be in the range of [10KiB, 2GiB). <a href="/docs/24.0.0/configuration/human-readable-byte.html">Human-readable format</a> is supported.</td><td>512 KiB</td></tr>
+<tr><td><code>druid.indexer.runner.taskCleanupTimeout</code></td><td>How long to wait before failing a task after a MiddleManager is disconnected from ZooKeeper.</td><td>PT15M</td></tr>
 <tr><td><code>druid.indexer.runner.taskShutdownLinkTimeout</code></td><td>How long to wait on a shutdown request to a MiddleManager before timing out</td><td>PT1M</td></tr>
 <tr><td><code>druid.indexer.runner.pendingTasksRunnerNumThreads</code></td><td>Number of threads to allocate pending-tasks to workers, must be at least 1.</td><td>1</td></tr>
 <tr><td><code>druid.indexer.runner.maxRetriesBeforeBlacklist</code></td><td>Number of consecutive times the MiddleManager can fail tasks,  before the worker is blacklisted, must be at least 1</td><td>5</td></tr>
@@ -1435,7 +1461,7 @@ its better to write a druid extension module with extending current worker selec
 }
 </code></pre>
 <blockquote>
-<p>JavaScript-based functionality is disabled by default. Please refer to the Druid <a href="/docs/latest/development/javascript.html">JavaScript programming guide</a> for guidelines about using Druid's JavaScript functionality, including instructions on how to enable it.</p>
+<p>JavaScript-based functionality is disabled by default. Please refer to the Druid <a href="/docs/24.0.0/development/javascript.html">JavaScript programming guide</a> for guidelines about using Druid's JavaScript functionality, including instructions on how to enable it.</p>
 </blockquote>
 <h6><a class="anchor" aria-hidden="true" id="affinity"></a><a href="#affinity" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
 <p>Use the <code>affinityConfig</code> field to pass affinity configuration to the <em>equalDistribution</em> and <em>fillCapacity</em> strategies. If not provided, the default is to not use affinity at all.</p>
@@ -1485,10 +1511,10 @@ field. If not provided, the default is to not use it at all.</p>
 <tr><td><code>userData</code></td><td>A JSON object that describes how to configure new nodes. If you have set druid.indexer.autoscale.workerVersion, this must have a versionReplacementString. Otherwise, a versionReplacementString is not necessary.</td><td>none; optional</td></tr>
 </tbody>
 </table>
-<p>For GCE's properties, please refer to the <a href="/docs/latest/development/extensions-contrib/gce-extensions.html">gce-extensions</a>.</p>
+<p>For GCE's properties, please refer to the <a href="/docs/24.0.0/development/extensions-contrib/gce-extensions.html">gce-extensions</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="data-server"></a><a href="#data-server" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
-<p>This section contains the configuration options for the processes that reside on Data servers (MiddleManagers/Peons and Historicals) in the suggested <a href="/docs/latest/design/processes.html#server-types">three-server configuration</a>.</p>
-<p>Configuration options for the experimental <a href="/docs/latest/design/indexer.html">Indexer process</a> are also provided here.</p>
+<p>This section contains the configuration options for the processes that reside on Data servers (MiddleManagers/Peons and Historicals) in the suggested <a href="/docs/24.0.0/design/processes.html#server-types">three-server configuration</a>.</p>
+<p>Configuration options for the experimental <a href="/docs/24.0.0/design/indexer.html">Indexer process</a> are also provided here.</p>
 <h3><a class="anchor" aria-hidden="true" id="middlemanager-and-peons"></a><a href="#middlemanager-and-peons" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
 <p>These MiddleManager and Peon configurations can be defined in the <code>middleManager/runtime.properties</code> file.</p>
 <h4><a class="anchor" aria-hidden="true" id="middlemanager-process-config"></a><a href="#middlemanager-process-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 [...]
@@ -1500,7 +1526,7 @@ field. If not provided, the default is to not use it at all.</p>
 <tr><td><code>druid.host</code></td><td>The host for the current process. This is used to advertise the current processes location as reachable from another process and should generally be specified such that <code>http://${druid.host}/</code> could actually talk to this process</td><td>InetAddress.getLocalHost().getCanonicalHostName()</td></tr>
 <tr><td><code>druid.bindOnHost</code></td><td>Indicating whether the process's internal jetty server bind on <code>druid.host</code>. Default is false, which means binding to all interfaces.</td><td>false</td></tr>
 <tr><td><code>druid.plaintextPort</code></td><td>This is the port to actually listen on; unless port mapping is used, this will be the same port as is on <code>druid.host</code></td><td>8091</td></tr>
-<tr><td><code>druid.tlsPort</code></td><td>TLS port for HTTPS connector, if <a href="/docs/latest/operations/tls-support.html">druid.enableTlsPort</a> is set then this config will be used. If <code>druid.host</code> contains port then that port will be ignored. This should be a non-negative Integer.</td><td>8291</td></tr>
+<tr><td><code>druid.tlsPort</code></td><td>TLS port for HTTPS connector, if <a href="/docs/24.0.0/operations/tls-support.html">druid.enableTlsPort</a> is set then this config will be used. If <code>druid.host</code> contains port then that port will be ignored. This should be a non-negative Integer.</td><td>8291</td></tr>
 <tr><td><code>druid.service</code></td><td>The name of the service. This is used as a dimension when emitting metrics and alerts to differentiate between the various services</td><td>druid/middlemanager</td></tr>
 </tbody>
 </table>
@@ -1516,13 +1542,13 @@ field. If not provided, the default is to not use it at all.</p>
 <tr><td><code>druid.indexer.runner.classpath</code></td><td>Java classpath for the peon.</td><td>System.getProperty(&quot;java.class.path&quot;)</td></tr>
 <tr><td><code>druid.indexer.runner.javaCommand</code></td><td>Command required to execute java.</td><td>java</td></tr>
 <tr><td><code>druid.indexer.runner.javaOpts</code></td><td><em>DEPRECATED</em> A string of -X Java options to pass to the peon's JVM. Quotable parameters or parameters with spaces are encouraged to use javaOptsArray</td><td>&quot;&quot;</td></tr>
-<tr><td><code>druid.indexer.runner.javaOptsArray</code></td><td>A JSON array of strings to be passed in as options to the peon's JVM. This is additive to javaOpts and is recommended for properly handling arguments which contain quotes or spaces like <code>[&quot;-XX:OnOutOfMemoryError=kill -9 %p&quot;]</code></td><td><code>[]</code></td></tr>
-<tr><td><code>druid.indexer.runner.maxZnodeBytes</code></td><td>The maximum size Znode in bytes that can be created in Zookeeper, should be in the range of [10KiB, 2GiB). <a href="/docs/latest/configuration/human-readable-byte.html">Human-readable format</a> is supported.</td><td>512KiB</td></tr>
+<tr><td><code>druid.indexer.runner.javaOptsArray</code></td><td>A JSON array of strings to be passed in as options to the peon's JVM. This is additive to <code>druid.indexer.runner.javaOpts</code> and is recommended for properly handling arguments which contain quotes or spaces like <code>[&quot;-XX:OnOutOfMemoryError=kill -9 %p&quot;]</code></td><td><code>[]</code></td></tr>
+<tr><td><code>druid.indexer.runner.maxZnodeBytes</code></td><td>The maximum size Znode in bytes that can be created in ZooKeeper, should be in the range of [10KiB, 2GiB). <a href="/docs/24.0.0/configuration/human-readable-byte.html">Human-readable format</a> is supported.</td><td>512KiB</td></tr>
 <tr><td><code>druid.indexer.runner.startPort</code></td><td>Starting port used for peon processes, should be greater than 1023 and less than 65536.</td><td>8100</td></tr>
 <tr><td><code>druid.indexer.runner.endPort</code></td><td>Ending port used for peon processes, should be greater than or equal to <code>druid.indexer.runner.startPort</code> and less than 65536.</td><td>65535</td></tr>
 <tr><td><code>druid.indexer.runner.ports</code></td><td>A JSON array of integers to specify ports that used for peon processes. If provided and non-empty, ports for peon processes will be chosen from these ports. And <code>druid.indexer.runner.startPort/druid.indexer.runner.endPort</code> will be completely ignored.</td><td><code>[]</code></td></tr>
 <tr><td><code>druid.worker.ip</code></td><td>The IP of the worker.</td><td>localhost</td></tr>
-<tr><td><code>druid.worker.version</code></td><td>Version identifier for the MiddleManager.</td><td>0</td></tr>
+<tr><td><code>druid.worker.version</code></td><td>Version identifier for the MiddleManager. The version number is a string. This affects the expected behavior during certain operations like comparison against <code>druid.indexer.runner.minWorkerVersion</code>. Specifically, the version comparison follows dictionary order. Use ISO8601 date format for the version to accommodate date comparisons.</td><td>0</td></tr>
 <tr><td><code>druid.worker.capacity</code></td><td>Maximum number of tasks the MiddleManager can accept.</td><td>Number of CPUs on the machine - 1</td></tr>
 <tr><td><code>druid.worker.category</code></td><td>A string to name the category that the MiddleManager node belongs to.</td><td><code>_default_worker_category</code></td></tr>
 </tbody>
@@ -1534,13 +1560,13 @@ field. If not provided, the default is to not use it at all.</p>
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
-<tr><td><code>druid.processing.buffer.sizeBytes</code></td><td>This specifies a buffer size (less than 2GiB) for the storage of intermediate results. The computation engine in both the Historical and Realtime processes will use a scratch buffer of this size to do all of their intermediate computations off-heap. Larger values allow for more aggregations in a single pass over the data while smaller values can require more passes depending on the query that is being executed. <a href="/docs [...]
+<tr><td><code>druid.processing.buffer.sizeBytes</code></td><td>This specifies a buffer size (less than 2GiB) for the storage of intermediate results. The computation engine in both the Historical and Realtime processes will use a scratch buffer of this size to do all of their intermediate computations off-heap. Larger values allow for more aggregations in a single pass over the data while smaller values can require more passes depending on the query that is being executed. <a href="/docs [...]
 <tr><td><code>druid.processing.buffer.poolCacheMaxCount</code></td><td>processing buffer pool caches the buffers for later use, this is the maximum count cache will grow to. note that pool can create more buffers than it can cache if necessary.</td><td>Integer.MAX_VALUE</td></tr>
 <tr><td><code>druid.processing.formatString</code></td><td>Realtime and Historical processes use this format string to name their processing threads.</td><td>processing-%s</td></tr>
 <tr><td><code>druid.processing.numMergeBuffers</code></td><td>The number of direct memory buffers available for merging query results. The buffers are sized by <code>druid.processing.buffer.sizeBytes</code>. This property is effectively a concurrency limit for queries that require merging buffers. If you are using any queries that require merge buffers (currently, just groupBy v2) then you should have at least two of these.</td><td><code>max(2, druid.processing.numThreads / 4)</code></td></tr>
 <tr><td><code>druid.processing.numThreads</code></td><td>The number of processing threads to have available for parallel processing of segments. Our rule of thumb is <code>num_cores - 1</code>, which means that even under heavy load there will still be one core available to do background tasks like talking with ZooKeeper and pulling down segments. If only one core is available, this property defaults to the value <code>1</code>.</td><td>Number of cores - 1 (or 1)</td></tr>
 <tr><td><code>druid.processing.columnCache.sizeBytes</code></td><td>Maximum size in bytes for the dimension value lookup cache. Any value greater than <code>0</code> enables the cache. It is currently disabled by default. Enabling the lookup cache can significantly improve the performance of aggregators operating on dimension values, such as the JavaScript aggregator, or cardinality aggregator, but can slow things down if the cache hit rate is low (i.e. dimensions with few repeating valu [...]
-<tr><td><code>druid.processing.fifo</code></td><td>If the processing queue should treat tasks of equal priority in a FIFO manner</td><td><code>false</code></td></tr>
+<tr><td><code>druid.processing.fifo</code></td><td>If the processing queue should treat tasks of equal priority in a FIFO manner</td><td><code>true</code></td></tr>
 <tr><td><code>druid.processing.tmpDir</code></td><td>Path where temporary files created while processing a query should be stored. If specified, this configuration takes priority over the default <code>java.io.tmpdir</code> path.</td><td>path represented by <code>java.io.tmpdir</code></td></tr>
 <tr><td><code>druid.processing.intermediaryData.storage.type</code></td><td>Storage type for storing intermediary segments of data shuffle between native parallel index tasks. Current choices are &quot;local&quot; which stores segment files in local storage of Middle Managers (or Indexer) or &quot;deepstore&quot; which uses configured deep storage. Note - With &quot;deepstore&quot; type data is stored in <code>shuffle-data</code> directory under the configured deep storage path, auto cle [...]
 </tbody>
@@ -1585,8 +1611,8 @@ ensure at least this amount of direct memory is available by providing <code>-XX
 <tr><td><code>druid.indexer.task.gracefulShutdownTimeout</code></td><td>Wait this long on middleManager restart for restorable tasks to gracefully exit.</td><td>PT5M</td></tr>
 <tr><td><code>druid.indexer.task.hadoopWorkingPath</code></td><td>Temporary working directory for Hadoop tasks.</td><td><code>/tmp/druid-indexing</code></td></tr>
 <tr><td><code>druid.indexer.task.restoreTasksOnRestart</code></td><td>If true, MiddleManagers will attempt to stop tasks gracefully on shutdown and restore them on restart.</td><td>false</td></tr>
-<tr><td><code>druid.indexer.task.ignoreTimestampSpecForDruidInputSource</code></td><td>If true, tasks using the <a href="/docs/latest/ingestion/native-batch-input-sources.html">Druid input source</a> will ignore the provided timestampSpec, and will use the <code>__time</code> column of the input datasource. This option is provided for compatibility with ingestion specs written before Druid 0.22.0.</td><td>false</td></tr>
-<tr><td><code>druid.indexer.task.storeEmptyColumns</code></td><td>Boolean value for whether or not to store empty columns during ingestion. When set to true, Druid stores every column specified in the <a href="/docs/latest/ingestion/ingestion-spec.html#dimensionsspec"><code>dimensionsSpec</code></a>. If you use schemaless ingestion and don't specify any dimensions to ingest, you must also set <a href="/docs/latest/ingestion/ingestion-spec.html#dimensionsspec"><code>includeAllDimensions</ [...]
+<tr><td><code>druid.indexer.task.ignoreTimestampSpecForDruidInputSource</code></td><td>If true, tasks using the <a href="/docs/24.0.0/ingestion/native-batch-input-sources.html">Druid input source</a> will ignore the provided timestampSpec, and will use the <code>__time</code> column of the input datasource. This option is provided for compatibility with ingestion specs written before Druid 0.22.0.</td><td>false</td></tr>
+<tr><td><code>druid.indexer.task.storeEmptyColumns</code></td><td>Boolean value for whether or not to store empty columns during ingestion. When set to true, Druid stores every column specified in the <a href="/docs/24.0.0/ingestion/ingestion-spec.html#dimensionsspec"><code>dimensionsSpec</code></a>. If you use schemaless ingestion and don't specify any dimensions to ingest, you must also set <a href="/docs/24.0.0/ingestion/ingestion-spec.html#dimensionsspec"><code>includeAllDimensions</ [...]
 <tr><td><code>druid.indexer.server.maxChatRequests</code></td><td>Maximum number of concurrent requests served by a task's chat handler. Set to 0 to disable limiting.</td><td>0</td></tr>
 </tbody>
 </table>
@@ -1616,7 +1642,7 @@ than the configured maximum <em>heap</em> size (<code>-Xmx</code>) for the same
 Using on-heap memory introduces garbage collection overhead and so is not recommended in most cases. This type of medium is
 most helpful for tasks run on external clusters where it may be difficult to allocate and work with direct memory
 effectively.</p>
-<p>For most types of tasks SegmentWriteOutMediumFactory could be configured per-task (see <a href="/docs/latest/ingestion/tasks.html">Tasks</a>
+<p>For most types of tasks SegmentWriteOutMediumFactory could be configured per-task (see <a href="/docs/24.0.0/ingestion/tasks.html">Tasks</a>
 page, &quot;TuningConfig&quot; section), but if it's not specified for a task, or it's not supported for a particular task type,
 then the value from the configuration below is used:</p>
 <table>
@@ -1637,7 +1663,7 @@ then the value from the configuration below is used:</p>
 <tr><td><code>druid.host</code></td><td>The host for the current process. This is used to advertise the current processes location as reachable from another process and should generally be specified such that <code>http://${druid.host}/</code> could actually talk to this process</td><td>InetAddress.getLocalHost().getCanonicalHostName()</td></tr>
 <tr><td><code>druid.bindOnHost</code></td><td>Indicating whether the process's internal jetty server bind on <code>druid.host</code>. Default is false, which means binding to all interfaces.</td><td>false</td></tr>
 <tr><td><code>druid.plaintextPort</code></td><td>This is the port to actually listen on; unless port mapping is used, this will be the same port as is on <code>druid.host</code></td><td>8091</td></tr>
-<tr><td><code>druid.tlsPort</code></td><td>TLS port for HTTPS connector, if <a href="/docs/latest/operations/tls-support.html">druid.enableTlsPort</a> is set then this config will be used. If <code>druid.host</code> contains port then that port will be ignored. This should be a non-negative Integer.</td><td>8283</td></tr>
+<tr><td><code>druid.tlsPort</code></td><td>TLS port for HTTPS connector, if <a href="/docs/24.0.0/operations/tls-support.html">druid.enableTlsPort</a> is set then this config will be used. If <code>druid.host</code> contains port then that port will be ignored. This should be a non-negative Integer.</td><td>8283</td></tr>
 <tr><td><code>druid.service</code></td><td>The name of the service. This is used as a dimension when emitting metrics and alerts to differentiate between the various services</td><td>druid/indexer</td></tr>
 </tbody>
 </table>
@@ -1657,8 +1683,8 @@ then the value from the configuration below is used:</p>
 <tr><td><code>druid.indexer.task.gracefulShutdownTimeout</code></td><td>Wait this long on Indexer restart for restorable tasks to gracefully exit.</td><td>PT5M</td></tr>
 <tr><td><code>druid.indexer.task.hadoopWorkingPath</code></td><td>Temporary working directory for Hadoop tasks.</td><td><code>/tmp/druid-indexing</code></td></tr>
 <tr><td><code>druid.indexer.task.restoreTasksOnRestart</code></td><td>If true, the Indexer will attempt to stop tasks gracefully on shutdown and restore them on restart.</td><td>false</td></tr>
-<tr><td><code>druid.indexer.task.ignoreTimestampSpecForDruidInputSource</code></td><td>If true, tasks using the <a href="/docs/latest/ingestion/native-batch-input-sources.html">Druid input source</a> will ignore the provided timestampSpec, and will use the <code>__time</code> column of the input datasource. This option is provided for compatibility with ingestion specs written before Druid 0.22.0.</td><td>false</td></tr>
-<tr><td><code>druid.indexer.task.storeEmptyColumns</code></td><td>Boolean value for whether or not to store empty columns during ingestion. When set to true, Druid stores every column specified in the <a href="/docs/latest/ingestion/ingestion-spec.html#dimensionsspec"><code>dimensionsSpec</code></a>. If you use schemaless ingestion and don't specify any dimensions to ingest, you must also set <a href="/docs/latest/ingestion/ingestion-spec.html#dimensionsspec"><code>includeAllDimensions</ [...]
+<tr><td><code>druid.indexer.task.ignoreTimestampSpecForDruidInputSource</code></td><td>If true, tasks using the <a href="/docs/24.0.0/ingestion/native-batch-input-sources.html">Druid input source</a> will ignore the provided timestampSpec, and will use the <code>__time</code> column of the input datasource. This option is provided for compatibility with ingestion specs written before Druid 0.22.0.</td><td>false</td></tr>
+<tr><td><code>druid.indexer.task.storeEmptyColumns</code></td><td>Boolean value for whether or not to store empty columns during ingestion. When set to true, Druid stores every column specified in the <a href="/docs/24.0.0/ingestion/ingestion-spec.html#dimensionsspec"><code>dimensionsSpec</code></a>. If you use schemaless ingestion and don't specify any dimensions to ingest, you must also set <a href="/docs/24.0.0/ingestion/ingestion-spec.html#dimensionsspec"><code>includeAllDimensions</ [...]
 <tr><td><code>druid.peon.taskActionClient.retry.minWait</code></td><td>The minimum retry time to communicate with Overlord.</td><td>PT5S</td></tr>
 <tr><td><code>druid.peon.taskActionClient.retry.maxWait</code></td><td>The maximum retry time to communicate with Overlord.</td><td>PT1M</td></tr>
 <tr><td><code>druid.peon.taskActionClient.retry.maxRetryCount</code></td><td>The maximum number of retries to communicate with Overlord.</td><td>60</td></tr>
@@ -1671,14 +1697,14 @@ then the value from the configuration below is used:</p>
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
-<tr><td><code>druid.server.http.numThreads</code></td><td>Number of threads for HTTP requests. Please see the <a href="/docs/latest/design/indexer.html#server-http-threads">Indexer Server HTTP threads</a> documentation for more details on how the Indexer uses this configuration.</td><td>max(10, (Number of cores * 17) / 16 + 2) + 30</td></tr>
+<tr><td><code>druid.server.http.numThreads</code></td><td>Number of threads for HTTP requests. Please see the <a href="/docs/24.0.0/design/indexer.html#server-http-threads">Indexer Server HTTP threads</a> documentation for more details on how the Indexer uses this configuration.</td><td>max(10, (Number of cores * 17) / 16 + 2) + 30</td></tr>
 <tr><td><code>druid.server.http.queueSize</code></td><td>Size of the worker queue used by Jetty server to temporarily store incoming client connections. If this value is set and a request is rejected by jetty because queue is full then client would observe request failure with TCP connection being closed immediately with a completely empty response from server.</td><td>Unbounded</td></tr>
 <tr><td><code>druid.server.http.maxIdleTime</code></td><td>The Jetty max idle time for a connection.</td><td>PT5M</td></tr>
 <tr><td><code>druid.server.http.enableRequestLimit</code></td><td>If enabled, no requests would be queued in jetty queue and &quot;HTTP 429 Too Many Requests&quot; error response would be sent.</td><td>false</td></tr>
 <tr><td><code>druid.server.http.defaultQueryTimeout</code></td><td>Query timeout in millis, beyond which unfinished queries will be cancelled</td><td>300000</td></tr>
 <tr><td><code>druid.server.http.gracefulShutdownTimeout</code></td><td>The maximum amount of time Jetty waits after receiving shutdown signal. After this timeout the threads will be forcefully shutdown. This allows any queries that are executing to complete(Only values greater than zero are valid).</td><td><code>PT30S</code></td></tr>
-<tr><td><code>druid.server.http.unannouncePropagationDelay</code></td><td>How long to wait for zookeeper unannouncements to propagate before shutting down Jetty. This is a minimum and <code>druid.server.http.gracefulShutdownTimeout</code> does not start counting down until after this period elapses.</td><td><code>PT0S</code> (do not wait)</td></tr>
-<tr><td><code>druid.server.http.maxQueryTimeout</code></td><td>Maximum allowed value (in milliseconds) for <code>timeout</code> parameter. See <a href="/docs/latest/querying/query-context.html">query-context</a> to know more about <code>timeout</code>. Query is rejected if the query context <code>timeout</code> is greater than this value.</td><td>Long.MAX_VALUE</td></tr>
+<tr><td><code>druid.server.http.unannouncePropagationDelay</code></td><td>How long to wait for ZooKeeper unannouncements to propagate before shutting down Jetty. This is a minimum and <code>druid.server.http.gracefulShutdownTimeout</code> does not start counting down until after this period elapses.</td><td><code>PT0S</code> (do not wait)</td></tr>
+<tr><td><code>druid.server.http.maxQueryTimeout</code></td><td>Maximum allowed value (in milliseconds) for <code>timeout</code> parameter. See <a href="/docs/24.0.0/querying/query-context.html">query-context</a> to know more about <code>timeout</code>. Query is rejected if the query context <code>timeout</code> is greater than this value.</td><td>Long.MAX_VALUE</td></tr>
 <tr><td><code>druid.server.http.maxRequestHeaderSize</code></td><td>Maximum size of a request header in bytes. Larger headers consume more memory and can make a server more vulnerable to denial of service attacks.</td><td>8 * 1024</td></tr>
 <tr><td><code>druid.server.http.enableForwardedRequestCustomizer</code></td><td>If enabled, adds Jetty ForwardedRequestCustomizer which reads X-Forwarded-* request headers to manipulate servlet request object when Druid is used behind a proxy.</td><td>false</td></tr>
 <tr><td><code>druid.server.http.allowedHttpMethods</code></td><td>List of HTTP methods that should be allowed in addition to the ones required by Druid APIs. Druid APIs require GET, PUT, POST, and DELETE, which are always allowed. This option is not useful unless you have installed an extension that needs these additional HTTP methods or that adds functionality related to CORS. None of Druid's bundled extensions require these methods.</td><td>[]</td></tr>
@@ -1691,13 +1717,13 @@ then the value from the configuration below is used:</p>
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
-<tr><td><code>druid.processing.buffer.sizeBytes</code></td><td>This specifies a buffer size (less than 2GiB) for the storage of intermediate results. The computation engine in the Indexer processes will use a scratch buffer of this size to do all of their intermediate computations off-heap. Larger values allow for more aggregations in a single pass over the data while smaller values can require more passes depending on the query that is being executed. <a href="/docs/latest/configuration [...]
+<tr><td><code>druid.processing.buffer.sizeBytes</code></td><td>This specifies a buffer size (less than 2GiB) for the storage of intermediate results. The computation engine in the Indexer processes will use a scratch buffer of this size to do all of their intermediate computations off-heap. Larger values allow for more aggregations in a single pass over the data while smaller values can require more passes depending on the query that is being executed. <a href="/docs/24.0.0/configuration [...]
 <tr><td><code>druid.processing.buffer.poolCacheMaxCount</code></td><td>processing buffer pool caches the buffers for later use, this is the maximum count cache will grow to. note that pool can create more buffers than it can cache if necessary.</td><td>Integer.MAX_VALUE</td></tr>
 <tr><td><code>druid.processing.formatString</code></td><td>Indexer processes use this format string to name their processing threads.</td><td>processing-%s</td></tr>
 <tr><td><code>druid.processing.numMergeBuffers</code></td><td>The number of direct memory buffers available for merging query results. The buffers are sized by <code>druid.processing.buffer.sizeBytes</code>. This property is effectively a concurrency limit for queries that require merging buffers. If you are using any queries that require merge buffers (currently, just groupBy v2) then you should have at least two of these.</td><td><code>max(2, druid.processing.numThreads / 4)</code></td></tr>
 <tr><td><code>druid.processing.numThreads</code></td><td>The number of processing threads to have available for parallel processing of segments. Our rule of thumb is <code>num_cores - 1</code>, which means that even under heavy load there will still be one core available to do background tasks like talking with ZooKeeper and pulling down segments. If only one core is available, this property defaults to the value <code>1</code>.</td><td>Number of cores - 1 (or 1)</td></tr>
 <tr><td><code>druid.processing.columnCache.sizeBytes</code></td><td>Maximum size in bytes for the dimension value lookup cache. Any value greater than <code>0</code> enables the cache. It is currently disabled by default. Enabling the lookup cache can significantly improve the performance of aggregators operating on dimension values, such as the JavaScript aggregator, or cardinality aggregator, but can slow things down if the cache hit rate is low (i.e. dimensions with few repeating valu [...]
-<tr><td><code>druid.processing.fifo</code></td><td>If the processing queue should treat tasks of equal priority in a FIFO manner</td><td><code>false</code></td></tr>
+<tr><td><code>druid.processing.fifo</code></td><td>If the processing queue should treat tasks of equal priority in a FIFO manner</td><td><code>true</code></td></tr>
 <tr><td><code>druid.processing.tmpDir</code></td><td>Path where temporary files created while processing a query should be stored. If specified, this configuration takes priority over the default <code>java.io.tmpdir</code> path.</td><td>path represented by <code>java.io.tmpdir</code></td></tr>
 </tbody>
 </table>
@@ -1723,7 +1749,7 @@ line.</p>
 <p>See <a href="#cache-configuration">cache configuration</a> for how to configure cache settings.</p>
 <p>Note that only local caches such as the <code>local</code>-type cache and <code>caffeine</code> cache are supported. If a remote cache such as <code>memcached</code> is used, it will be ignored.</p>
 <h3><a class="anchor" aria-hidden="true" id="historical"></a><a href="#historical" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>For general Historical Process information, see <a href="/docs/latest/design/historical.html">here</a>.</p>
+<p>For general Historical Process information, see <a href="/docs/24.0.0/design/historical.html">here</a>.</p>
 <p>These Historical configurations can be defined in the <code>historical/runtime.properties</code> file.</p>
 <h4><a class="anchor" aria-hidden="true" id="historical-process-configuration"></a><a href="#historical-process-configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13. [...]
 <table>
@@ -1734,7 +1760,7 @@ line.</p>
 <tr><td><code>druid.host</code></td><td>The host for the current process. This is used to advertise the current processes location as reachable from another process and should generally be specified such that <code>http://${druid.host}/</code> could actually talk to this process</td><td>InetAddress.getLocalHost().getCanonicalHostName()</td></tr>
 <tr><td><code>druid.bindOnHost</code></td><td>Indicating whether the process's internal jetty server bind on <code>druid.host</code>. Default is false, which means binding to all interfaces.</td><td>false</td></tr>
 <tr><td><code>druid.plaintextPort</code></td><td>This is the port to actually listen on; unless port mapping is used, this will be the same port as is on <code>druid.host</code></td><td>8083</td></tr>
-<tr><td><code>druid.tlsPort</code></td><td>TLS port for HTTPS connector, if <a href="/docs/latest/operations/tls-support.html">druid.enableTlsPort</a> is set then this config will be used. If <code>druid.host</code> contains port then that port will be ignored. This should be a non-negative Integer.</td><td>8283</td></tr>
+<tr><td><code>druid.tlsPort</code></td><td>TLS port for HTTPS connector, if <a href="/docs/24.0.0/operations/tls-support.html">druid.enableTlsPort</a> is set then this config will be used. If <code>druid.host</code> contains port then that port will be ignored. This should be a non-negative Integer.</td><td>8283</td></tr>
 <tr><td><code>druid.service</code></td><td>The name of the service. This is used as a dimension when emitting metrics and alerts to differentiate between the various services</td><td>druid/historical</td></tr>
 </tbody>
 </table>
@@ -1744,8 +1770,8 @@ line.</p>
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
-<tr><td><code>druid.server.maxSize</code></td><td>The maximum number of bytes-worth of segments that the process wants assigned to it. The Coordinator process will attempt to assign segments to a Historical process only if this property is greater than the total size of segments served by it. Since this property defines the upper limit on the total segment size that can be assigned to a Historical, it is defaulted to the sum of all <code>maxSize</code> values specified within <code>druid [...]
-<tr><td><code>druid.server.tier</code></td><td>A string to name the distribution tier that the storage process belongs to. Many of the <a href="/docs/latest/operations/rule-configuration.html">rules Coordinator processes use</a> to manage segments can be keyed on tiers.</td><td><code>_default_tier</code></td></tr>
+<tr><td><code>druid.server.maxSize</code></td><td>The maximum number of bytes-worth of segments that the process wants assigned to it. The Coordinator process will attempt to assign segments to a Historical process only if this property is greater than the total size of segments served by it. Since this property defines the upper limit on the total segment size that can be assigned to a Historical, it is defaulted to the sum of all <code>maxSize</code> values specified within <code>druid [...]
+<tr><td><code>druid.server.tier</code></td><td>A string to name the distribution tier that the storage process belongs to. Many of the <a href="/docs/24.0.0/operations/rule-configuration.html">rules Coordinator processes use</a> to manage segments can be keyed on tiers.</td><td><code>_default_tier</code></td></tr>
 <tr><td><code>druid.server.priority</code></td><td>In a tiered architecture, the priority of the tier, thus allowing control over which processes are queried. Higher numbers mean higher priority. The default (no priority) works for architecture with no cross replication (tiers that have no data-storage overlap). Data centers typically have equal priority.</td><td>0</td></tr>
 </tbody>
 </table>
@@ -1797,8 +1823,8 @@ line.</p>
 <tr><td><code>druid.server.http.enableRequestLimit</code></td><td>If enabled, no requests would be queued in jetty queue and &quot;HTTP 429 Too Many Requests&quot; error response would be sent.</td><td>false</td></tr>
 <tr><td><code>druid.server.http.defaultQueryTimeout</code></td><td>Query timeout in millis, beyond which unfinished queries will be cancelled</td><td>300000</td></tr>
 <tr><td><code>druid.server.http.gracefulShutdownTimeout</code></td><td>The maximum amount of time Jetty waits after receiving shutdown signal. After this timeout the threads will be forcefully shutdown. This allows any queries that are executing to complete(Only values greater than zero are valid).</td><td><code>PT30S</code></td></tr>
-<tr><td><code>druid.server.http.unannouncePropagationDelay</code></td><td>How long to wait for zookeeper unannouncements to propagate before shutting down Jetty. This is a minimum and <code>druid.server.http.gracefulShutdownTimeout</code> does not start counting down until after this period elapses.</td><td><code>PT0S</code> (do not wait)</td></tr>
-<tr><td><code>druid.server.http.maxQueryTimeout</code></td><td>Maximum allowed value (in milliseconds) for <code>timeout</code> parameter. See <a href="/docs/latest/querying/query-context.html">query-context</a> to know more about <code>timeout</code>. Query is rejected if the query context <code>timeout</code> is greater than this value.</td><td>Long.MAX_VALUE</td></tr>
+<tr><td><code>druid.server.http.unannouncePropagationDelay</code></td><td>How long to wait for ZooKeeper unannouncements to propagate before shutting down Jetty. This is a minimum and <code>druid.server.http.gracefulShutdownTimeout</code> does not start counting down until after this period elapses.</td><td><code>PT0S</code> (do not wait)</td></tr>
+<tr><td><code>druid.server.http.maxQueryTimeout</code></td><td>Maximum allowed value (in milliseconds) for <code>timeout</code> parameter. See <a href="/docs/24.0.0/querying/query-context.html">query-context</a> to know more about <code>timeout</code>. Query is rejected if the query context <code>timeout</code> is greater than this value.</td><td>Long.MAX_VALUE</td></tr>
 <tr><td><code>druid.server.http.maxRequestHeaderSize</code></td><td>Maximum size of a request header in bytes. Larger headers consume more memory and can make a server more vulnerable to denial of service attacks.</td><td>8 * 1024</td></tr>
 <tr><td><code>druid.server.http.contentSecurityPolicy</code></td><td>Content-Security-Policy header value to set on each non-POST response. Setting this property to an empty string, or omitting it, both result in the default <code>frame-ancestors: none</code> being set.</td><td><code>frame-ancestors 'none'</code></td></tr>
 </tbody>
@@ -1809,13 +1835,13 @@ line.</p>
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
-<tr><td><code>druid.processing.buffer.sizeBytes</code></td><td>This specifies a buffer size (less than 2GiB), for the storage of intermediate results. The computation engine in both the Historical and Realtime processes will use a scratch buffer of this size to do all of their intermediate computations off-heap. Larger values allow for more aggregations in a single pass over the data while smaller values can require more passes depending on the query that is being executed.  <a href="/do [...]
+<tr><td><code>druid.processing.buffer.sizeBytes</code></td><td>This specifies a buffer size (less than 2GiB), for the storage of intermediate results. The computation engine in both the Historical and Realtime processes will use a scratch buffer of this size to do all of their intermediate computations off-heap. Larger values allow for more aggregations in a single pass over the data while smaller values can require more passes depending on the query that is being executed.  <a href="/do [...]
 <tr><td><code>druid.processing.buffer.poolCacheMaxCount</code></td><td>processing buffer pool caches the buffers for later use, this is the maximum count cache will grow to. note that pool can create more buffers than it can cache if necessary.</td><td>Integer.MAX_VALUE</td></tr>
 <tr><td><code>druid.processing.formatString</code></td><td>Realtime and Historical processes use this format string to name their processing threads.</td><td>processing-%s</td></tr>
 <tr><td><code>druid.processing.numMergeBuffers</code></td><td>The number of direct memory buffers available for merging query results. The buffers are sized by <code>druid.processing.buffer.sizeBytes</code>. This property is effectively a concurrency limit for queries that require merging buffers. If you are using any queries that require merge buffers (currently, just groupBy v2) then you should have at least two of these.</td><td><code>max(2, druid.processing.numThreads / 4)</code></td></tr>
 <tr><td><code>druid.processing.numThreads</code></td><td>The number of processing threads to have available for parallel processing of segments. Our rule of thumb is <code>num_cores - 1</code>, which means that even under heavy load there will still be one core available to do background tasks like talking with ZooKeeper and pulling down segments. If only one core is available, this property defaults to the value <code>1</code>.</td><td>Number of cores - 1 (or 1)</td></tr>
 <tr><td><code>druid.processing.columnCache.sizeBytes</code></td><td>Maximum size in bytes for the dimension value lookup cache. Any value greater than <code>0</code> enables the cache. It is currently disabled by default. Enabling the lookup cache can significantly improve the performance of aggregators operating on dimension values, such as the JavaScript aggregator, or cardinality aggregator, but can slow things down if the cache hit rate is low (i.e. dimensions with few repeating valu [...]
-<tr><td><code>druid.processing.fifo</code></td><td>If the processing queue should treat tasks of equal priority in a FIFO manner</td><td><code>false</code></td></tr>
+<tr><td><code>druid.processing.fifo</code></td><td>If the processing queue should treat tasks of equal priority in a FIFO manner</td><td><code>true</code></td></tr>
 <tr><td><code>druid.processing.tmpDir</code></td><td>Path where temporary files created while processing a query should be stored. If specified, this configuration takes priority over the default <code>java.io.tmpdir</code> path.</td><td>path represented by <code>java.io.tmpdir</code></td></tr>
 </tbody>
 </table>
@@ -1840,10 +1866,10 @@ line.</p>
 </table>
 <p>See <a href="#cache-configuration">cache configuration</a> for how to configure cache settings.</p>
 <h2><a class="anchor" aria-hidden="true" id="query-server"></a><a href="#query-server" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>This section contains the configuration options for the processes that reside on Query servers (Brokers) in the suggested <a href="/docs/latest/design/processes.html#server-types">three-server configuration</a>.</p>
-<p>Configuration options for the experimental <a href="/docs/latest/design/router.html">Router process</a> are also provided here.</p>
+<p>This section contains the configuration options for the processes that reside on Query servers (Brokers) in the suggested <a href="/docs/24.0.0/design/processes.html#server-types">three-server configuration</a>.</p>
+<p>Configuration options for the experimental <a href="/docs/24.0.0/design/router.html">Router process</a> are also provided here.</p>
 <h3><a class="anchor" aria-hidden="true" id="broker"></a><a href="#broker" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
-<p>For general Broker process information, see <a href="/docs/latest/design/broker.html">here</a>.</p>
+<p>For general Broker process information, see <a href="/docs/24.0.0/design/broker.html">here</a>.</p>
 <p>These Broker configurations can be defined in the <code>broker/runtime.properties</code> file.</p>
 <h4><a class="anchor" aria-hidden="true" id="broker-process-configs"></a><a href="#broker-process-configs" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0 [...]
 <table>
@@ -1854,7 +1880,7 @@ line.</p>
 <tr><td><code>druid.host</code></td><td>The host for the current process. This is used to advertise the current processes location as reachable from another process and should generally be specified such that <code>http://${druid.host}/</code> could actually talk to this process</td><td>InetAddress.getLocalHost().getCanonicalHostName()</td></tr>
 <tr><td><code>druid.bindOnHost</code></td><td>Indicating whether the process's internal jetty server bind on <code>druid.host</code>. Default is false, which means binding to all interfaces.</td><td>false</td></tr>
 <tr><td><code>druid.plaintextPort</code></td><td>This is the port to actually listen on; unless port mapping is used, this will be the same port as is on <code>druid.host</code></td><td>8082</td></tr>
-<tr><td><code>druid.tlsPort</code></td><td>TLS port for HTTPS connector, if <a href="/docs/latest/operations/tls-support.html">druid.enableTlsPort</a> is set then this config will be used. If <code>druid.host</code> contains port then that port will be ignored. This should be a non-negative Integer.</td><td>8282</td></tr>
+<tr><td><code>druid.tlsPort</code></td><td>TLS port for HTTPS connector, if <a href="/docs/24.0.0/operations/tls-support.html">druid.enableTlsPort</a> is set then this config will be used. If <code>druid.host</code> contains port then that port will be ignored. This should be a non-negative Integer.</td><td>8282</td></tr>
 <tr><td><code>druid.service</code></td><td>The name of the service. This is used as a dimension when emitting metrics and alerts to differentiate between the various services</td><td>druid/broker</td></tr>
 </tbody>
 </table>
@@ -1884,7 +1910,7 @@ line.</p>
 </table>
 <h5><a class="anchor" aria-hidden="true" id="prioritization-strategies"></a><a href="#prioritization-strategies" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
 <h6><a class="anchor" aria-hidden="true" id="manual-prioritization-strategy"></a><a href="#manual-prioritization-strategy" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 1 [...]
-<p>With this configuration, queries are never assigned a priority automatically, but will preserve a priority manually set on the <a href="/docs/latest/querying/query-context.html">query context</a> with the <code>priority</code> key. This mode can be explicitly set by setting <code>druid.query.scheduler.prioritization.strategy</code> to <code>manual</code>.</p>
+<p>With this configuration, queries are never assigned a priority automatically, but will preserve a priority manually set on the <a href="/docs/24.0.0/querying/query-context.html">query context</a> with the <code>priority</code> key. This mode can be explicitly set by setting <code>druid.query.scheduler.prioritization.strategy</code> to <code>manual</code>.</p>
 <h6><a class="anchor" aria-hidden="true" id="threshold-prioritization-strategy"></a><a href="#threshold-prioritization-strategy" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S1 [...]
 <p>This prioritization strategy lowers the priority of queries that cross any of a configurable set of thresholds, such as how far in the past the data is, how large of an interval a query covers, or the number of segments taking part in a query.</p>
 <p>This strategy can be enabled by setting <code>druid.query.scheduler.prioritization.strategy</code> to <code>threshold</code>.</p>
@@ -1904,7 +1930,7 @@ line.</p>
 <p>In this mode, queries are never assigned a lane, and the concurrent query count will only be limited by <code>druid.server.http.numThreads</code> or <code>druid.query.scheduler.numThreads</code>, if set. This is the default Druid query scheduler operating mode. Enable this strategy explicitly by setting <code>druid.query.scheduler.laning.strategy</code> to <code>none</code>.</p>
 <h6><a class="anchor" aria-hidden="true" id="highlow-laning-strategy"></a><a href="#highlow-laning-strategy" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
 <p>This laning strategy splits queries with a <code>priority</code> below zero into a <code>low</code> query lane, automatically. Queries with priority of zero (the default) or above are considered 'interactive'. The limit on <code>low</code> queries can be set to some desired percentage of the total capacity (or HTTP thread pool size), reserving capacity for interactive queries. Queries in the <code>low</code> lane are <em>not</em> guaranteed their capacity, which may be consumed by int [...]
-<p>If the <code>low</code> lane is specified in the <a href="/docs/latest/querying/query-context.html">query context</a> <code>lane</code> parameter, this will override the computed lane.</p>
+<p>If the <code>low</code> lane is specified in the <a href="/docs/24.0.0/querying/query-context.html">query context</a> <code>lane</code> parameter, this will override the computed lane.</p>
 <p>This strategy can be enabled by setting <code>druid.query.scheduler.laning.strategy=hilo</code>.</p>
 <table>
 <thead>
@@ -1915,7 +1941,7 @@ line.</p>
 </tbody>
 </table>
 <h6><a class="anchor" aria-hidden="true" id="manual-laning-strategy"></a><a href="#manual-laning-strategy" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0 [...]
-<p>This laning strategy is best suited for cases where one or more external applications which query Druid are capable of manually deciding what lane a given query should belong to. Configured with a map of lane names to percent or exact max capacities, queries with a matching <code>lane</code> parameter in the <a href="/docs/latest/querying/query-context.html">query context</a> will be subjected to those limits.</p>
+<p>This laning strategy is best suited for cases where one or more external applications which query Druid are capable of manually deciding what lane a given query should belong to. Configured with a map of lane names to percent or exact max capacities, queries with a matching <code>lane</code> parameter in the <a href="/docs/24.0.0/querying/query-context.html">query context</a> will be subjected to those limits.</p>
 <table>
 <thead>
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
@@ -1937,11 +1963,11 @@ line.</p>
 <tr><td><code>druid.server.http.maxIdleTime</code></td><td>The Jetty max idle time for a connection.</td><td>PT5M</td></tr>
 <tr><td><code>druid.server.http.enableRequestLimit</code></td><td>If enabled, no requests would be queued in jetty queue and &quot;HTTP 429 Too Many Requests&quot; error response would be sent.</td><td>false</td></tr>
 <tr><td><code>druid.server.http.defaultQueryTimeout</code></td><td>Query timeout in millis, beyond which unfinished queries will be cancelled</td><td>300000</td></tr>
-<tr><td><code>druid.server.http.maxScatterGatherBytes</code></td><td>Maximum number of bytes gathered from data processes such as Historicals and realtime processes to execute a query. Queries that exceed this limit will fail. This is an advance configuration that allows to protect in case Broker is under heavy load and not utilizing the data gathered in memory fast enough and leading to OOMs. This limit can be further reduced at query time using <code>maxScatterGatherBytes</code> in the [...]
+<tr><td><code>druid.server.http.maxScatterGatherBytes</code></td><td>Maximum number of bytes gathered from data processes such as Historicals and realtime processes to execute a query. Queries that exceed this limit will fail. This is an advance configuration that allows to protect in case Broker is under heavy load and not utilizing the data gathered in memory fast enough and leading to OOMs. This limit can be further reduced at query time using <code>maxScatterGatherBytes</code> in the [...]
 <tr><td><code>druid.server.http.maxSubqueryRows</code></td><td>Maximum number of rows from all subqueries per query. Druid stores the subquery rows in temporary tables that live in the Java heap. <code>druid.server.http.maxSubqueryRows</code> is a guardrail to prevent the system from exhausting available heap. When a subquery exceeds the row limit, Druid throws a resource limit exceeded exception: &quot;Subquery generated results beyond maximum.&quot;<br><br>It is a good practice to avoi [...]
 <tr><td><code>druid.server.http.gracefulShutdownTimeout</code></td><td>The maximum amount of time Jetty waits after receiving shutdown signal. After this timeout the threads will be forcefully shutdown. This allows any queries that are executing to complete(Only values greater than zero are valid).</td><td><code>PT30S</code></td></tr>
-<tr><td><code>druid.server.http.unannouncePropagationDelay</code></td><td>How long to wait for zookeeper unannouncements to propagate before shutting down Jetty. This is a minimum and <code>druid.server.http.gracefulShutdownTimeout</code> does not start counting down until after this period elapses.</td><td><code>PT0S</code> (do not wait)</td></tr>
-<tr><td><code>druid.server.http.maxQueryTimeout</code></td><td>Maximum allowed value (in milliseconds) for <code>timeout</code> parameter. See <a href="/docs/latest/querying/query-context.html">query-context</a> to know more about <code>timeout</code>. Query is rejected if the query context <code>timeout</code> is greater than this value.</td><td>Long.MAX_VALUE</td></tr>
+<tr><td><code>druid.server.http.unannouncePropagationDelay</code></td><td>How long to wait for ZooKeeper unannouncements to propagate before shutting down Jetty. This is a minimum and <code>druid.server.http.gracefulShutdownTimeout</code> does not start counting down until after this period elapses.</td><td><code>PT0S</code> (do not wait)</td></tr>
+<tr><td><code>druid.server.http.maxQueryTimeout</code></td><td>Maximum allowed value (in milliseconds) for <code>timeout</code> parameter. See <a href="/docs/24.0.0/querying/query-context.html">query-context</a> to know more about <code>timeout</code>. Query is rejected if the query context <code>timeout</code> is greater than this value.</td><td>Long.MAX_VALUE</td></tr>
 <tr><td><code>druid.server.http.maxRequestHeaderSize</code></td><td>Maximum size of a request header in bytes. Larger headers consume more memory and can make a server more vulnerable to denial of service attacks.</td><td>8 * 1024</td></tr>
 <tr><td><code>druid.server.http.contentSecurityPolicy</code></td><td>Content-Security-Policy header value to set on each non-POST response. Setting this property to an empty string, or omitting it, both result in the default <code>frame-ancestors: none</code> being set.</td><td><code>frame-ancestors 'none'</code></td></tr>
 </tbody>
@@ -1959,7 +1985,7 @@ client has the following configuration options.</p>
 <tr><td><code>druid.broker.http.compressionCodec</code></td><td>Compression codec the Broker uses to communicate with Historical and real-time processes. May be &quot;gzip&quot; or &quot;identity&quot;.</td><td><code>gzip</code></td></tr>
 <tr><td><code>druid.broker.http.readTimeout</code></td><td>The timeout for data reads from Historical servers and real-time tasks.</td><td><code>PT15M</code></td></tr>
 <tr><td><code>druid.broker.http.unusedConnectionTimeout</code></td><td>The timeout for idle connections in connection pool. The connection in the pool will be closed after this timeout and a new one will be established. This timeout should be less than <code>druid.broker.http.readTimeout</code>. Set this timeout = ~90% of <code>druid.broker.http.readTimeout</code></td><td><code>PT4M</code></td></tr>
-<tr><td><code>druid.broker.http.maxQueuedBytes</code></td><td>Maximum number of bytes queued per query before exerting backpressure on the channel to the data server. Similar to <code>druid.server.http.maxScatterGatherBytes</code>, except unlike that configuration, this one will trigger backpressure rather than query failure. Zero means disabled. Can be overridden by the <a href="/docs/latest/querying/query-context.html">&quot;maxQueuedBytes&quot; query context parameter</a>. Human-reada [...]
+<tr><td><code>druid.broker.http.maxQueuedBytes</code></td><td>Maximum number of bytes queued per query before exerting backpressure on channels to the data servers.<br /><br />Similar to <code>druid.server.http.maxScatterGatherBytes</code>, except unlike that configuration, this one will trigger backpressure rather than query failure. Zero means disabled. Can be overridden by the <a href="/docs/24.0.0/querying/query-context.html">&quot;maxQueuedBytes&quot; query context parameter</a>. Hu [...]
 <tr><td><code>druid.broker.http.numMaxThreads</code></td><td>`Maximum number of I/O worker threads</td><td>max(10, ((number of cores * 17) / 16 + 2) + 30)`</td></tr>
 </tbody>
 </table>
@@ -1980,12 +2006,12 @@ client has the following configuration options.</p>
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
-<tr><td><code>druid.processing.buffer.sizeBytes</code></td><td>This specifies a buffer size (less than 2GiB) for the storage of intermediate results. The computation engine in both the Historical and Realtime processes will use a scratch buffer of this size to do all of their intermediate computations off-heap. Larger values allow for more aggregations in a single pass over the data while smaller values can require more passes depending on the query that is being executed. <a href="/docs [...]
+<tr><td><code>druid.processing.buffer.sizeBytes</code></td><td>This specifies a buffer size (less than 2GiB) for the storage of intermediate results. The computation engine in both the Historical and Realtime processes will use a scratch buffer of this size to do all of their intermediate computations off-heap. Larger values allow for more aggregations in a single pass over the data while smaller values can require more passes depending on the query that is being executed. <a href="/docs [...]
 <tr><td><code>druid.processing.buffer.poolCacheInitialCount</code></td><td>initializes the number of buffers allocated on the intermediate results pool. Note that pool can create more buffers if necessary.</td><td><code>0</code></td></tr>
 <tr><td><code>druid.processing.buffer.poolCacheMaxCount</code></td><td>processing buffer pool caches the buffers for later use, this is the maximum count cache will grow to. note that pool can create more buffers than it can cache if necessary.</td><td>Integer.MAX_VALUE</td></tr>
 <tr><td><code>druid.processing.numMergeBuffers</code></td><td>The number of direct memory buffers available for merging query results. The buffers are sized by <code>druid.processing.buffer.sizeBytes</code>. This property is effectively a concurrency limit for queries that require merging buffers. If you are using any queries that require merge buffers (currently, just groupBy v2) then you should have at least two of these.</td><td><code>max(2, druid.processing.numThreads / 4)</code></td></tr>
 <tr><td><code>druid.processing.columnCache.sizeBytes</code></td><td>Maximum size in bytes for the dimension value lookup cache. Any value greater than <code>0</code> enables the cache. It is currently disabled by default. Enabling the lookup cache can significantly improve the performance of aggregators operating on dimension values, such as the JavaScript aggregator, or cardinality aggregator, but can slow things down if the cache hit rate is low (i.e. dimensions with few repeating valu [...]
-<tr><td><code>druid.processing.fifo</code></td><td>If the processing queue should treat tasks of equal priority in a FIFO manner</td><td><code>false</code></td></tr>
+<tr><td><code>druid.processing.fifo</code></td><td>If the processing queue should treat tasks of equal priority in a FIFO manner</td><td><code>true</code></td></tr>
 <tr><td><code>druid.processing.tmpDir</code></td><td>Path where temporary files created while processing a query should be stored. If specified, this configuration takes priority over the default <code>java.io.tmpdir</code> path.</td><td>path represented by <code>java.io.tmpdir</code></td></tr>
 <tr><td><code>druid.processing.merge.useParallelMergePool</code></td><td>Enable automatic parallel merging for Brokers on a dedicated async ForkJoinPool. If <code>false</code>, instead merges will be done serially on the <code>HTTP</code> thread pool.</td><td><code>true</code></td></tr>
 <tr><td><code>druid.processing.merge.pool.parallelism</code></td><td>Size of ForkJoinPool. Note that the default configuration assumes that the value returned by <code>Runtime.getRuntime().availableProcessors()</code> represents 2 hyper-threads per physical core, and multiplies this value by <code>0.75</code> in attempt to size <code>1.5</code> times the number of <em>physical</em> cores.</td><td><code>Runtime.getRuntime().availableProcessors() * 0.75</code> (rounded up)</td></tr>
@@ -2031,19 +2057,19 @@ queries in order to avoid running as a default priority of 0.</p>
 <tr><td><code>druid.sql.avatica.maxStatementsPerConnection</code></td><td>Maximum number of simultaneous open statements per Avatica client connection.</td><td>4</td></tr>
 <tr><td><code>druid.sql.avatica.connectionIdleTimeout</code></td><td>Avatica client connection idle timeout.</td><td>PT5M</td></tr>
 <tr><td><code>druid.sql.http.enable</code></td><td>Whether to enable JSON over HTTP querying at <code>/druid/v2/sql/</code>.</td><td>true</td></tr>
-<tr><td><code>druid.sql.planner.maxTopNLimit</code></td><td>Maximum threshold for a <a href="/docs/latest/querying/topnquery.html">TopN query</a>. Higher limits will be planned as <a href="/docs/latest/querying/groupbyquery.html">GroupBy queries</a> instead.</td><td>100000</td></tr>
+<tr><td><code>druid.sql.planner.maxTopNLimit</code></td><td>Maximum threshold for a <a href="/docs/24.0.0/querying/topnquery.html">TopN query</a>. Higher limits will be planned as <a href="/docs/24.0.0/querying/groupbyquery.html">GroupBy queries</a> instead.</td><td>100000</td></tr>
 <tr><td><code>druid.sql.planner.metadataRefreshPeriod</code></td><td>Throttle for metadata refreshes.</td><td>PT1M</td></tr>
 <tr><td><code>druid.sql.planner.useApproximateCountDistinct</code></td><td>Whether to use an approximate cardinality algorithm for <code>COUNT(DISTINCT foo)</code>.</td><td>true</td></tr>
 <tr><td><code>druid.sql.planner.useGroupingSetForExactDistinct</code></td><td>Only relevant when <code>useApproximateCountDistinct</code> is disabled. If set to true, exact distinct queries are re-written using grouping sets. Otherwise, exact distinct queries are re-written using joins. This should be set to true for group by query with multiple exact distinct aggregations. This flag can be overridden per query.</td><td>false</td></tr>
-<tr><td><code>druid.sql.planner.useApproximateTopN</code></td><td>Whether to use approximate <a href="/docs/latest/querying/topnquery.html">TopN queries</a> when a SQL query could be expressed as such. If false, exact <a href="/docs/latest/querying/groupbyquery.html">GroupBy queries</a> will be used instead.</td><td>true</td></tr>
+<tr><td><code>druid.sql.planner.useApproximateTopN</code></td><td>Whether to use approximate <a href="/docs/24.0.0/querying/topnquery.html">TopN queries</a> when a SQL query could be expressed as such. If false, exact <a href="/docs/24.0.0/querying/groupbyquery.html">GroupBy queries</a> will be used instead.</td><td>true</td></tr>
 <tr><td><code>druid.sql.planner.requireTimeCondition</code></td><td>Whether to require SQL to have filter conditions on __time column so that all generated native queries will have user specified intervals. If true, all queries without filter condition on __time column will fail</td><td>false</td></tr>
 <tr><td><code>druid.sql.planner.sqlTimeZone</code></td><td>Sets the default time zone for the server, which will affect how time functions and timestamp literals behave. Should be a time zone name like &quot;America/Los_Angeles&quot; or offset like &quot;-08:00&quot;.</td><td>UTC</td></tr>
 <tr><td><code>druid.sql.planner.metadataSegmentCacheEnable</code></td><td>Whether to keep a cache of published segments in broker. If true, broker polls coordinator in background to get segments from metadata store and maintains a local cache. If false, coordinator's REST API will be invoked when broker needs published segments info.</td><td>false</td></tr>
 <tr><td><code>druid.sql.planner.metadataSegmentPollPeriod</code></td><td>How often to poll coordinator for published segments list if <code>druid.sql.planner.metadataSegmentCacheEnable</code> is set to true. Poll period is in milliseconds.</td><td>60000</td></tr>
 <tr><td><code>druid.sql.planner.authorizeSystemTablesDirectly</code></td><td>If true, Druid authorizes queries against any of the system schema tables (<code>sys</code> in SQL) as <code>SYSTEM_TABLE</code> resources which require <code>READ</code> access, in addition to permissions based content filtering.</td><td>false</td></tr>
-<tr><td><code>druid.sql.planner.useNativeQueryExplain</code></td><td>If true, <code>EXPLAIN PLAN FOR</code> will return the explain plan as a JSON representation of equivalent native query(s), else it will return the original version of explain plan generated by Calcite. It can be overridden per query with <code>useNativeQueryExplain</code> context key.</td><td>false</td></tr>
-<tr><td><code>druid.sql.planner.maxNumericInFilters</code></td><td>Max limit for the amount of numeric values that can be compared for a string type dimension when the entire SQL WHERE clause of a query translates to an <a href="/docs/latest/querying/filters.html#or">OR</a> of <a href="/docs/latest/querying/filters.html#bound-filter">Bound filter</a>. By default, Druid does not restrict the amount of numeric Bound Filters on String columns, although this situation may block other queries [...]
-<tr><td><code>druid.sql.approxCountDistinct.function</code></td><td>Implementation to use for the <a href="/docs/latest/querying/sql-aggregations.html"><code>APPROX_COUNT_DISTINCT</code> function</a>. Without extensions loaded, the only valid value is <code>APPROX_COUNT_DISTINCT_BUILTIN</code> (a HyperLogLog, or HLL, based implementation). If the <a href="/docs/latest/development/extensions-core/datasketches-extension.html">DataSketches extension</a> is loaded, this can also be <code>APP [...]
+<tr><td><code>druid.sql.planner.useNativeQueryExplain</code></td><td>If true, <code>EXPLAIN PLAN FOR</code> will return the explain plan as a JSON representation of equivalent native query(s), else it will return the original version of explain plan generated by Calcite. It can be overridden per query with <code>useNativeQueryExplain</code> context key.</td><td>true</td></tr>
+<tr><td><code>druid.sql.planner.maxNumericInFilters</code></td><td>Max limit for the amount of numeric values that can be compared for a string type dimension when the entire SQL WHERE clause of a query translates to an <a href="/docs/24.0.0/querying/filters.html#or">OR</a> of <a href="/docs/24.0.0/querying/filters.html#bound-filter">Bound filter</a>. By default, Druid does not restrict the amount of numeric Bound Filters on String columns, although this situation may block other queries [...]
+<tr><td><code>druid.sql.approxCountDistinct.function</code></td><td>Implementation to use for the <a href="/docs/24.0.0/querying/sql-aggregations.html"><code>APPROX_COUNT_DISTINCT</code> function</a>. Without extensions loaded, the only valid value is <code>APPROX_COUNT_DISTINCT_BUILTIN</code> (a HyperLogLog, or HLL, based implementation). If the <a href="/docs/24.0.0/development/extensions-core/datasketches-extension.html">DataSketches extension</a> is loaded, this can also be <code>APP [...]
 </tbody>
 </table>
 <blockquote>
@@ -2070,8 +2096,8 @@ number of rows permitted across all subqueries.</p>
 </table>
 <p>See <a href="#cache-configuration">cache configuration</a> for how to configure cache settings.</p>
 <blockquote>
-<p>Note: Even if cache is enabled, for <a href="/docs/latest/querying/groupbyquery.html#strategies">groupBy v2</a> queries, both of non-result level cache and result level cache do not work on Brokers.
-See <a href="/docs/latest/querying/groupbyquery.html#differences-between-v1-and-v2">Differences between v1 and v2</a> and <a href="/docs/latest/querying/caching.html">Query caching</a> for more information.</p>
+<p>Note: Even if cache is enabled, for <a href="/docs/24.0.0/querying/groupbyquery.html#strategies">groupBy v2</a> queries, both of non-result level cache and result level cache do not work on Brokers.
+See <a href="/docs/24.0.0/querying/groupbyquery.html#differences-between-v1-and-v2">Differences between v1 and v2</a> and <a href="/docs/24.0.0/querying/caching.html">Query caching</a> for more information.</p>
 </blockquote>
 <h4><a class="anchor" aria-hidden="true" id="segment-discovery"></a><a href="#segment-discovery" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
 <table>
@@ -2079,7 +2105,7 @@ See <a href="/docs/latest/querying/groupbyquery.html#differences-between-v1-and-
 <tr><th>Property</th><th>Possible Values</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
-<tr><td><code>druid.serverview.type</code></td><td>batch or http</td><td>Segment discovery method to use. &quot;http&quot; enables discovering segments using HTTP instead of zookeeper.</td><td>batch</td></tr>
+<tr><td><code>druid.serverview.type</code></td><td>batch or http</td><td>Segment discovery method to use. &quot;http&quot; enables discovering segments using HTTP instead of ZooKeeper.</td><td>batch</td></tr>
 <tr><td><code>druid.broker.segment.watchedTiers</code></td><td>List of strings</td><td>The Broker watches segment announcements from processes that serve segments to build a cache to relate each process to the segments it serves. This configuration allows the Broker to only consider segments being served from a list of tiers. By default, Broker considers all tiers. This can be used to partition your dataSources in specific Historical tiers and configure brokers in partitions so that they [...]
 <tr><td><code>druid.broker.segment.ignoredTiers</code></td><td>List of strings</td><td>The Broker watches segment announcements from processes that serve segments to build a cache to relate each process to the segments it serves. This configuration allows the Broker to ignore the segments being served from a list of tiers. By default, Broker considers all tiers. This config is mutually exclusive from <code>druid.broker.segment.watchedTiers</code> and at most one of these can be configure [...]
 <tr><td><code>druid.broker.segment.watchedDataSources</code></td><td>List of strings</td><td>Broker watches the segment announcements from processes serving segments to build cache of which process is serving which segments, this configuration allows to only consider segments being served from a whitelist of dataSources. By default, Broker would consider all datasources. This can be used to configure brokers in partitions so that they are only queryable for specific dataSources.</td><td> [...]
@@ -2131,7 +2157,7 @@ for both Broker and Historical processes, when defined in the common properties
 </thead>
 <tbody>
 <tr><td><code>druid.cache.type</code></td><td>Set this to <code>caffeine</code> or leave out parameter</td><td><code>caffeine</code></td></tr>
-<tr><td><code>druid.cache.sizeInBytes</code></td><td>The maximum size of the cache in bytes on heap. It can be configured as described in <a href="/docs/latest/configuration/human-readable-byte.html">here</a>.</td><td>min(1GiB, Runtime.maxMemory / 10)</td></tr>
+<tr><td><code>druid.cache.sizeInBytes</code></td><td>The maximum size of the cache in bytes on heap. It can be configured as described in <a href="/docs/24.0.0/configuration/human-readable-byte.html">here</a>.</td><td>min(1GiB, Runtime.maxMemory / 10)</td></tr>
 <tr><td><code>druid.cache.expireAfter</code></td><td>The time (in ms) after an access for which a cache entry may be expired</td><td>None (no time limit)</td></tr>
 <tr><td><code>druid.cache.cacheExecutorFactory</code></td><td>The executor factory to use for Caffeine maintenance. One of <code>COMMON_FJP</code>, <code>SINGLE_THREAD</code>, or <code>SAME_THREAD</code></td><td>ForkJoinPool common pool (<code>COMMON_FJP</code>)</td></tr>
 <tr><td><code>druid.cache.evictOnClose</code></td><td>If a close of a namespace (ex: removing a segment from a process) should cause an eager eviction of associated cache values</td><td><code>false</code></td></tr>
@@ -2194,7 +2220,7 @@ If there is an L1 miss and L2 hit, it will also populate L1.</p>
 <h2><a class="anchor" aria-hidden="true" id="general-query-configuration"></a><a href="#general-query-configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
 <p>This section describes configurations that control behavior of Druid's query types, applicable to Broker, Historical, and MiddleManager processes.</p>
 <h3><a class="anchor" aria-hidden="true" id="overriding-default-query-context-values"></a><a href="#overriding-default-query-context-values" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2  [...]
-<p>Any <a href="/docs/latest/querying/query-context.html#general-parameters">Query Context General Parameter</a> default value can be
+<p>Any <a href="/docs/24.0.0/querying/query-context.html#general-parameters">Query Context General Parameter</a> default value can be
 overridden by setting runtime property in the format of <code>druid.query.default.context.{query_context_key}</code>.
 <code>druid.query.default.context.{query_context_key}</code> runtime property prefix applies to all current and future
 query context keys, the same as how query context parameter passed with the query works. Note that the runtime property
@@ -2222,7 +2248,7 @@ context). If query does have <code>maxQueuedBytes</code> in the context, then th
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
-<tr><td><code>druid.query.topN.minTopNThreshold</code></td><td>See <a href="/docs/latest/querying/topnquery.html#aliasing">TopN Aliasing</a> for details.</td><td>1000</td></tr>
+<tr><td><code>druid.query.topN.minTopNThreshold</code></td><td>See <a href="/docs/24.0.0/querying/topnquery.html#aliasing">TopN Aliasing</a> for details.</td><td>1000</td></tr>
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="search-query-config"></a><a href="#search-query-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
@@ -2246,7 +2272,7 @@ context). If query does have <code>maxQueuedBytes</code> in the context, then th
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="groupby-query-config"></a><a href="#groupby-query-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
-<p>This section describes the configurations for groupBy queries. You can set the runtime properties in the <code>runtime.properties</code> file on Broker, Historical, and MiddleManager processes. You can set the query context parameters through the <a href="/docs/latest/querying/query-context.html">query context</a>.</p>
+<p>This section describes the configurations for groupBy queries. You can set the runtime properties in the <code>runtime.properties</code> file on Broker, Historical, and MiddleManager processes. You can set the query context parameters through the <a href="/docs/24.0.0/querying/query-context.html">query context</a>.</p>
 <h4><a class="anchor" aria-hidden="true" id="configurations-for-groupby-v2"></a><a href="#configurations-for-groupby-v2" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12  [...]
 <p>Supported runtime properties:</p>
 <table>
@@ -2254,9 +2280,10 @@ context). If query does have <code>maxQueuedBytes</code> in the context, then th
 <tr><th>Property</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
-<tr><td><code>druid.query.groupBy.maxSelectorDictionarySize</code></td><td>Maximum amount of heap space (approximately) to use for per-segment string dictionaries. See <a href="/docs/latest/querying/groupbyquery.html#memory-tuning-and-resource-limits">groupBy memory tuning and resource limits</a> for details.</td><td>100000000</td></tr>
-<tr><td><code>druid.query.groupBy.maxMergingDictionarySize</code></td><td>Maximum amount of heap space (approximately) to use for per-query string dictionaries. When the dictionary exceeds this size, a spill to disk will be triggered. See <a href="/docs/latest/querying/groupbyquery.html#memory-tuning-and-resource-limits">groupBy memory tuning and resource limits</a> for details.</td><td>100000000</td></tr>
+<tr><td><code>druid.query.groupBy.maxSelectorDictionarySize</code></td><td>Maximum amount of heap space (approximately) to use for per-segment string dictionaries. See <a href="/docs/24.0.0/querying/groupbyquery.html#memory-tuning-and-resource-limits">groupBy memory tuning and resource limits</a> for details.</td><td>100000000</td></tr>
+<tr><td><code>druid.query.groupBy.maxMergingDictionarySize</code></td><td>Maximum amount of heap space (approximately) to use for per-query string dictionaries. When the dictionary exceeds this size, a spill to disk will be triggered. See <a href="/docs/24.0.0/querying/groupbyquery.html#memory-tuning-and-resource-limits">groupBy memory tuning and resource limits</a> for details.</td><td>100000000</td></tr>
 <tr><td><code>druid.query.groupBy.maxOnDiskStorage</code></td><td>Maximum amount of disk space to use, per-query, for spilling result sets to disk when either the merging buffer or the dictionary fills up. Queries that exceed this limit will fail. Set to zero to disable disk spilling.</td><td>0 (disabled)</td></tr>
+<tr><td><code>druid.query.groupBy.defaultOnDiskStorage</code></td><td>Default amount of disk space to use, per-query, for spilling the result sets to disk when either the merging buffer or the dictionary fills up. Set to zero to disable disk spilling for queries which don't override <code>maxOnDiskStorage</code> in their context.</td><td><code>druid.query.groupBy.maxOnDiskStorage</code></td></tr>
 </tbody>
 </table>
 <p>Supported query contexts:</p>
@@ -2267,7 +2294,7 @@ context). If query does have <code>maxQueuedBytes</code> in the context, then th
 <tbody>
 <tr><td><code>maxSelectorDictionarySize</code></td><td>Can be used to lower the value of <code>druid.query.groupBy.maxMergingDictionarySize</code> for this query.</td></tr>
 <tr><td><code>maxMergingDictionarySize</code></td><td>Can be used to lower the value of <code>druid.query.groupBy.maxMergingDictionarySize</code> for this query.</td></tr>
-<tr><td><code>maxOnDiskStorage</code></td><td>Can be used to lower the value of <code>druid.query.groupBy.maxOnDiskStorage</code> for this query.</td></tr>
+<tr><td><code>maxOnDiskStorage</code></td><td>Can be used to set <code>maxOnDiskStorage</code> to a value between 0 and <code>druid.query.groupBy.maxOnDiskStorage</code> for this query. If this query context override exceeds <code>druid.query.groupBy.maxOnDiskStorage</code>, the query will use <code>druid.query.groupBy.maxOnDiskStorage</code>. Omitting this from the query context will cause the query to use <code>druid.query.groupBy.defaultOnDiskStorage</code> for <code>maxOnDiskStorage< [...]
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="advanced-configurations"></a><a href="#advanced-configurations" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
@@ -2349,7 +2376,7 @@ context). If query does have <code>maxQueuedBytes</code> in the context, then th
 <tr><th>Key</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
-<tr><td><code>druid.expressions.useStrictBooleans</code></td><td>Controls the behavior of Druid boolean operators and functions, if set to <code>true</code> all boolean values will be either a <code>1</code> or <code>0</code>. See <a href="/docs/latest/misc/math-expr.html#logical-operator-modes">expression documentation</a></td><td>false</td></tr>
+<tr><td><code>druid.expressions.useStrictBooleans</code></td><td>Controls the behavior of Druid boolean operators and functions, if set to <code>true</code> all boolean values will be either a <code>1</code> or <code>0</code>. See <a href="/docs/24.0.0/misc/math-expr.html#logical-operator-modes">expression documentation</a></td><td>false</td></tr>
 <tr><td><code>druid.expressions.allowNestedArrays</code></td><td>If enabled, Druid array expressions can create nested arrays. This is experimental and should be used with caution.</td><td>false</td></tr>
 </tbody>
 </table>
@@ -2363,7 +2390,7 @@ context). If query does have <code>maxQueuedBytes</code> in the context, then th
 <tr><td><code>druid.host</code></td><td>The host for the current process. This is used to advertise the current processes location as reachable from another process and should generally be specified such that <code>http://${druid.host}/</code> could actually talk to this process</td><td>InetAddress.getLocalHost().getCanonicalHostName()</td></tr>
 <tr><td><code>druid.bindOnHost</code></td><td>Indicating whether the process's internal jetty server bind on <code>druid.host</code>. Default is false, which means binding to all interfaces.</td><td>false</td></tr>
 <tr><td><code>druid.plaintextPort</code></td><td>This is the port to actually listen on; unless port mapping is used, this will be the same port as is on <code>druid.host</code></td><td>8888</td></tr>
-<tr><td><code>druid.tlsPort</code></td><td>TLS port for HTTPS connector, if <a href="/docs/latest/operations/tls-support.html">druid.enableTlsPort</a> is set then this config will be used. If <code>druid.host</code> contains port then that port will be ignored. This should be a non-negative Integer.</td><td>9088</td></tr>
+<tr><td><code>druid.tlsPort</code></td><td>TLS port for HTTPS connector, if <a href="/docs/24.0.0/operations/tls-support.html">druid.enableTlsPort</a> is set then this config will be used. If <code>druid.host</code> contains port then that port will be ignored. This should be a non-negative Integer.</td><td>9088</td></tr>
 <tr><td><code>druid.service</code></td><td>The name of the service. This is used as a dimension when emitting metrics and alerts to differentiate between the various services</td><td>druid/router</td></tr>
 </tbody>
 </table>
@@ -2378,9 +2405,9 @@ context). If query does have <code>maxQueuedBytes</code> in the context, then th
 <tr><td><code>druid.router.defaultRule</code></td><td>The default rule for all datasources.</td><td>&quot;_default&quot;</td></tr>
 <tr><td><code>druid.router.pollPeriod</code></td><td>How often to poll for new rules.</td><td>PT1M</td></tr>
 <tr><td><code>druid.router.sql.enable</code></td><td>Enable routing of SQL queries using strategies. When<code>true</code>, the Router uses the  strategies defined in <code>druid.router.strategies</code> to determine the broker service for a given SQL query. When <code>false</code>, the Router uses the <code>defaultBrokerServiceName</code>.</td><td><code>false</code></td></tr>
-<tr><td><code>druid.router.strategies</code></td><td>Please see <a href="/docs/latest/design/router.html#router-strategies">Router Strategies</a> for details.</td><td>[{&quot;type&quot;:&quot;timeBoundary&quot;},{&quot;type&quot;:&quot;priority&quot;}]</td></tr>
-<tr><td><code>druid.router.avatica.balancer.type</code></td><td>Class to use for balancing Avatica queries across Brokers. Please see <a href="/docs/latest/design/router.html#avatica-query-balancing">Avatica Query Balancing</a>.</td><td>rendezvousHash</td></tr>
-<tr><td><code>druid.router.managementProxy.enabled</code></td><td>Enables the Router's <a href="/docs/latest/design/router.html#router-as-management-proxy">management proxy</a> functionality.</td><td>false</td></tr>
+<tr><td><code>druid.router.strategies</code></td><td>Please see <a href="/docs/24.0.0/design/router.html#router-strategies">Router Strategies</a> for details.</td><td>[{&quot;type&quot;:&quot;timeBoundary&quot;},{&quot;type&quot;:&quot;priority&quot;}]</td></tr>
+<tr><td><code>druid.router.avatica.balancer.type</code></td><td>Class to use for balancing Avatica queries across Brokers. Please see <a href="/docs/24.0.0/design/router.html#avatica-query-balancing">Avatica Query Balancing</a>.</td><td>rendezvousHash</td></tr>
+<tr><td><code>druid.router.managementProxy.enabled</code></td><td>Enables the Router's <a href="/docs/24.0.0/design/router.html#router-as-management-proxy">management proxy</a> functionality.</td><td>false</td></tr>
 <tr><td><code>druid.router.http.numConnections</code></td><td>Size of connection pool for the Router to connect to Broker processes. If there are more queries than this number that all need to speak to the same process, then they will queue up.</td><td><code>20</code></td></tr>
 <tr><td><code>druid.router.http.eagerInitialization</code></td><td>Indicates that http connections from Router to Broker should be eagerly initialized. If set to true, <code>numConnections</code> connections are created upon initialization</td><td><code>true</code></td></tr>
 <tr><td><code>druid.router.http.readTimeout</code></td><td>The timeout for data reads from Broker processes.</td><td><code>PT15M</code></td></tr>
@@ -2389,7 +2416,7 @@ context). If query does have <code>maxQueuedBytes</code> in the context, then th
 <tr><td><code>druid.router.http.requestBuffersize</code></td><td>Size of the content buffer for receiving requests. These buffers are only used for active connections that have requests with bodies that will not fit within the header buffer</td><td><code>8 * 1024</code></td></tr>
 </tbody>
 </table>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/latest/development/geo.html"><span class="arrow-prev">← </span><span>Spatial filters</span></a><a class="docs-next button" href="/docs/latest/development/extensions.html"><span>Extensions</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#recommended-configuration-file-organization">Recommended Configuration File Organiza [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/development/geo.html"><span class="arrow-prev">← </span><span>Spatial filters</span></a><a class="docs-next button" href="/docs/24.0.0/development/extensions.html"><span>Extensions</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#recommended-configuration-file-organization">Recommended Configuration File Organiza [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
@@ -2406,6 +2433,6 @@ context). If query does have <code>maxQueuedBytes</code> in the context, then th
                 apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
                 indexName: 'apache_druid',
                 inputSelector: '#search_input_react',
-                algoliaOptions: {"facetFilters":["language:en","version:0.23.0"]}
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
               });
             </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/configuration/indexing-service.html b/docs/24.0.0/configuration/indexing-service.html
new file mode 100644
index 00000000..4189126d
--- /dev/null
+++ b/docs/24.0.0/configuration/indexing-service.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../configuration/index.html#overlord">
+<meta http-equiv="refresh" content="0; url=../configuration/index.html#overlord">
+<h1>Redirecting...</h1>
+<a href="../configuration/index.html#overlord">Click here if you are not redirected.</a>
+<script>location="../configuration/index.html#overlord"</script>
diff --git a/docs/24.0.0/configuration/logging.html b/docs/24.0.0/configuration/logging.html
new file mode 100644
index 00000000..dff67cc8
--- /dev/null
+++ b/docs/24.0.0/configuration/logging.html
@@ -0,0 +1,198 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Logging · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/configuration/logging.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24.0.0" /><meta prop [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/configuration/logging.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Logging</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>Apache Druid processes will emit logs that are useful for debugging to log files.
+These processes also emit periodic <a href="/docs/24.0.0/configuration/index.html#enabling-metrics">metrics</a> about their state.
+Metric info logs can be disabled with <code>-Ddruid.emitter.logging.logLevel=debug</code>.</p>
+<p>Druid uses <a href="http://logging.apache.org/log4j/2.x/">log4j2</a> for logging.
+The default configuration file log4j2.xml ships with Druid under conf/druid/{config}/_common/log4j2.xml .</p>
+<p>By default, Druid uses <code>RollingRandomAccessFile</code> for rollover daily, and keeps log files up to 7 days.
+If that's not suitable in your case, you could modify the log4j2.xml to meet your need.</p>
+<p>An example log4j2.xml file is shown below:</p>
+<pre><code class="hljs"><span class="xml"><span class="hljs-meta">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</span>
+<span class="hljs-tag">&lt;<span class="hljs-name">Configuration</span> <span class="hljs-attr">status</span>=<span class="hljs-string">"WARN"</span>&gt;</span>
+  <span class="hljs-tag">&lt;<span class="hljs-name">Console</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"Console"</span> <span class="hljs-attr">target</span>=<span class="hljs-string">"SYSTEM_OUT"</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">PatternLayout</span> <span class="hljs-attr">pattern</span>=<span class="hljs-string">"%d</span></span></span><span class="hljs-template-variable">{ISO8601}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string"> %p [%t] %c - %m%n"</span>/&gt;</span>
+  <span class="hljs-tag">&lt;/<span class="hljs-name">Console</span>&gt;</span>
+    
+  <span class="hljs-tag">&lt;<span class="hljs-name">RollingRandomAccessFile</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"FileAppender"</span>
+                           <span class="hljs-attr">fileName</span>=<span class="hljs-string">"$</span></span></span><span class="hljs-template-variable">{sys:druid.log.path}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">/$</span></span></span><span class="hljs-template-variable">{sys:druid.node.type}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">.log"</span>
+                           <span class="hljs-attr">filePattern</span>=<span class="hljs-string">"$</span></span></span><span class="hljs-template-variable">{sys:druid.log.path}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">/$</span></span></span><span class="hljs-template-variable">{sys:druid.node.type}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">.%d</span></span></span><span class="hljs-template-variable">{yyyyMMdd}</span><span cla [...]
+    <span class="hljs-tag">&lt;<span class="hljs-name">PatternLayout</span> <span class="hljs-attr">pattern</span>=<span class="hljs-string">"%d</span></span></span><span class="hljs-template-variable">{ISO8601}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string"> %p [%t] %c - %m%n"</span>/&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">Policies</span>&gt;</span>
+        <span class="hljs-tag">&lt;<span class="hljs-name">TimeBasedTriggeringPolicy</span> <span class="hljs-attr">interval</span>=<span class="hljs-string">"1"</span> <span class="hljs-attr">modulate</span>=<span class="hljs-string">"true"</span>/&gt;</span>
+    <span class="hljs-tag">&lt;/<span class="hljs-name">Policies</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">DefaultRolloverStrategy</span>&gt;</span>
+      <span class="hljs-tag">&lt;<span class="hljs-name">Delete</span> <span class="hljs-attr">basePath</span>=<span class="hljs-string">"$</span></span></span><span class="hljs-template-variable">{sys:druid.log.path}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">/"</span> <span class="hljs-attr">maxDepth</span>=<span class="hljs-string">"1"</span>&gt;</span>
+        <span class="hljs-tag">&lt;<span class="hljs-name">IfFileName</span> <span class="hljs-attr">glob</span>=<span class="hljs-string">"*.log"</span> /&gt;</span>
+        <span class="hljs-tag">&lt;<span class="hljs-name">IfLastModified</span> <span class="hljs-attr">age</span>=<span class="hljs-string">"7d"</span> /&gt;</span>
+      <span class="hljs-tag">&lt;/<span class="hljs-name">Delete</span>&gt;</span>
+    <span class="hljs-tag">&lt;/<span class="hljs-name">DefaultRolloverStrategy</span>&gt;</span>
+  <span class="hljs-tag">&lt;/<span class="hljs-name">RollingRandomAccessFile</span>&gt;</span>
+  <span class="hljs-tag">&lt;<span class="hljs-name">Loggers</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">Root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">"info"</span>&gt;</span>
+      <span class="hljs-tag">&lt;<span class="hljs-name">AppenderRef</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"FileAppender"</span>/&gt;</span>
+    <span class="hljs-tag">&lt;/<span class="hljs-name">Root</span>&gt;</span>
+
+    <span class="hljs-comment">&lt;!-- Uncomment to enable logging of all HTTP requests
+    &lt;Logger name="org.apache.druid.jetty.RequestLog" additivity="false" level="DEBUG"&gt;
+        &lt;AppenderRef ref="FileAppender"/&gt;
+    &lt;/Logger&gt;
+    --&gt;</span>
+  <span class="hljs-tag">&lt;/<span class="hljs-name">Loggers</span>&gt;</span>
+<span class="hljs-tag">&lt;/<span class="hljs-name">Configuration</span>&gt;</span>
+</span></code></pre>
+<blockquote>
+<p>NOTE:
+Although the log4j configuration file is shared with Druid's task peon processes,
+the appenders in this file DO NOT take effect for peon processes, which always output logs to standard output.
+Middle Managers redirect task logs from standard output to <a href="/docs/24.0.0/configuration/index.html#log-long-term-storage">long-term storage</a>.</p>
+<p>However, log level settings do take effect for these task peon processes,
+which means you can still configure loggers at different logging level for task logs using <code>log4j2.xml</code>.</p>
+</blockquote>
+<h2><a class="anchor" aria-hidden="true" id="log-directory"></a><a href="#log-directory" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>The included log4j2.xml configuration for Druid and ZooKeeper will output logs to the <code>log</code> directory at the root of the distribution.</p>
+<p>If you want to change the log directory, set the environment variable <code>DRUID_LOG_DIR</code> to the right directory before you start Druid.</p>
+<h2><a class="anchor" aria-hidden="true" id="all-in-one-start-commands"></a><a href="#all-in-one-start-commands" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
+<p>If you use one of the all-in-one start commands, such as <code>bin/start-micro-quickstart</code>, then in the default configuration
+each service has two kind of log files. The main log file (for example, <code>log/historical.log</code>) is written by log4j2 and
+is rotated periodically.</p>
+<p>The secondary log file (for example, <code>log/historical.stdout.log</code>) contains anything that is written by the component
+directly to standard output or standard error without going through log4j2. This consists mainly of messages from the
+Java runtime itself. This file is not rotated, but it is generally small due to the low volume of messages. If
+necessary, you can truncate it using the Linux command <code>truncate --size 0 log/historical.stdout.log</code>.</p>
+<h2><a class="anchor" aria-hidden="true" id="avoid-reflective-access-warnings-in-logs"></a><a href="#avoid-reflective-access-warnings-in-logs" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0  [...]
+<p>On Java 11, you may see warnings like this in log files:</p>
+<pre><code class="hljs"><span class="hljs-symbol">WARNING: </span>An illegal reflective access operation has occurred
+<span class="hljs-symbol">WARNING: </span>Use --illegal-access=warn to enable warnings of further illegal reflective access operations
+<span class="hljs-symbol">WARNING: </span>All illegal access operations will be denied in a future release
+</code></pre>
+<p>To avoid these, add the <code>--add-exports</code> and <code>--add-opens</code> command line parameters described in the documentation section
+about <a href="/docs/24.0.0/operations/java.html#strong-encapsulation">Java strong encapsulation</a>.</p>
+<h2><a class="anchor" aria-hidden="true" id="my-logs-are-really-chatty-can-i-set-them-to-asynchronously-write"></a><a href="#my-logs-are-really-chatty-can-i-set-them-to-asynchronously-write" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8  [...]
+<p>Yes, using a <code>log4j2.xml</code> similar to the following causes some of the more chatty classes to write asynchronously:</p>
+<pre><code class="hljs"><span class="xml"><span class="hljs-meta">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</span>
+<span class="hljs-tag">&lt;<span class="hljs-name">Configuration</span> <span class="hljs-attr">status</span>=<span class="hljs-string">"WARN"</span>&gt;</span>
+  <span class="hljs-tag">&lt;<span class="hljs-name">Appenders</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">Console</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"Console"</span> <span class="hljs-attr">target</span>=<span class="hljs-string">"SYSTEM_OUT"</span>&gt;</span>
+      <span class="hljs-tag">&lt;<span class="hljs-name">PatternLayout</span> <span class="hljs-attr">pattern</span>=<span class="hljs-string">"%d</span></span></span><span class="hljs-template-variable">{ISO8601}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string"> %p [%t] %c - %m%n"</span>/&gt;</span>
+    <span class="hljs-tag">&lt;/<span class="hljs-name">Console</span>&gt;</span>
+  <span class="hljs-tag">&lt;/<span class="hljs-name">Appenders</span>&gt;</span>
+  
+<span class="hljs-tag">&lt;<span class="hljs-name">Loggers</span>&gt;</span>
+    <span class="hljs-comment">&lt;!-- AsyncLogger instead of Logger --&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">AsyncLogger</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"org.apache.druid.curator.inventory.CuratorInventoryManager"</span> <span class="hljs-attr">level</span>=<span class="hljs-string">"debug"</span> <span class="hljs-attr">additivity</span>=<span class="hljs-string">"false"</span>&gt;</span>
+      <span class="hljs-tag">&lt;<span class="hljs-name">AppenderRef</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"Console"</span>/&gt;</span>
+    <span class="hljs-tag">&lt;/<span class="hljs-name">AsyncLogger</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">AsyncLogger</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"org.apache.druid.client.BatchServerInventoryView"</span> <span class="hljs-attr">level</span>=<span class="hljs-string">"debug"</span> <span class="hljs-attr">additivity</span>=<span class="hljs-string">"false"</span>&gt;</span>
+      <span class="hljs-tag">&lt;<span class="hljs-name">AppenderRef</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"Console"</span>/&gt;</span>
+    <span class="hljs-tag">&lt;/<span class="hljs-name">AsyncLogger</span>&gt;</span>
+    <span class="hljs-comment">&lt;!-- Make extra sure nobody adds logs in a bad way that can hurt performance --&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">AsyncLogger</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"org.apache.druid.client.ServerInventoryView"</span> <span class="hljs-attr">level</span>=<span class="hljs-string">"debug"</span> <span class="hljs-attr">additivity</span>=<span class="hljs-string">"false"</span>&gt;</span>
+      <span class="hljs-tag">&lt;<span class="hljs-name">AppenderRef</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"Console"</span>/&gt;</span>
+    <span class="hljs-tag">&lt;/<span class="hljs-name">AsyncLogger</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">AsyncLogger</span> <span class="hljs-attr">name</span> =<span class="hljs-string">"org.apache.druid.java.util.http.client.pool.ChannelResourceFactory"</span> <span class="hljs-attr">level</span>=<span class="hljs-string">"info"</span> <span class="hljs-attr">additivity</span>=<span class="hljs-string">"false"</span>&gt;</span>
+      <span class="hljs-tag">&lt;<span class="hljs-name">AppenderRef</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"Console"</span>/&gt;</span>
+    <span class="hljs-tag">&lt;/<span class="hljs-name">AsyncLogger</span>&gt;</span>
+    <span class="hljs-tag">&lt;<span class="hljs-name">Root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">"info"</span>&gt;</span>
+      <span class="hljs-tag">&lt;<span class="hljs-name">AppenderRef</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"Console"</span>/&gt;</span>
+    <span class="hljs-tag">&lt;/<span class="hljs-name">Root</span>&gt;</span>
+  <span class="hljs-tag">&lt;/<span class="hljs-name">Loggers</span>&gt;</span>
+<span class="hljs-tag">&lt;/<span class="hljs-name">Configuration</span>&gt;</span>
+</span></code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/development/extensions.html"><span class="arrow-prev">← </span><span>Extensions</span></a><a class="docs-next button" href="/docs/24.0.0/operations/druid-console.html"><span>Druid console</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#log-directory">Log directory</a></li><li><a href="#all-in-one-start-commands" [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/configuration/production-cluster.html b/docs/24.0.0/configuration/production-cluster.html
new file mode 100644
index 00000000..d3b1d39a
--- /dev/null
+++ b/docs/24.0.0/configuration/production-cluster.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../tutorials/cluster.html">
+<meta http-equiv="refresh" content="0; url=../tutorials/cluster.html">
+<h1>Redirecting...</h1>
+<a href="../tutorials/cluster.html">Click here if you are not redirected.</a>
+<script>location="../tutorials/cluster.html"</script>
diff --git a/docs/24.0.0/configuration/realtime.html b/docs/24.0.0/configuration/realtime.html
new file mode 100644
index 00000000..2f57fca1
--- /dev/null
+++ b/docs/24.0.0/configuration/realtime.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../ingestion/standalone-realtime.html">
+<meta http-equiv="refresh" content="0; url=../ingestion/standalone-realtime.html">
+<h1>Redirecting...</h1>
+<a href="../ingestion/standalone-realtime.html">Click here if you are not redirected.</a>
+<script>location="../ingestion/standalone-realtime.html"</script>
diff --git a/docs/24.0.0/configuration/simple-cluster.html b/docs/24.0.0/configuration/simple-cluster.html
new file mode 100644
index 00000000..d3b1d39a
--- /dev/null
+++ b/docs/24.0.0/configuration/simple-cluster.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../tutorials/cluster.html">
+<meta http-equiv="refresh" content="0; url=../tutorials/cluster.html">
+<h1>Redirecting...</h1>
+<a href="../tutorials/cluster.html">Click here if you are not redirected.</a>
+<script>location="../tutorials/cluster.html"</script>
diff --git a/docs/24.0.0/configuration/zookeeper.html b/docs/24.0.0/configuration/zookeeper.html
new file mode 100644
index 00000000..24b46306
--- /dev/null
+++ b/docs/24.0.0/configuration/zookeeper.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../dependencies/zookeeper.html">
+<meta http-equiv="refresh" content="0; url=../dependencies/zookeeper.html">
+<h1>Redirecting...</h1>
+<a href="../dependencies/zookeeper.html">Click here if you are not redirected.</a>
+<script>location="../dependencies/zookeeper.html"</script>
diff --git a/docs/24.0.0/dependencies/cassandra-deep-storage.html b/docs/24.0.0/dependencies/cassandra-deep-storage.html
new file mode 100644
index 00000000..c3328a41
--- /dev/null
+++ b/docs/24.0.0/dependencies/cassandra-deep-storage.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../development/extensions-contrib/cassandra.html">
+<meta http-equiv="refresh" content="0; url=../development/extensions-contrib/cassandra.html">
+<h1>Redirecting...</h1>
+<a href="../development/extensions-contrib/cassandra.html">Click here if you are not redirected.</a>
+<script>location="../development/extensions-contrib/cassandra.html"</script>
diff --git a/docs/24.0.0/dependencies/deep-storage.html b/docs/24.0.0/dependencies/deep-storage.html
new file mode 100644
index 00000000..df474d4c
--- /dev/null
+++ b/docs/24.0.0/dependencies/deep-storage.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Deep storage · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/dependencies/deep-storage.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24.0.0" />< [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/dependencies/deep-storage.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Deep storage</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>Deep storage is where segments are stored.  It is a storage mechanism that Apache Druid does not provide.  This deep storage infrastructure defines the level of durability of your data, as long as Druid processes can see this storage infrastructure and get at the segments stored on it, you will not lose data no matter how many Druid nodes you lose.  If segments disappear from this storage layer, then you will lose whatever data those segments represented.</p>
+<h2><a class="anchor" aria-hidden="true" id="local-mount"></a><a href="#local-mount" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
+<p>A local mount can be used for storage of segments as well.  This allows you to use just your local file system or anything else that can be mount locally like NFS, Ceph, etc.  This is the default deep storage implementation.</p>
+<p>In order to use a local mount for deep storage, you need to set the following configuration in your common configs.</p>
+<table>
+<thead>
+<tr><th>Property</th><th>Possible Values</th><th>Description</th><th>Default</th></tr>
+</thead>
+<tbody>
+<tr><td><code>druid.storage.type</code></td><td>local</td><td></td><td>Must be set.</td></tr>
+<tr><td><code>druid.storage.storageDirectory</code></td><td></td><td>Directory for storing segments.</td><td>Must be set.</td></tr>
+</tbody>
+</table>
+<p>Note that you should generally set <code>druid.storage.storageDirectory</code> to something different from <code>druid.segmentCache.locations</code> and <code>druid.segmentCache.infoDir</code>.</p>
+<p>If you are using the Hadoop indexer in local mode, then just give it a local file as your output directory and it will work.</p>
+<h2><a class="anchor" aria-hidden="true" id="s3-compatible"></a><a href="#s3-compatible" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>See <a href="/docs/24.0.0/development/extensions-core/s3.html">druid-s3-extensions extension documentation</a>.</p>
+<h2><a class="anchor" aria-hidden="true" id="hdfs"></a><a href="#hdfs" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
+<p>See <a href="/docs/24.0.0/development/extensions-core/hdfs.html">druid-hdfs-storage extension documentation</a>.</p>
+<h2><a class="anchor" aria-hidden="true" id="additional-deep-stores"></a><a href="#additional-deep-stores" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0 [...]
+<p>For additional deep stores, please see our <a href="/docs/24.0.0/development/extensions.html">extensions list</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/design/processes.html"><span class="arrow-prev">← </span><span>Processes and servers</span></a><a class="docs-next button" href="/docs/24.0.0/dependencies/metadata-storage.html"><span>Metadata storage</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#local-mount">Local Mount</a></li><li><a href="#s3-compatible">S3 [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/dependencies/metadata-storage.html b/docs/24.0.0/dependencies/metadata-storage.html
new file mode 100644
index 00000000..c287e1b6
--- /dev/null
+++ b/docs/24.0.0/dependencies/metadata-storage.html
@@ -0,0 +1,207 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Metadata storage · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/dependencies/metadata-storage.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24. [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/dependencies/metadata-storage.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Metadata storage</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>Apache Druid relies on an external dependency for metadata storage.
+Druid uses the metadata store to house various metadata about the system, but not to store the actual data.
+The metadata store retains all metadata essential for a Druid cluster to work.</p>
+<p>The metadata store includes the following:</p>
+<ul>
+<li>Segments records</li>
+<li>Rule records</li>
+<li>Configuration records</li>
+<li>Task-related tables</li>
+<li>Audit records</li>
+</ul>
+<p>Derby is the default metadata store for Druid, however, it is not suitable for production.
+<a href="/docs/24.0.0/development/extensions-core/mysql.html">MySQL</a> and <a href="/docs/24.0.0/development/extensions-core/postgresql.html">PostgreSQL</a> are more production suitable metadata stores.
+See <a href="/docs/24.0.0/configuration/index.html#metadata-storage">Metadata storage configuration</a> for the default configuration settings.</p>
+<blockquote>
+<p>We also recommend you set up a high availability environment because there is no way to restore lost metadata.</p>
+</blockquote>
+<h2><a class="anchor" aria-hidden="true" id="available-metadata-stores"></a><a href="#available-metadata-stores" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
+<p>Druid supports Derby, MySQL, and PostgreSQL for storing metadata.</p>
+<h3><a class="anchor" aria-hidden="true" id="derby"></a><a href="#derby" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
+<blockquote>
+<p>For production clusters, consider using MySQL or PostgreSQL instead of Derby.</p>
+</blockquote>
+<p>Configure metadata storage with Derby by setting the following properties in your Druid configuration.</p>
+<pre><code class="hljs css language-properties"><span class="hljs-meta">druid.metadata.storage.type</span>=<span class="hljs-string">derby</span>
+<span class="hljs-meta">druid.metadata.storage.connector.connectURI</span>=<span class="hljs-string">jdbc:derby://localhost:1527//opt/var/druid_state/derby;create=true</span>
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="mysql"></a><a href="#mysql" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
+<p>See <a href="/docs/24.0.0/development/extensions-core/mysql.html">mysql-metadata-storage extension documentation</a>.</p>
+<h3><a class="anchor" aria-hidden="true" id="postgresql"></a><a href="#postgresql" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<p>See <a href="/docs/24.0.0/development/extensions-core/postgresql.html">postgresql-metadata-storage</a>.</p>
+<h2><a class="anchor" aria-hidden="true" id="adding-custom-dbcp-properties"></a><a href="#adding-custom-dbcp-properties" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12  [...]
+<p>You can add custom properties to customize the database connection pool (DBCP) for connecting to the metadata store.
+Define these properties with a <code>druid.metadata.storage.connector.dbcp.</code> prefix.
+For example:</p>
+<pre><code class="hljs css language-properties"><span class="hljs-meta">druid.metadata.storage.connector.dbcp.maxConnLifetimeMillis</span>=<span class="hljs-string">1200000</span>
+<span class="hljs-meta">druid.metadata.storage.connector.dbcp.defaultQueryTimeout</span>=<span class="hljs-string">30000</span>
+</code></pre>
+<p>Certain properties cannot be set through <code>druid.metadata.storage.connector.dbcp.</code> and must be set with the prefix <code>druid.metadata.storage.connector.</code>:</p>
+<ul>
+<li><code>username</code></li>
+<li><code>password</code></li>
+<li><code>connectURI</code></li>
+<li><code>validationQuery</code></li>
+<li><code>testOnBorrow</code></li>
+</ul>
+<p>See <a href="https://commons.apache.org/proper/commons-dbcp/configuration">BasicDataSource Configuration</a> for a full list of configurable properties.</p>
+<h2><a class="anchor" aria-hidden="true" id="metadata-storage-tables"></a><a href="#metadata-storage-tables" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
+<p>This section describes the various tables in metadata storage.</p>
+<h3><a class="anchor" aria-hidden="true" id="segments-table"></a><a href="#segments-table" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p>This is dictated by the <code>druid.metadata.storage.tables.segments</code> property.</p>
+<p>This table stores metadata about the segments that should be available in the system. (This set of segments is called
+&quot;used segments&quot; elsewhere in the documentation and throughout the project.) The table is polled by the
+<a href="/docs/24.0.0/design/coordinator.html">Coordinator</a> to determine the set of segments that should be available for querying in the
+system. The table has two main functional columns, the other columns are for indexing purposes.</p>
+<p>Value 1 in the <code>used</code> column means that the segment should be &quot;used&quot; by the cluster (i.e., it should be loaded and
+available for requests). Value 0 means that the segment should not be loaded into the cluster. We do this as a means of
+unloading segments from the cluster without actually removing their metadata (which allows for simpler rolling back if
+that is ever an issue).</p>
+<p>The <code>payload</code> column stores a JSON blob that has all of the metadata for the segment.
+Some of the data in the <code>payload</code> column intentionally duplicates data from other columns in the segments table.
+As an example, the <code>payload</code> column may take the following form:</p>
+<pre><code class="hljs css language-json">{
+ <span class="hljs-attr">"dataSource"</span>:<span class="hljs-string">"wikipedia"</span>,
+ <span class="hljs-attr">"interval"</span>:<span class="hljs-string">"2012-05-23T00:00:00.000Z/2012-05-24T00:00:00.000Z"</span>,
+ <span class="hljs-attr">"version"</span>:<span class="hljs-string">"2012-05-24T00:10:00.046Z"</span>,
+ <span class="hljs-attr">"loadSpec"</span>:{
+    <span class="hljs-attr">"type"</span>:<span class="hljs-string">"s3_zip"</span>,
+    <span class="hljs-attr">"bucket"</span>:<span class="hljs-string">"bucket_for_segment"</span>,
+    <span class="hljs-attr">"key"</span>:<span class="hljs-string">"path/to/segment/on/s3"</span>
+ },
+ <span class="hljs-attr">"dimensions"</span>:<span class="hljs-string">"comma-delimited-list-of-dimension-names"</span>,
+ <span class="hljs-attr">"metrics"</span>:<span class="hljs-string">"comma-delimited-list-of-metric-names"</span>,
+ <span class="hljs-attr">"shardSpec"</span>:{<span class="hljs-attr">"type"</span>:<span class="hljs-string">"none"</span>},
+ <span class="hljs-attr">"binaryVersion"</span>:<span class="hljs-number">9</span>,
+ <span class="hljs-attr">"size"</span>:size_of_segment,
+ <span class="hljs-attr">"identifier"</span>:<span class="hljs-string">"wikipedia_2012-05-23T00:00:00.000Z_2012-05-24T00:00:00.000Z_2012-05-23T00:10:00.046Z"</span>
+}
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="rule-table"></a><a href="#rule-table" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<p>The rule table stores the various rules about where segments should
+land. These rules are used by the <a href="/docs/24.0.0/design/coordinator.html">Coordinator</a>
+when making segment (re-)allocation decisions about the cluster.</p>
+<h3><a class="anchor" aria-hidden="true" id="config-table"></a><a href="#config-table" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
+<p>The config table stores runtime configuration objects. We do not have
+many of these yet and we are not sure if we will keep this mechanism going
+forward, but it is the beginnings of a method of changing some configuration
+parameters across the cluster at runtime.</p>
+<h3><a class="anchor" aria-hidden="true" id="task-related-tables"></a><a href="#task-related-tables" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<p>Task-related tables are created and used by the <a href="/docs/24.0.0/design/overlord.html">Overlord</a> and <a href="/docs/24.0.0/design/middlemanager.html">MiddleManager</a> when managing tasks.</p>
+<h3><a class="anchor" aria-hidden="true" id="audit-table"></a><a href="#audit-table" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
+<p>The audit table stores the audit history for configuration changes
+such as rule changes done by <a href="/docs/24.0.0/design/coordinator.html">Coordinator</a> and other
+config changes.</p>
+<h2><a class="anchor" aria-hidden="true" id="metadata-storage-access"></a><a href="#metadata-storage-access" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
+<p>Only the following processes access the metadata storage:</p>
+<ol>
+<li>Indexing service processes (if any)</li>
+<li>Realtime processes (if any)</li>
+<li>Coordinator processes</li>
+</ol>
+<p>Thus you need to give permissions (e.g., in AWS security groups) for only these machines to access the metadata storage.</p>
+<h2><a class="anchor" aria-hidden="true" id="learn-more"></a><a href="#learn-more" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<p>See the following topics for more information:</p>
+<ul>
+<li><a href="/docs/24.0.0/configuration/index.html#metadata-storage">Metadata storage configuration</a></li>
+<li><a href="/docs/24.0.0/operations/clean-metadata-store.html">Automated cleanup for metadata records</a></li>
+</ul>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/dependencies/deep-storage.html"><span class="arrow-prev">← </span><span>Deep storage</span></a><a class="docs-next button" href="/docs/24.0.0/dependencies/zookeeper.html"><span class="function-name-prevnext">ZooKeeper</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#available-metadata-stores">Available metadata s [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/dependencies/zookeeper.html b/docs/24.0.0/dependencies/zookeeper.html
new file mode 100644
index 00000000..3886eea8
--- /dev/null
+++ b/docs/24.0.0/dependencies/zookeeper.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>ZooKeeper · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/dependencies/zookeeper.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24.0.0" /><meta p [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/dependencies/zookeeper.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">ZooKeeper</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>Apache Druid uses <a href="http://zookeeper.apache.org/">Apache ZooKeeper</a> (ZK) for management of current cluster state.</p>
+<h2><a class="anchor" aria-hidden="true" id="minimum-zookeeper-versions"></a><a href="#minimum-zookeeper-versions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H [...]
+<p>Apache Druid supports ZooKeeper versions 3.5.x and above.</p>
+<blockquote>
+<p>Note: Starting with Apache Druid 0.22.0, support for ZooKeeper 3.4.x has been removed</p>
+</blockquote>
+<h2><a class="anchor" aria-hidden="true" id="zookeeper-operations"></a><a href="#zookeeper-operations" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<p>The operations that happen over ZK are</p>
+<ol>
+<li><a href="/docs/24.0.0/design/coordinator.html">Coordinator</a> leader election</li>
+<li>Segment &quot;publishing&quot; protocol from <a href="/docs/24.0.0/design/historical.html">Historical</a></li>
+<li>Segment load/drop protocol between <a href="/docs/24.0.0/design/coordinator.html">Coordinator</a> and <a href="/docs/24.0.0/design/historical.html">Historical</a></li>
+<li><a href="/docs/24.0.0/design/overlord.html">Overlord</a> leader election</li>
+<li><a href="/docs/24.0.0/design/overlord.html">Overlord</a> and <a href="/docs/24.0.0/design/middlemanager.html">MiddleManager</a> task management</li>
+</ol>
+<h2><a class="anchor" aria-hidden="true" id="coordinator-leader-election"></a><a href="#coordinator-leader-election" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>We use the Curator <a href="https://curator.apache.org/curator-recipes/leader-latch.html">LeaderLatch</a> recipe to perform leader election at path</p>
+<pre><code class="hljs">${druid<span class="hljs-selector-class">.zk</span><span class="hljs-selector-class">.paths</span>.coordinatorPath}/_COORDINATOR
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="segment-publishing-protocol-from-historical-and-realtime"></a><a href="#segment-publishing-protocol-from-historical-and-realtime" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.2 [...]
+<p>The <code>announcementsPath</code> and <code>servedSegmentsPath</code> are used for this.</p>
+<p>All <a href="/docs/24.0.0/design/historical.html">Historical</a> processes publish themselves on the <code>announcementsPath</code>, specifically, they will create an ephemeral znode at</p>
+<pre><code class="hljs"><span class="hljs-variable">${druid.zk.paths.announcementsPath}</span>/<span class="hljs-variable">${druid.host}</span>
+</code></pre>
+<p>Which signifies that they exist. They will also subsequently create a permanent znode at</p>
+<pre><code class="hljs"><span class="hljs-variable">${druid.zk.paths.servedSegmentsPath}</span>/<span class="hljs-variable">${druid.host}</span>
+</code></pre>
+<p>And as they load up segments, they will attach ephemeral znodes that look like</p>
+<pre><code class="hljs"><span class="hljs-variable">${druid.zk.paths.servedSegmentsPath}</span><span class="hljs-regexp">/${druid.host}/</span>_segment_identifier_
+</code></pre>
+<p>Processes like the <a href="/docs/24.0.0/design/coordinator.html">Coordinator</a> and <a href="/docs/24.0.0/design/broker.html">Broker</a> can then watch these paths to see which processes are currently serving which segments.</p>
+<h2><a class="anchor" aria-hidden="true" id="segment-loaddrop-protocol-between-coordinator-and-historical"></a><a href="#segment-loaddrop-protocol-between-coordinator-and-historical" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 [...]
+<p>The <code>loadQueuePath</code> is used for this.</p>
+<p>When the <a href="/docs/24.0.0/design/coordinator.html">Coordinator</a> decides that a <a href="/docs/24.0.0/design/historical.html">Historical</a> process should load or drop a segment, it writes an ephemeral znode to</p>
+<pre><code class="hljs"><span class="hljs-variable">${druid.zk.paths.loadQueuePath}</span><span class="hljs-regexp">/_host_of_historical_process/</span>_segment_identifier
+</code></pre>
+<p>This znode will contain a payload that indicates to the Historical process what it should do with the given segment. When the Historical process is done with the work, it will delete the znode in order to signify to the Coordinator that it is complete.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/dependencies/metadata-storage.html"><span class="arrow-prev">← </span><span>Metadata storage</span></a><a class="docs-next button" href="/docs/24.0.0/ingestion/index.html"><span>Ingestion</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#minimum-zookeeper-versions">Minimum ZooKeeper versions</a></li><li><a href="# [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/latest/design/architecture.html b/docs/24.0.0/design/architecture.html
similarity index 56%
copy from docs/latest/design/architecture.html
copy to docs/24.0.0/design/architecture.html
index 109ab421..b6e00fd5 100644
--- a/docs/latest/design/architecture.html
+++ b/docs/24.0.0/design/architecture.html
@@ -1,9 +1,9 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Design · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/latest/design/architecture.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="0.23.0" /><meta propert [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Design · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/design/architecture.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24.0.0" /><meta propert [...]
               window.dataLayer = window.dataLayer || [];
               function gtag(){dataLayer.push(arguments); }
               gtag('js', new Date());
               gtag('config', 'UA-131010415-1');
-            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
@@ -85,12 +85,12 @@
 <h2><a class="anchor" aria-hidden="true" id="druid-services"></a><a href="#druid-services" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
 <p>Druid has several types of services:</p>
 <ul>
-<li><a href="/docs/latest/design/coordinator.html"><strong>Coordinator</strong></a> service manages data availability on the cluster.</li>
-<li><a href="/docs/latest/design/overlord.html"><strong>Overlord</strong></a> service controls the assignment of data ingestion workloads.</li>
-<li><a href="/docs/latest/design/broker.html"><strong>Broker</strong></a> handles queries from external clients.</li>
-<li><a href="/docs/latest/design/router.html"><strong>Router</strong></a> services are optional; they route requests to Brokers, Coordinators, and Overlords.</li>
-<li><a href="/docs/latest/design/historical.html"><strong>Historical</strong></a> services store queryable data.</li>
-<li><a href="/docs/latest/design/middlemanager.html"><strong>MiddleManager</strong></a> services ingest data.</li>
+<li><a href="/docs/24.0.0/design/coordinator.html"><strong>Coordinator</strong></a> service manages data availability on the cluster.</li>
+<li><a href="/docs/24.0.0/design/overlord.html"><strong>Overlord</strong></a> service controls the assignment of data ingestion workloads.</li>
+<li><a href="/docs/24.0.0/design/broker.html"><strong>Broker</strong></a> handles queries from external clients.</li>
+<li><a href="/docs/24.0.0/design/router.html"><strong>Router</strong></a> services are optional; they route requests to Brokers, Coordinators, and Overlords.</li>
+<li><a href="/docs/24.0.0/design/historical.html"><strong>Historical</strong></a> services store queryable data.</li>
+<li><a href="/docs/24.0.0/design/middlemanager.html"><strong>MiddleManager</strong></a> services ingest data.</li>
 </ul>
 <p>You can view services in the <strong>Services</strong> tab in the Druid console:</p>
 <p><img src="../assets/services-overview.png" alt="Druid services" title="Services in the Druid console"></p>
@@ -101,7 +101,7 @@
 <li><strong>Query</strong>: Runs Broker and optional Router processes, handles queries from external clients.</li>
 <li><strong>Data</strong>: Runs Historical and MiddleManager processes, executes ingestion workloads and stores all queryable data.</li>
 </ul>
-<p>For more details on process and server organization, please see <a href="/docs/latest/design/processes.html">Druid Processes and Servers</a>.</p>
+<p>For more details on process and server organization, please see <a href="/docs/24.0.0/design/processes.html">Druid Processes and Servers</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="external-dependencies"></a><a href="#external-dependencies" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
 <p>In addition to its built-in process types, Druid also has three external dependencies. These are intended to be able to
 leverage existing infrastructure, where present.</p>
@@ -117,21 +117,21 @@ during a query, helping it offer the best query latencies possible. It also mean
 both in deep storage and across your Historical servers for the data you plan to load.</p>
 <p>Deep storage is an important part of Druid's elastic, fault-tolerant design. Druid bootstraps from deep storage even
 if every single data server is lost and re-provisioned.</p>
-<p>For more details, please see the <a href="/docs/latest/dependencies/deep-storage.html">Deep storage</a> page.</p>
+<p>For more details, please see the <a href="/docs/24.0.0/dependencies/deep-storage.html">Deep storage</a> page.</p>
 <h3><a class="anchor" aria-hidden="true" id="metadata-storage"></a><a href="#metadata-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
 <p>The metadata storage holds various shared system metadata such as segment usage information and task information. In a
 clustered deployment, this is typically a traditional RDBMS like PostgreSQL or MySQL. In a single-server
 deployment, it is typically a locally-stored Apache Derby database.</p>
-<p>For more details, please see the <a href="/docs/latest/dependencies/metadata-storage.html">Metadata storage</a> page.</p>
+<p>For more details, please see the <a href="/docs/24.0.0/dependencies/metadata-storage.html">Metadata storage</a> page.</p>
 <h3><a class="anchor" aria-hidden="true" id="zookeeper"></a><a href="#zookeeper" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.6 [...]
 <p>Used for internal service discovery, coordination, and leader election.</p>
-<p>For more details, please see the <a href="/docs/latest/dependencies/zookeeper.html">ZooKeeper</a> page.</p>
+<p>For more details, please see the <a href="/docs/24.0.0/dependencies/zookeeper.html">ZooKeeper</a> page.</p>
 <h2><a class="anchor" aria-hidden="true" id="storage-design"></a><a href="#storage-design" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
 <h3><a class="anchor" aria-hidden="true" id="datasources-and-segments"></a><a href="#datasources-and-segments" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
 <p>Druid data is stored in <em>datasources</em>, which are similar to tables in a traditional RDBMS. Each datasource is
 partitioned by time and, optionally, further partitioned by other attributes. Each time range is called a <em>chunk</em> (for
 example, a single day, if your datasource is partitioned by day). Within a chunk, data is partitioned into one or more
-<a href="/docs/latest/design/segments.html"><em>segments</em></a>. Each segment is a single file, typically comprising up to a few million rows of data. Since segments are
+<a href="/docs/24.0.0/design/segments.html"><em>segments</em></a>. Each segment is a single file, typically comprising up to a few million rows of data. Since segments are
 organized into time chunks, it's sometimes helpful to think of segments as living on a timeline like the following:</p>
 <p><img src="../assets/druid-timeline.png" width="800" /></p>
 <p>A datasource may have anywhere from just a few segments, up to hundreds of thousands and even millions of segments. Each
@@ -153,8 +153,8 @@ become immutable, and move from MiddleManagers to the Historical processes. An e
 to the <a href="#metadata-storage">metadata store</a>. This entry is a self-describing bit of metadata about the segment, including
 things like the schema of the segment, its size, and its location on deep storage. These entries tell the
 Coordinator what data is available on the cluster.</p>
-<p>For details on the segment file format, please see <a href="/docs/latest/design/segments.html">segment files</a>.</p>
-<p>For details on modeling your data in Druid, see <a href="/docs/latest/ingestion/schema-design.html">schema design</a>.</p>
+<p>For details on the segment file format, please see <a href="/docs/24.0.0/design/segments.html">segment files</a>.</p>
+<p>For details on modeling your data in Druid, see <a href="/docs/24.0.0/ingestion/schema-design.html">schema design</a>.</p>
 <h3><a class="anchor" aria-hidden="true" id="indexing-and-handoff"></a><a href="#indexing-and-handoff" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
 <p><em>Indexing</em> is the mechanism by which new segments are created, and <em>handoff</em> is the mechanism by which they are published
 and begin being served by Historical processes. On the indexing side:</p>
@@ -213,7 +213,7 @@ new segments. Then it drops the old segments a few minutes later.</p>
 <p>Each segment has a lifecycle that involves the following three major areas:</p>
 <ol>
 <li><strong>Metadata store:</strong> Segment metadata (a small JSON payload generally no more than a few KB) is stored in the
-<a href="/docs/latest/dependencies/metadata-storage.html">metadata store</a> once a segment is done being constructed. The act of inserting
+<a href="/docs/24.0.0/dependencies/metadata-storage.html">metadata store</a> once a segment is done being constructed. The act of inserting
 a record for a segment into the metadata store is called <em>publishing</em>. These metadata records have a boolean flag
 named <code>used</code>, which controls whether the segment is intended to be queryable or not. Segments created by realtime tasks will be
 available before they are published, since they are only published when the segment is complete and will not accept
@@ -224,7 +224,7 @@ happens immediately before publishing metadata to the metadata store.</li>
 or a Historical process.</li>
 </ol>
 <p>You can inspect the state of currently active segments using the Druid SQL
-<a href="/docs/latest/querying/sql-metadata-tables.html#segments-table"><code>sys.segments</code> table</a>. It includes the following flags:</p>
+<a href="/docs/24.0.0/querying/sql-metadata-tables.html#segments-table"><code>sys.segments</code> table</a>. It includes the following flags:</p>
 <ul>
 <li><code>is_published</code>: True if segment metadata has been published to the metadata store and <code>used</code> is true.</li>
 <li><code>is_available</code>: True if the segment is currently available for querying, either on a realtime task or Historical
@@ -239,33 +239,33 @@ automatically set to false.</li>
 <p>Druid has an architectural separation between ingestion and querying, as described above in
 <a href="#indexing-and-handoff">Indexing and handoff</a>. This means that when understanding Druid's availability and
 consistency properties, we must look at each function separately.</p>
-<p>On the <strong>ingestion side</strong>, Druid's primary <a href="/docs/latest/ingestion/index.html#ingestion-methods">ingestion methods</a> are all
+<p>On the <strong>ingestion side</strong>, Druid's primary <a href="/docs/24.0.0/ingestion/index.html#ingestion-methods">ingestion methods</a> are all
 pull-based and offer transactional guarantees. This means that you are guaranteed that ingestion using these
 methods will publish in an all-or-nothing manner:</p>
 <ul>
-<li>Supervised &quot;seekable-stream&quot; ingestion methods like <a href="/docs/latest/development/extensions-core/kafka-ingestion.html">Kafka</a> and
-<a href="/docs/latest/development/extensions-core/kinesis-ingestion.html">Kinesis</a>. With these methods, Druid commits stream offsets to its
+<li>Supervised &quot;seekable-stream&quot; ingestion methods like <a href="/docs/24.0.0/development/extensions-core/kafka-ingestion.html">Kafka</a> and
+<a href="/docs/24.0.0/development/extensions-core/kinesis-ingestion.html">Kinesis</a>. With these methods, Druid commits stream offsets to its
 <a href="#metadata-storage">metadata store</a> alongside segment metadata, in the same transaction. Note that ingestion of data
 that has not yet been published can be rolled back if ingestion tasks fail. In this case, partially-ingested data is
 discarded, and Druid will resume ingestion from the last committed set of stream offsets. This ensures exactly-once
 publishing behavior.</li>
-<li><a href="/docs/latest/ingestion/hadoop.html">Hadoop-based batch ingestion</a>. Each task publishes all segment metadata in a single
+<li><a href="/docs/24.0.0/ingestion/hadoop.html">Hadoop-based batch ingestion</a>. Each task publishes all segment metadata in a single
 transaction.</li>
-<li><a href="/docs/latest/ingestion/native-batch.html">Native batch ingestion</a>. In parallel mode, the supervisor task publishes all segment
+<li><a href="/docs/24.0.0/ingestion/native-batch.html">Native batch ingestion</a>. In parallel mode, the supervisor task publishes all segment
 metadata in a single transaction after the subtasks are finished. In simple (single-task) mode, the single task
 publishes all segment metadata in a single transaction after it is complete.</li>
 </ul>
 <p>Additionally, some ingestion methods offer an <em>idempotency</em> guarantee. This means that repeated executions of the same
 ingestion will not cause duplicate data to be ingested:</p>
 <ul>
-<li>Supervised &quot;seekable-stream&quot; ingestion methods like <a href="/docs/latest/development/extensions-core/kafka-ingestion.html">Kafka</a> and
-<a href="/docs/latest/development/extensions-core/kinesis-ingestion.html">Kinesis</a> are idempotent due to the fact that stream offsets and
+<li>Supervised &quot;seekable-stream&quot; ingestion methods like <a href="/docs/24.0.0/development/extensions-core/kafka-ingestion.html">Kafka</a> and
+<a href="/docs/24.0.0/development/extensions-core/kinesis-ingestion.html">Kinesis</a> are idempotent due to the fact that stream offsets and
 segment metadata are stored together and updated in lock-step.</li>
-<li><a href="/docs/latest/ingestion/hadoop.html">Hadoop-based batch ingestion</a> is idempotent unless one of your input sources
+<li><a href="/docs/24.0.0/ingestion/hadoop.html">Hadoop-based batch ingestion</a> is idempotent unless one of your input sources
 is the same Druid datasource that you are ingesting into. In this case, running the same task twice is non-idempotent,
 because you are adding to existing data instead of overwriting it.</li>
-<li><a href="/docs/latest/ingestion/native-batch.html">Native batch ingestion</a> is idempotent unless
-<a href="/docs/latest/ingestion/native-batch.html"><code>appendToExisting</code></a> is true, or one of your input sources is the same Druid datasource
+<li><a href="/docs/24.0.0/ingestion/native-batch.html">Native batch ingestion</a> is idempotent unless
+<a href="/docs/24.0.0/ingestion/native-batch.html"><code>appendToExisting</code></a> is true, or one of your input sources is the same Druid datasource
 that you are ingesting into. In either of these two cases, running the same task twice is non-idempotent, because you
 are adding to existing data instead of overwriting it.</li>
 </ul>
@@ -284,7 +284,7 @@ must <em>all</em> be available before the Broker will use them instead of the ol
 per version per time chunk. Druid will also only use a single version at a time per time chunk. Together, these
 properties provide Druid's atomic replacement guarantees.</p>
 <p>Druid also supports an experimental <em>segment locking</em> mode that is activated by setting
-<a href="/docs/latest/ingestion/tasks.html#context"><code>forceTimeChunkLock</code></a> to false in the context of an ingestion task. In this case, Druid
+<a href="/docs/24.0.0/ingestion/tasks.html#context"><code>forceTimeChunkLock</code></a> to false in the context of an ingestion task. In this case, Druid
 creates an <em>atomic update group</em> using the existing version for the time chunk, instead of creating a new core set
 with a new version number. There can be multiple atomic update groups with the same version number per time chunk. Each
 one replaces a specific set of earlier segments in the same time chunk and with the same version number. Druid will
@@ -297,10 +297,10 @@ reload these unavailable segments on other Historicals as quickly as possible, a
 queries again.</p>
 <h2><a class="anchor" aria-hidden="true" id="query-processing"></a><a href="#query-processing" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
 <p>Queries are distributed across the Druid cluster, and managed by a Broker.
-Queries first enter the <a href="/docs/latest/design/broker.html">Broker</a>, which identifies the segments with data that may pertain to that query.
+Queries first enter the <a href="/docs/24.0.0/design/broker.html">Broker</a>, which identifies the segments with data that may pertain to that query.
 The list of segments is always pruned by time, and may also be pruned by other attributes depending on how your
-datasource is partitioned. The Broker will then identify which <a href="/docs/latest/design/historical.html">Historicals</a> and
-<a href="/docs/latest/design/middlemanager.html">MiddleManagers</a> are serving those segments and distributes a rewritten subquery to each of those processes.
+datasource is partitioned. The Broker will then identify which <a href="/docs/24.0.0/design/historical.html">Historicals</a> and
+<a href="/docs/24.0.0/design/middlemanager.html">MiddleManagers</a> are serving those segments and distributes a rewritten subquery to each of those processes.
 The Historical/MiddleManager processes execute each subquery and return results to the Broker. The Broker merges the partial results
 to get the final answer, which it returns to the original caller.</p>
 <p>Time and attribute pruning is an important way that Druid limits the amount of data that must be scanned for each query, but it is
@@ -315,9 +315,9 @@ query.</p>
 <li>Within each segment, using indexes to identify which rows must be accessed.</li>
 <li>Within each segment, only reading the specific rows and columns that are relevant to a particular query.</li>
 </ul>
-<p>For more details about how Druid executes queries, refer to the <a href="/docs/latest/querying/query-execution.html">Query execution</a>
+<p>For more details about how Druid executes queries, refer to the <a href="/docs/24.0.0/querying/query-execution.html">Query execution</a>
 documentation.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/latest/tutorials/tutorial-kerberos-hadoop.html"><span class="arrow-prev">← </span><span>Kerberized HDFS deep storage</span></a><a class="docs-next button" href="/docs/latest/design/segments.html"><span>Segments</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#druid-architecture">Druid architecture</a></li><li><a href="# [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/tutorials/tutorial-msq-convert-json.html"><span class="arrow-prev">← </span><span>Convert JSON ingestion spec</span></a><a class="docs-next button" href="/docs/24.0.0/design/segments.html"><span>Segments</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#druid-architecture">Druid architecture</a></li><li><a href="# [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
@@ -334,6 +334,6 @@ documentation.</p>
                 apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
                 indexName: 'apache_druid',
                 inputSelector: '#search_input_react',
-                algoliaOptions: {"facetFilters":["language:en","version:0.23.0"]}
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
               });
             </script></body></html>
\ No newline at end of file
diff --git a/docs/latest/design/auth.html b/docs/24.0.0/design/auth.html
similarity index 54%
copy from docs/latest/design/auth.html
copy to docs/24.0.0/design/auth.html
index 0afd748c..1f76a3f2 100644
--- a/docs/latest/design/auth.html
+++ b/docs/24.0.0/design/auth.html
@@ -1,9 +1,9 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Authentication and Authorization · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/latest/design/auth.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="0.23. [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Authentication and Authorization · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/design/auth.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24.0. [...]
               window.dataLayer = window.dataLayer || [];
               function gtag(){dataLayer.push(arguments); }
               gtag('js', new Date());
               gtag('config', 'UA-131010415-1');
-            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
@@ -196,7 +196,7 @@ druid.auth.authorizer.&lt;authorizer-<span class="hljs-built_in">name</span>&gt;
 
 </code></pre>
 <p>These properties provide the authenticator and authorizer names to the implementations as @JsonProperty parameters, potentially useful when multiple authenticators or authorizers of the same type are configured.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/latest/comparisons/druid-vs-sql-on-hadoop.html"><span class="arrow-prev">← </span><span>Apache Druid vs SQL-on-Hadoop</span></a><a class="docs-next button" href="/docs/latest/design/broker.html"><span>Broker</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#enabling-authenticationauthorizationloadinglookuptest">Enabling  [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/comparisons/druid-vs-sql-on-hadoop.html"><span class="arrow-prev">← </span><span>Apache Druid vs SQL-on-Hadoop</span></a><a class="docs-next button" href="/docs/24.0.0/design/broker.html"><span>Broker</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#enabling-authenticationauthorizationloadinglookuptest">Enabling  [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
@@ -213,6 +213,6 @@ druid.auth.authorizer.&lt;authorizer-<span class="hljs-built_in">name</span>&gt;
                 apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
                 indexName: 'apache_druid',
                 inputSelector: '#search_input_react',
-                algoliaOptions: {"facetFilters":["language:en","version:0.23.0"]}
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
               });
             </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/design/broker.html b/docs/24.0.0/design/broker.html
new file mode 100644
index 00000000..a271501c
--- /dev/null
+++ b/docs/24.0.0/design/broker.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Broker · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/design/broker.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24.0.0" /><meta property="og: [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/design/broker.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Broker</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<h3><a class="anchor" aria-hidden="true" id="configuration"></a><a href="#configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>For Apache Druid Broker Process Configuration, see <a href="/docs/24.0.0/configuration/index.html#broker">Broker Configuration</a>.</p>
+<p>For basic tuning guidance for the Broker process, see <a href="/docs/24.0.0/operations/basic-cluster-tuning.html#broker">Basic cluster tuning</a>.</p>
+<h3><a class="anchor" aria-hidden="true" id="http-endpoints"></a><a href="#http-endpoints" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p>For a list of API endpoints supported by the Broker, see <a href="/docs/24.0.0/operations/api-reference.html#broker">Broker API</a>.</p>
+<h3><a class="anchor" aria-hidden="true" id="overview"></a><a href="#overview" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<p>The Broker is the process to route queries to if you want to run a distributed cluster. It understands the metadata published to ZooKeeper about what segments exist on what processes and routes queries such that they hit the right processes. This process also merges the result sets from all of the individual processes together.
+On start up, Historical processes announce themselves and the segments they are serving in Zookeeper.</p>
+<h3><a class="anchor" aria-hidden="true" id="running"></a><a href="#running" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
+<pre><code class="hljs">org.apache.druid.cli.Main<span class="hljs-built_in"> server </span>broker
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="forwarding-queries"></a><a href="#forwarding-queries" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
+<p>Most Druid queries contain an interval object that indicates a span of time for which data is requested. Likewise, Druid <a href="/docs/24.0.0/design/segments.html">Segments</a> are partitioned to contain data for some interval of time and segments are distributed across a cluster. Consider a simple datasource with 7 segments where each segment contains data for a given day of the week. Any query issued to the datasource for more than one day of data will hit more than one segment. Th [...]
+<p>To determine which processes to forward queries to, the Broker process first builds a view of the world from information in Zookeeper. Zookeeper maintains information about <a href="/docs/24.0.0/design/historical.html">Historical</a> and streaming ingestion <a href="/docs/24.0.0/design/peons.html">Peon</a> processes and the segments they are serving. For every datasource in Zookeeper, the Broker process builds a timeline of segments and the processes that serve them. When queries are  [...]
+<h3><a class="anchor" aria-hidden="true" id="caching"></a><a href="#caching" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
+<p>Broker processes employ a cache with an LRU cache invalidation strategy. The Broker cache stores per-segment results. The cache can be local to each Broker process or shared across multiple processes using an external distributed cache such as <a href="http://memcached.org/">memcached</a>. Each time a broker process receives a query, it first maps the query to a set of segments. A subset of these segment results may already exist in the cache and the results can be directly pulled fro [...]
+Historical processes. Once the Historical processes return their results, the Broker will store those results in the cache. Real-time segments are never cached and hence requests for real-time data will always be forwarded to real-time processes. Real-time data is perpetually changing and caching the results would be unreliable.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/design/auth.html"><span class="arrow-prev">← </span><span>Authentication and Authorization</span></a><a class="docs-next button" href="/docs/24.0.0/design/coordinator.html"><span>Coordinator Process</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer druid-footer" id="footer"><div class="container"><div class="text-c [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/design/concepts-and-terminology.html b/docs/24.0.0/design/concepts-and-terminology.html
new file mode 100644
index 00000000..eed33a41
--- /dev/null
+++ b/docs/24.0.0/design/concepts-and-terminology.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="index.html">
+<meta http-equiv="refresh" content="0; url=index.html">
+<h1>Redirecting...</h1>
+<a href="index.html">Click here if you are not redirected.</a>
+<script>location="index.html"</script>
diff --git a/docs/24.0.0/design/coordinator.html b/docs/24.0.0/design/coordinator.html
new file mode 100644
index 00000000..c6f083c2
--- /dev/null
+++ b/docs/24.0.0/design/coordinator.html
@@ -0,0 +1,207 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Coordinator Process · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/design/coordinator.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24.0.0" />< [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/design/coordinator.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Coordinator Process</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<h3><a class="anchor" aria-hidden="true" id="configuration"></a><a href="#configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>For Apache Druid Coordinator Process Configuration, see <a href="/docs/24.0.0/configuration/index.html#coordinator">Coordinator Configuration</a>.</p>
+<p>For basic tuning guidance for the Coordinator process, see <a href="/docs/24.0.0/operations/basic-cluster-tuning.html#coordinator">Basic cluster tuning</a>.</p>
+<h3><a class="anchor" aria-hidden="true" id="http-endpoints"></a><a href="#http-endpoints" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p>For a list of API endpoints supported by the Coordinator, see <a href="/docs/24.0.0/operations/api-reference.html#coordinator">Coordinator API</a>.</p>
+<h3><a class="anchor" aria-hidden="true" id="overview"></a><a href="#overview" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<p>The Druid Coordinator process is primarily responsible for segment management and distribution. More specifically, the
+Druid Coordinator process communicates to Historical processes to load or drop segments based on configurations. The
+Druid Coordinator is responsible for loading new segments, dropping outdated segments, ensuring that segments are
+&quot;replicated&quot; (that is, loaded on multiple different Historical nodes) proper (configured) number of times, and moving
+(&quot;balancing&quot;) segments between Historical nodes to keep the latter evenly loaded.</p>
+<p>The Druid Coordinator runs its duties periodically and the time between each run is a configurable parameter. On each
+run, the Coordinator assesses the current state of the cluster before deciding on the appropriate actions to take.
+Similar to the Broker and Historical processes, the Druid Coordinator maintains a connection to a Zookeeper cluster for
+current cluster information. The Coordinator also maintains a connection to a database containing information about
+&quot;used&quot; segments (that is, the segments that <em>should</em> be loaded in the cluster) and the loading rules.</p>
+<p>Before any unassigned segments are serviced by Historical processes, the Historical processes for each tier are first
+sorted in terms of capacity, with least capacity servers having the highest priority. Unassigned segments are always
+assigned to the processes with least capacity to maintain a level of balance between processes. The Coordinator does not
+directly communicate with a historical process when assigning it a new segment; instead the Coordinator creates some
+temporary information about the new segment under load queue path of the historical process. Once this request is seen,
+the historical process will load the segment and begin servicing it.</p>
+<h3><a class="anchor" aria-hidden="true" id="running"></a><a href="#running" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
+<pre><code class="hljs">org.apache.druid.cli.Main<span class="hljs-built_in"> server </span>coordinator
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="rules"></a><a href="#rules" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
+<p>Segments can be automatically loaded and dropped from the cluster based on a set of rules. For more information on rules, see <a href="/docs/24.0.0/operations/rule-configuration.html">Rule Configuration</a>.</p>
+<h3><a class="anchor" aria-hidden="true" id="cleaning-up-segments"></a><a href="#cleaning-up-segments" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<p>On each run, the Druid Coordinator compares the set of used segments in the database with the segments served by some
+Historical nodes in the cluster. Coordinator sends requests to Historical nodes to unload unused segments or segments
+that are removed from the database.</p>
+<p>Segments that are overshadowed (their versions are too old and their data has been replaced by newer segments) are
+marked as unused. During the next Coordinator's run, they will be unloaded from Historical nodes in the cluster.</p>
+<h3><a class="anchor" aria-hidden="true" id="segment-availability"></a><a href="#segment-availability" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<p>If a Historical process restarts or becomes unavailable for any reason, the Druid Coordinator will notice a process has gone missing and treat all segments served by that process as being dropped. Given a sufficient period of time, the segments may be reassigned to other Historical processes in the cluster. However, each segment that is dropped is not immediately forgotten. Instead, there is a transitional data structure that stores all dropped segments with an associated lifetime. Th [...]
+<h3><a class="anchor" aria-hidden="true" id="balancing-segment-load"></a><a href="#balancing-segment-load" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0 [...]
+<p>To ensure an even distribution of segments across Historical processes in the cluster, the Coordinator process will find the total size of all segments being served by every Historical process each time the Coordinator runs. For every Historical process tier in the cluster, the Coordinator process will determine the Historical process with the highest utilization and the Historical process with the lowest utilization. The percent difference in utilization between the two processes is  [...]
+<h3><a class="anchor" aria-hidden="true" id="automatic-compaction"></a><a href="#automatic-compaction" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<p>The Druid Coordinator manages the <a href="/docs/24.0.0/ingestion/automatic-compaction.html">automatic compaction system</a>.
+Each run, the Coordinator compacts segments by merging small segments or splitting a large one. This is useful when the size of your segments is not optimized which may degrade query performance.
+See <a href="/docs/24.0.0/operations/segment-optimization.html">Segment size optimization</a> for details.</p>
+<p>The Coordinator first finds the segments to compact based on the <a href="#segment-search-policy-in-automatic-compaction">segment search policy</a>.
+Once some segments are found, it issues a <a href="/docs/24.0.0/ingestion/tasks.html#compact">compaction task</a> to compact those segments.
+The maximum number of running compaction tasks is <code>min(sum of worker capacity * slotRatio, maxSlots)</code>.
+Note that even if <code>min(sum of worker capacity * slotRatio, maxSlots) = 0</code>, at least one compaction task is always submitted
+if the compaction is enabled for a dataSource.
+See <a href="/docs/24.0.0/operations/api-reference.html#automatic-compaction-configuration">Automatic compaction configuration API</a> and <a href="/docs/24.0.0/configuration/index.html#automatic-compaction-dynamic-configuration">Automatic compaction configuration</a> to enable and configure automatic compaction.</p>
+<p>Compaction tasks might fail due to the following reasons:</p>
+<ul>
+<li>If the input segments of a compaction task are removed or overshadowed before it starts, that compaction task fails immediately.</li>
+<li>If a task of a higher priority acquires a <a href="/docs/24.0.0/ingestion/tasks.html#locking">time chunk lock</a> for an interval overlapping with the interval of a compaction task, the compaction task fails.</li>
+</ul>
+<p>Once a compaction task fails, the Coordinator simply checks the segments in the interval of the failed task again, and issues another compaction task in the next run.</p>
+<p>Note that Compacting Segments Coordinator Duty is automatically enabled and run as part of the Indexing Service Duties group. However, Compacting Segments Coordinator Duty can be configured to run in isolation as a separate Coordinator duty group. This allows changing the period of Compacting Segments Coordinator Duty without impacting the period of other Indexing Service Duties. This can be done by setting the following properties. For more details, see <a href="/docs/24.0.0/developm [...]
+<pre><code class="hljs">druid.coordinator.dutyGroups=<span class="hljs-meta">[&lt;SOME_GROUP_NAME&gt;]</span>
+druid.coordinator.&lt;SOME_GROUP_NAME&gt;.duties=[<span class="hljs-string">"compactSegments"</span>]
+druid.coordinator.&lt;SOME_GROUP_NAME&gt;.period=&lt;PERIOD_TO_RUN_COMPACTING_SEGMENTS_DUTY&gt;
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="segment-search-policy-in-automatic-compaction"></a><a href="#segment-search-policy-in-automatic-compaction" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h- [...]
+<p>At every Coordinator run, this policy looks up time chunks from newest to oldest and checks whether the segments in those time chunks
+need compaction.
+A set of segments needs compaction if all conditions below are satisfied:</p>
+<ol>
+<li>Total size of segments in the time chunk is smaller than or equal to the configured <code>inputSegmentSizeBytes</code>.</li>
+<li>Segments have never been compacted yet or compaction spec has been updated since the last compaction: <code>maxTotalRows</code> or <code>indexSpec</code>.</li>
+</ol>
+<p>Here are some details with an example. Suppose we have two dataSources (<code>foo</code>, <code>bar</code>) as seen below:</p>
+<ul>
+<li><code>foo</code>
+<ul>
+<li><code>foo_2017-11-01T00:00:00.000Z_2017-12-01T00:00:00.000Z_VERSION</code></li>
+<li><code>foo_2017-11-01T00:00:00.000Z_2017-12-01T00:00:00.000Z_VERSION_1</code></li>
+<li><code>foo_2017-09-01T00:00:00.000Z_2017-10-01T00:00:00.000Z_VERSION</code></li>
+</ul></li>
+<li><code>bar</code>
+<ul>
+<li><code>bar_2017-10-01T00:00:00.000Z_2017-11-01T00:00:00.000Z_VERSION</code></li>
+<li><code>bar_2017-10-01T00:00:00.000Z_2017-11-01T00:00:00.000Z_VERSION_1</code></li>
+</ul></li>
+</ul>
+<p>Assuming that each segment is 10 MB and haven't been compacted yet, this policy first returns two segments of
+<code>foo_2017-11-01T00:00:00.000Z_2017-12-01T00:00:00.000Z_VERSION</code> and <code>foo_2017-11-01T00:00:00.000Z_2017-12-01T00:00:00.000Z_VERSION_1</code> to compact together because
+<code>2017-11-01T00:00:00.000Z/2017-12-01T00:00:00.000Z</code> is the most recent time chunk.</p>
+<p>If the Coordinator has enough task slots for compaction, this policy will continue searching for the next segments and return
+<code>bar_2017-10-01T00:00:00.000Z_2017-11-01T00:00:00.000Z_VERSION</code> and <code>bar_2017-10-01T00:00:00.000Z_2017-11-01T00:00:00.000Z_VERSION_1</code>.
+Finally, <code>foo_2017-09-01T00:00:00.000Z_2017-10-01T00:00:00.000Z_VERSION</code> will be picked up even though there is only one segment in the time chunk of <code>2017-09-01T00:00:00.000Z/2017-10-01T00:00:00.000Z</code>.</p>
+<p>The search start point can be changed by setting <code>skipOffsetFromLatest</code>.
+If this is set, this policy will ignore the segments falling into the time chunk of (the end time of the most recent segment - <code>skipOffsetFromLatest</code>).
+This is to avoid conflicts between compaction tasks and realtime tasks.
+Note that realtime tasks have a higher priority than compaction tasks by default. Realtime tasks will revoke the locks of compaction tasks if their intervals overlap, resulting in the termination of the compaction task.
+For more information, see <a href="/docs/24.0.0/ingestion/automatic-compaction.html#avoid-conflicts-with-ingestion">Avoid conflicts with ingestion</a>.</p>
+<blockquote>
+<p>This policy currently cannot handle the situation when there are a lot of small segments which have the same interval,
+and their total size exceeds <a href="/docs/24.0.0/configuration/index.html#automatic-compaction-dynamic-configuration"><code>inputSegmentSizeBytes</code></a>.
+If it finds such segments, it simply skips them.</p>
+</blockquote>
+<h3><a class="anchor" aria-hidden="true" id="the-coordinator-console"></a><a href="#the-coordinator-console" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
+<p>The Druid Coordinator exposes a web GUI for displaying cluster information and rule configuration. For more details, see <a href="/docs/24.0.0/operations/management-uis.html#coordinator-consoles">Coordinator console</a>.</p>
+<h3><a class="anchor" aria-hidden="true" id="faq"></a><a href="#faq" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
+<ol>
+<li><p><strong>Do clients ever contact the Coordinator process?</strong></p>
+<p>The Coordinator is not involved in a query.</p>
+<p>Historical processes never directly contact the Coordinator process. The Druid Coordinator tells the Historical processes to load/drop data via Zookeeper, but the Historical processes are completely unaware of the Coordinator.</p>
+<p>Brokers also never contact the Coordinator. Brokers base their understanding of the data topology on metadata exposed by the Historical processes via ZK and are completely unaware of the Coordinator.</p></li>
+<li><p><strong>Does it matter if the Coordinator process starts up before or after other processes?</strong></p>
+<p>No. If the Druid Coordinator is not started up, no new segments will be loaded in the cluster and outdated segments will not be dropped. However, the Coordinator process can be started up at any time, and after a configurable delay, will start running Coordinator tasks.</p>
+<p>This also means that if you have a working cluster and all of your Coordinators die, the cluster will continue to function, it just won’t experience any changes to its data topology.</p></li>
+</ol>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/design/broker.html"><span class="arrow-prev">← </span><span>Broker</span></a><a class="docs-next button" href="/docs/24.0.0/design/historical.html"><span>Historical Process</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer druid-footer" id="footer"><div class="container"><div class="text-center"><p><a href="/techno [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/design/design.html b/docs/24.0.0/design/design.html
new file mode 100644
index 00000000..eed33a41
--- /dev/null
+++ b/docs/24.0.0/design/design.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="index.html">
+<meta http-equiv="refresh" content="0; url=index.html">
+<h1>Redirecting...</h1>
+<a href="index.html">Click here if you are not redirected.</a>
+<script>location="index.html"</script>
diff --git a/docs/latest/design/extensions-contrib/dropwizard.html b/docs/24.0.0/design/extensions-contrib/dropwizard.html
similarity index 98%
copy from docs/latest/design/extensions-contrib/dropwizard.html
copy to docs/24.0.0/design/extensions-contrib/dropwizard.html
index 34b62904..1188425a 100644
--- a/docs/latest/design/extensions-contrib/dropwizard.html
+++ b/docs/24.0.0/design/extensions-contrib/dropwizard.html
@@ -1,9 +1,9 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Dropwizard metrics emitter · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/latest/design/extensions-contrib/dropwizard.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:vers [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Dropwizard metrics emitter · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/design/extensions-contrib/dropwizard.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:vers [...]
               window.dataLayer = window.dataLayer || [];
               function gtag(){dataLayer.push(arguments); }
               gtag('js', new Date());
               gtag('config', 'UA-131010415-1');
-            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
   ~ Licensed to the Apache Software Foundation (ASF) under one
   ~ or more contributor license agreements.  See the NOTICE file
   ~ distributed with this work for additional information
@@ -22,7 +22,7 @@
   ~ under the License.
   -->
 <h1><a class="anchor" aria-hidden="true" id="dropwizard-emitter"></a><a href="#dropwizard-emitter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>To use this extension, make sure to <a href="/docs/latest/development/extensions.html#loading-extensions">include</a> <code>dropwizard-emitter</code> in the extensions load list.</p>
+<p>To use this extension, make sure to <a href="/docs/24.0.0/development/extensions.html#loading-extensions">include</a> <code>dropwizard-emitter</code> in the extensions load list.</p>
 <h2><a class="anchor" aria-hidden="true" id="introduction"></a><a href="#introduction" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
 <p>This extension integrates <a href="http://metrics.dropwizard.io/3.1.0/getting-started/#">Dropwizard</a> metrics library with druid so that dropwizard users can easily absorb druid into their monitoring ecosystem.
 It accumulates druid metrics as dropwizard metrics, and emits them to various sinks via dropwizard supported reporters.
@@ -644,7 +644,7 @@ druid.emitter.dropwizard.reporters=[{<span class="hljs-string">"type"</span>:<sp
   }
 }
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#introduction">Introduction</a></li><li><a href="#configuration">Configuration</a><ul class="toc-headings"><li><a href="#druid-to-dropwizard-event-conversion">Druid to Dropwizard Event Conversion</a></li><li><a href="#supported-dropwizard-reporters">Supported Dropwizard reporters</a></li><li><a href="#default-metrics-mapping">Default Metrics Mapping</a></ [...]
+</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#introduction">Introduction</a></li><li><a href="#configuration">Configuration</a><ul class="toc-headings"><li><a href="#druid-to-dropwizard-event-conversion">Druid to Dropwizard Event Conversion</a></li><li><a href="#supported-dropwizard-reporters">Supported Dropwizard reporters</a></li><li><a href="#default-metrics-mapping">Default Metrics Mapping</a></ [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
@@ -661,6 +661,6 @@ druid.emitter.dropwizard.reporters=[{<span class="hljs-string">"type"</span>:<sp
                 apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
                 indexName: 'apache_druid',
                 inputSelector: '#search_input_react',
-                algoliaOptions: {"facetFilters":["language:en","version:0.23.0"]}
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
               });
             </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/design/historical.html b/docs/24.0.0/design/historical.html
new file mode 100644
index 00000000..8aeb8d5b
--- /dev/null
+++ b/docs/24.0.0/design/historical.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Historical Process · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/design/historical.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24.0.0" /><me [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/design/historical.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Historical Process</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<h3><a class="anchor" aria-hidden="true" id="configuration"></a><a href="#configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>For Apache Druid Historical Process Configuration, see <a href="/docs/24.0.0/configuration/index.html#historical">Historical Configuration</a>.</p>
+<p>For basic tuning guidance for the Historical process, see <a href="/docs/24.0.0/operations/basic-cluster-tuning.html#historical">Basic cluster tuning</a>.</p>
+<h3><a class="anchor" aria-hidden="true" id="http-endpoints"></a><a href="#http-endpoints" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p>For a list of API endpoints supported by the Historical, please see the <a href="/docs/24.0.0/operations/api-reference.html#historical">API reference</a>.</p>
+<h3><a class="anchor" aria-hidden="true" id="running"></a><a href="#running" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
+<pre><code class="hljs">org.apache.druid.cli.Main<span class="hljs-built_in"> server </span>historical
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="loading-and-serving-segments"></a><a href="#loading-and-serving-segments" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 [...]
+<p>Each Historical process copies or &quot;pulls&quot; segment files from Deep Storage to local disk in an area called the <em>segment cache</em>.  Set the <code>druid.segmentCache.locations</code> to configure the size and location of the segment cache on each Historical process. See <a href="/docs/24.0.0/configuration/index.html#historical-general-configuration">Historical general configuration</a>.</p>
+<p>See the <a href="/docs/24.0.0/operations/basic-cluster-tuning.html#segment-cache-size">Tuning Guide</a> for more information.</p>
+<p>The <a href="../design/coordinator.html">Coordinator</a> controls the assignment of segments to Historicals and the balance of segments between Historicals. Historical processes do not communicate directly with each other, nor do they communicate directly with the Coordinator.  Instead, the Coordinator creates ephemeral entries in Zookeeper in a <a href="/docs/24.0.0/configuration/index.html#path-configuration">load queue path</a>. Each Historical process maintains a connection to Zoo [...]
+<p>For more information about how the Coordinator assigns segments to Historical processes, see <a href="/docs/24.0.0/design/coordinator.html">Coordinator</a>.</p>
+<p>When a Historical process detects a new entry in the Zookeeper load queue, it checks its own segment cache. If no information about the segment exists there, the Historical process first retrieves metadata from Zookeeper about the segment, including where the segment is located in Deep Storage and how it needs to decompress and process it.</p>
+<p>For more information about segment metadata and Druid segments in general, see <a href="/docs/24.0.0/design/segments.html">Segments</a>.</p>
+<p>After a Historical process pulls down and processes a segment from Deep Storage, Druid advertises the segment as being available for queries from the Broker.  This announcement by the Historical is made via Zookeeper, in a <a href="/docs/24.0.0/configuration/index.html#path-configuration">served segments path</a>.</p>
+<p>For more information about how the Broker determines what data is available for queries, please see <a href="/docs/24.0.0/design/broker.html">Broker</a>.</p>
+<p>To make data from the segment cache available for querying as soon as possible, Historical services search the local segment cache upon startup and advertise the segments found there.</p>
+<h3><a class="anchor" aria-hidden="true" id="loading-and-serving-segments-from-cache"></a><a href="#loading-and-serving-segments-from-cache" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2  [...]
+<p>The segment cache uses <a href="https://en.wikipedia.org/wiki/Mmap">memory mapping</a>. The cache consumes memory from the underlying operating system so Historicals can hold parts of segment files in memory to increase query performance at the data level.  The in-memory segment cache is affected by the size of the Historical JVM, heap / direct memory buffers, and other processes on the operating system itself.</p>
+<p>At query time, if the required part of a segment file is available in the memory mapped cache or &quot;page cache&quot;, the Historical re-uses it and reads it directly from memory.  If it is not in the memory-mapped cache, the Historical reads that part of the segment from disk. In this case, there is potential for new data to flush other segment data from memory. This means that if free operating system memory is close to <code>druid.server.maxSize</code>, the more likely that segme [...]
+<p>Note that this memory-mapped segment cache is in addition to other <a href="/docs/24.0.0/querying/caching.html">query-level caches</a>.</p>
+<h3><a class="anchor" aria-hidden="true" id="querying-segments"></a><a href="#querying-segments" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
+<p>Please see <a href="/docs/24.0.0/querying/querying.html">Querying</a> for more information on querying Historical processes.</p>
+<p>A Historical can be configured to log and report metrics for every query it services.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/design/coordinator.html"><span class="arrow-prev">← </span><span>Coordinator Process</span></a><a class="docs-next button" href="/docs/24.0.0/design/indexer.html"><span>Indexer Process</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer druid-footer" id="footer"><div class="container"><div class="text-center"><p><a h [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/design/index.html b/docs/24.0.0/design/index.html
new file mode 100644
index 00000000..4481730e
--- /dev/null
+++ b/docs/24.0.0/design/index.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Introduction to Apache Druid · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/design/index.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24.0.0"  [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/design/index.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Introduction to Apache Druid</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>Apache Druid is a real-time analytics database designed for fast slice-and-dice analytics (&quot;<a href="http://en.wikipedia.org/wiki/Online_analytical_processing">OLAP</a>&quot; queries) on large data sets. Most often, Druid powers use cases where real-time ingestion, fast query performance, and high uptime are important.</p>
+<p>Druid is commonly used as the database backend for GUIs of analytical applications, or for highly-concurrent APIs that need fast aggregations. Druid works best with event-oriented data.</p>
+<p>Common application areas for Druid include:</p>
+<ul>
+<li>Clickstream analytics including web and mobile analytics</li>
+<li>Network telemetry analytics including network performance monitoring</li>
+<li>Server metrics storage</li>
+<li>Supply chain analytics including manufacturing metrics</li>
+<li>Application performance metrics</li>
+<li>Digital marketing/advertising analytics</li>
+<li>Business intelligence/OLAP</li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="key-features-of-druid"></a><a href="#key-features-of-druid" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
+<p>Druid's core architecture combines ideas from data warehouses, timeseries databases, and logsearch systems. Some of
+Druid's key features are:</p>
+<ol>
+<li><strong>Columnar storage format.</strong> Druid uses column-oriented storage. This means it only loads the exact columns
+needed for a particular query.  This greatly improves speed for queries that retrieve only a few columns. Additionally, to support fast scans and aggregations, Druid optimizes column storage for each column according to its data type.</li>
+<li><strong>Scalable distributed system.</strong> Typical Druid deployments span clusters ranging from tens to hundreds of servers. Druid can ingest data at the rate of millions of records per second while retaining trillions of records and maintaining query latencies ranging from the sub-second to a few seconds.</li>
+<li><strong>Massively parallel processing.</strong> Druid can process each query in parallel across the entire cluster.</li>
+<li><strong>Realtime or batch ingestion.</strong> Druid can ingest data either real-time or in batches. Ingested data is immediately available for
+querying.</li>
+<li><strong>Self-healing, self-balancing, easy to operate.</strong> As an operator, you add servers to scale out or
+remove servers to scale down. The Druid cluster re-balances itself automatically in the background without any downtime. If a
+Druid server fails, the system automatically routes data around the damage until the server can be replaced. Druid
+is designed to run continuously without planned downtime for any reason. This is true for configuration changes and software
+updates.</li>
+<li><strong>Cloud-native, fault-tolerant architecture that won't lose data.</strong> After ingestion, Druid safely stores a copy of your data in <a href="/docs/24.0.0/design/architecture.html#deep-storage">deep storage</a>. Deep storage is typically cloud storage, HDFS, or a shared filesystem. You can recover your data from deep storage even in the unlikely case that all Druid servers fail. For a limited failure that affects only a few Druid servers, replication ensures that queries are  [...]
+<li><strong>Indexes for quick filtering.</strong> Druid uses <a href="https://roaringbitmap.org/">Roaring</a> or
+<a href="https://arxiv.org/pdf/1004.0403">CONCISE</a> compressed bitmap indexes to create indexes to enable fast filtering and searching across multiple columns.</li>
+<li><strong>Time-based partitioning.</strong> Druid first partitions data by time. You can optionally implement additional partitioning based upon other fields.
+Time-based queries only access the partitions that match the time range of the query which leads to significant performance improvements.</li>
+<li><strong>Approximate algorithms.</strong> Druid includes algorithms for approximate count-distinct, approximate ranking, and
+computation of approximate histograms and quantiles. These algorithms offer bounded memory usage and are often
+substantially faster than exact computations. For situations where accuracy is more important than speed, Druid also
+offers exact count-distinct and exact ranking.</li>
+<li><strong>Automatic summarization at ingest time.</strong> Druid optionally supports data summarization at ingestion time. This
+summarization partially pre-aggregates your data, potentially leading to significant cost savings and performance boosts.</li>
+</ol>
+<h2><a class="anchor" aria-hidden="true" id="when-to-use-druid"></a><a href="#when-to-use-druid" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
+<p>Druid is used by many companies of various sizes for many different use cases. For more information see
+<a href="/druid-powered">Powered by Apache Druid</a>.</p>
+<p>Druid is likely a good choice if your use case matches a few of the following:</p>
+<ul>
+<li>Insert rates are very high, but updates are less common.</li>
+<li>Most of your queries are aggregation and reporting queries. For example &quot;group by&quot; queries. You may also have searching and
+scanning queries.</li>
+<li>You are targeting query latencies of 100ms to a few seconds.</li>
+<li>Your data has a time component. Druid includes optimizations and design choices specifically related to time.</li>
+<li>You may have more than one table, but each query hits just one big distributed table. Queries may potentially hit more
+than one smaller &quot;lookup&quot; table.</li>
+<li>You have high cardinality data columns, e.g. URLs, user IDs, and need fast counting and ranking over them.</li>
+<li>You want to load data from Kafka, HDFS, flat files, or object storage like Amazon S3.</li>
+</ul>
+<p>Situations where you would likely <em>not</em> want to use Druid include:</p>
+<ul>
+<li>You need low-latency updates of <em>existing</em> records using a primary key. Druid supports streaming inserts, but not streaming updates. You can perform updates using
+background batch jobs.</li>
+<li>You are building an offline reporting system where query latency is not very important.</li>
+<li>You want to do &quot;big&quot; joins, meaning joining one big fact table to another big fact table, and you are okay with these queries
+taking a long time to complete.</li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="learn-more"></a><a href="#learn-more" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<ul>
+<li>Try the Druid <a href="/docs/24.0.0/tutorials/index.html">Quickstart</a>.</li>
+<li>Learn more about Druid components in <a href="/docs/24.0.0/design/architecture.html">Design</a>.</li>
+<li>Read about new features and other details of <a href="https://github.com/apache/druid/releases">Druid Releases</a>.</li>
+</ul>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-next button" href="/docs/24.0.0/tutorials/index.html"><span>Quickstart</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#key-features-of-druid">Key features of Druid</a></li><li><a href="#when-to-use-druid">When to use Druid</a></li><li><a href="#learn-more">Learn more</a></li></ul></nav></div><footer class="nav-footer druid-footer" id="footer"> [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/design/indexer.html b/docs/24.0.0/design/indexer.html
new file mode 100644
index 00000000..50417dcc
--- /dev/null
+++ b/docs/24.0.0/design/indexer.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Indexer Process · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/design/indexer.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24.0.0" /><meta pro [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/design/indexer.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Indexer Process</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<blockquote>
+<p>The Indexer is an optional and <a href="/docs/24.0.0/development/experimental.html">experimental</a> feature.
+Its memory management system is still under development and will be significantly enhanced in later releases.</p>
+</blockquote>
+<p>The Apache Druid Indexer process is an alternative to the MiddleManager + Peon task execution system. Instead of forking a separate JVM process per-task, the Indexer runs tasks as separate threads within a single JVM process.</p>
+<p>The Indexer is designed to be easier to configure and deploy compared to the MiddleManager + Peon system and to better enable resource sharing across tasks.</p>
+<h3><a class="anchor" aria-hidden="true" id="configuration"></a><a href="#configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>For Apache Druid Indexer Process Configuration, see <a href="/docs/24.0.0/configuration/index.html#indexer">Indexer Configuration</a>.</p>
+<h3><a class="anchor" aria-hidden="true" id="http-endpoints"></a><a href="#http-endpoints" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p>The Indexer process shares the same HTTP endpoints as the <a href="/docs/24.0.0/operations/api-reference.html#middlemanager">MiddleManager</a>.</p>
+<h3><a class="anchor" aria-hidden="true" id="running"></a><a href="#running" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
+<pre><code class="hljs">org.apache.druid.cli.Main<span class="hljs-built_in"> server </span>indexer
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="task-resource-sharing"></a><a href="#task-resource-sharing" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
+<p>The following resources are shared across all tasks running inside an Indexer process.</p>
+<h4><a class="anchor" aria-hidden="true" id="query-resources"></a><a href="#query-resources" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
+<p>The query processing threads and buffers are shared across all tasks. The Indexer will serve queries from a single endpoint shared by all tasks.</p>
+<p>If <a href="/docs/24.0.0/configuration/index.html#indexer-caching">query caching</a> is enabled, the query cache is also shared across all tasks.</p>
+<h4><a class="anchor" aria-hidden="true" id="server-http-threads"></a><a href="#server-http-threads" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<p>The Indexer maintains two equally sized pools of HTTP threads.</p>
+<p>One pool is exclusively used for task control messages between the Overlord and the Indexer (&quot;chat handler threads&quot;). The other pool is used for handling all other HTTP requests.</p>
+<p>The size of the pools are configured by the <code>druid.server.http.numThreads</code> configuration (e.g., if this is set to 10, there will be 10 chat handler threads and 10 non-chat handler threads).</p>
+<p>In addition to these two pools, 2 separate threads are allocated for lookup handling. If lookups are not used, these threads will not be used.</p>
+<h4><a class="anchor" aria-hidden="true" id="memory-sharing"></a><a href="#memory-sharing" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p>The Indexer uses the <code>druid.worker.globalIngestionHeapLimitBytes</code> configuration to impose a global heap limit across all of the tasks it is running.</p>
+<p>This global limit is evenly divided across the number of task slots configured by <code>druid.worker.capacity</code>.</p>
+<p>To apply the per-task heap limit, the Indexer will override <code>maxBytesInMemory</code> in task tuning configs (i.e., ignoring the default value or any user configured value). <code>maxRowsInMemory</code> will also be overridden to an essentially unlimited value: the Indexer does not support row limits.</p>
+<p>By default, <code>druid.worker.globalIngestionHeapLimitBytes</code> is set to 1/6th of the available JVM heap. This default is chosen to align with the default value of <code>maxBytesInMemory</code> in task tuning configs when using the MiddleManager/Peon system, which is also 1/6th of the JVM heap.</p>
+<p>The peak usage for rows held in heap memory relates to the interaction between the <code>maxBytesInMemory</code> and <code>maxPendingPersists</code> properties in the task tuning configs. When the amount of row data held in-heap by a task reaches the limit specified by <code>maxBytesInMemory</code>, a task will persist the in-heap row data. After the persist has been started, the task can again ingest up to <code>maxBytesInMemory</code> bytes worth of row data while the persist is run [...]
+<p>This means that the peak in-heap usage for row data can be up to approximately <code>maxBytesInMemory</code> * (2 + <code>maxPendingPersists</code>). The default value of <code>maxPendingPersists</code> is 0, which allows for 1 persist to run concurrently with ingestion work.</p>
+<p>The remaining portion of the heap is reserved for query processing and segment persist/merge operations, and miscellaneous heap usage.</p>
+<h4><a class="anchor" aria-hidden="true" id="concurrent-segment-persistmerge-limits"></a><a href="#concurrent-segment-persistmerge-limits" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1. [...]
+<p>To help reduce peak memory usage, the Indexer imposes a limit on the number of concurrent segment persist/merge operations across all running tasks.</p>
+<p>By default, the number of concurrent persist/merge operations is limited to (<code>druid.worker.capacity</code> / 2), rounded down. This limit can be configured with the <code>druid.worker.numConcurrentMerges</code> property.</p>
+<h3><a class="anchor" aria-hidden="true" id="current-limitations"></a><a href="#current-limitations" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<p>Separate task logs are not currently supported when using the Indexer; all task log messages will instead be logged in the Indexer process log.</p>
+<p>The Indexer currently imposes an identical memory limit on each task. In later releases, the per-task memory limit will be removed and only the global limit will apply. The limit on concurrent merges will also be removed.</p>
+<p>The Indexer does not work properly with <a href="/docs/24.0.0/ingestion/tasks.html#index_realtime"><code>index_realtime</code></a> task types. Therefore, it is not compatible with <a href="/docs/24.0.0/ingestion/tranquility.html">Tranquility</a>. If you are using Tranquility, consider migrating to Druid's builtin <a href="/docs/24.0.0/development/extensions-core/kafka-ingestion.html">Apache Kafka</a> or <a href="/docs/24.0.0/development/extensions-core/kinesis-ingestion.html">Amazon K [...]
+<p>In later releases, per-task memory usage will be dynamically managed. Please see <a href="https://github.com/apache/druid/issues/7900">https://github.com/apache/druid/issues/7900</a> for details on future enhancements to the Indexer.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/design/historical.html"><span class="arrow-prev">← </span><span>Historical Process</span></a><a class="docs-next button" href="/docs/24.0.0/design/indexing-service.html"><span>Indexing Service</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer druid-footer" id="footer"><div class="container"><div class="text-center" [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/design/indexing-service.html b/docs/24.0.0/design/indexing-service.html
new file mode 100644
index 00000000..f7a6d315
--- /dev/null
+++ b/docs/24.0.0/design/indexing-service.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Indexing Service · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/design/indexing-service.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24.0.0" / [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/design/indexing-service.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Indexing Service</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>The Apache Druid indexing service is a highly-available, distributed service that runs indexing related tasks.</p>
+<p>Indexing <a href="/docs/24.0.0/ingestion/tasks.html">tasks</a> create (and sometimes destroy) Druid <a href="/docs/24.0.0/design/segments.html">segments</a>. The indexing service has a master/slave like architecture.</p>
+<p>The indexing service is composed of three main components: a <a href="/docs/24.0.0/design/peons.html">Peon</a> component that can run a single task, a <a href="/docs/24.0.0/design/middlemanager.html">Middle Manager</a> component that manages Peons, and an <a href="/docs/24.0.0/design/overlord.html">Overlord</a> component that manages task distribution to MiddleManagers.
+Overlords and MiddleManagers may run on the same process or across multiple processes while MiddleManagers and Peons always run on the same process.</p>
+<p>Tasks are managed using API endpoints on the Overlord service. Please see <a href="/docs/24.0.0/operations/api-reference.html#tasks">Overlord Task API</a> for more information.</p>
+<p><img src="../assets/indexing_service.png" alt="Indexing Service" title="Indexing Service"></p>
+<h2><a class="anchor" aria-hidden="true" id="overlord"></a><a href="#overlord" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<p>See <a href="/docs/24.0.0/design/overlord.html">Overlord</a>.</p>
+<h2><a class="anchor" aria-hidden="true" id="middle-managers"></a><a href="#middle-managers" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
+<p>See <a href="/docs/24.0.0/design/middlemanager.html">Middle Manager</a>.</p>
+<h2><a class="anchor" aria-hidden="true" id="peons"></a><a href="#peons" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
+<p>See <a href="/docs/24.0.0/design/peons.html">Peon</a>.</p>
+<h2><a class="anchor" aria-hidden="true" id="tasks"></a><a href="#tasks" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
+<p>See <a href="/docs/24.0.0/ingestion/tasks.html">Tasks</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/design/indexer.html"><span class="arrow-prev">← </span><span>Indexer Process</span></a><a class="docs-next button" href="/docs/24.0.0/design/middlemanager.html"><span class="function-name-prevnext">MiddleManager Process</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#overlord">Overlord</a></li><li><a href="#midd [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/design/middlemanager.html b/docs/24.0.0/design/middlemanager.html
new file mode 100644
index 00000000..58aa0f24
--- /dev/null
+++ b/docs/24.0.0/design/middlemanager.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>MiddleManager Process · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/design/middlemanager.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24.0.0" [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/design/middlemanager.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">MiddleManager Process</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<h3><a class="anchor" aria-hidden="true" id="configuration"></a><a href="#configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>For Apache Druid MiddleManager Process Configuration, see <a href="/docs/24.0.0/configuration/index.html#middlemanager-and-peons">Indexing Service Configuration</a>.</p>
+<p>For basic tuning guidance for the MiddleManager process, see <a href="/docs/24.0.0/operations/basic-cluster-tuning.html#middlemanager">Basic cluster tuning</a>.</p>
+<h3><a class="anchor" aria-hidden="true" id="http-endpoints"></a><a href="#http-endpoints" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p>For a list of API endpoints supported by the MiddleManager, please see the <a href="/docs/24.0.0/operations/api-reference.html#middlemanager">API reference</a>.</p>
+<h3><a class="anchor" aria-hidden="true" id="overview"></a><a href="#overview" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<p>The MiddleManager process is a worker process that executes submitted tasks. Middle Managers forward tasks to Peons that run in separate JVMs.
+The reason we have separate JVMs for tasks is for resource and log isolation. Each <a href="/docs/24.0.0/design/peons.html">Peon</a> is capable of running only one task at a time, however, a MiddleManager may have multiple Peons.</p>
+<h3><a class="anchor" aria-hidden="true" id="running"></a><a href="#running" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
+<pre><code class="hljs">org.apache.druid.cli.Main<span class="hljs-built_in"> server </span>middleManager
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/design/indexing-service.html"><span class="arrow-prev">← </span><span>Indexing Service</span></a><a class="docs-next button" href="/docs/24.0.0/design/overlord.html"><span>Overlord Process</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer druid-footer" id="footer"><div class="container"><div class="text-center"><p> [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/design/overlord.html b/docs/24.0.0/design/overlord.html
new file mode 100644
index 00000000..5f3d001f
--- /dev/null
+++ b/docs/24.0.0/design/overlord.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Overlord Process · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/design/overlord.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24.0.0" /><meta p [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/design/overlord.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Overlord Process</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<h3><a class="anchor" aria-hidden="true" id="configuration"></a><a href="#configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>For Apache Druid Overlord Process Configuration, see <a href="/docs/24.0.0/configuration/index.html#overlord">Overlord Configuration</a>.</p>
+<p>For basic tuning guidance for the Overlord process, see <a href="/docs/24.0.0/operations/basic-cluster-tuning.html#overlord">Basic cluster tuning</a>.</p>
+<h3><a class="anchor" aria-hidden="true" id="http-endpoints"></a><a href="#http-endpoints" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p>For a list of API endpoints supported by the Overlord, please see the <a href="/docs/24.0.0/operations/api-reference.html#overlord">API reference</a>.</p>
+<h3><a class="anchor" aria-hidden="true" id="overview"></a><a href="#overview" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<p>The Overlord process is responsible for accepting tasks, coordinating task distribution, creating locks around tasks, and returning statuses to callers. Overlord can be configured to run in one of two modes - local or remote (local being default).
+In local mode Overlord is also responsible for creating Peons for executing tasks. When running the Overlord in local mode, all MiddleManager and Peon configurations must be provided as well.
+Local mode is typically used for simple workflows.  In remote mode, the Overlord and MiddleManager are run in separate processes and you can run each on a different server.
+This mode is recommended if you intend to use the indexing service as the single endpoint for all Druid indexing.</p>
+<h3><a class="anchor" aria-hidden="true" id="overlord-console"></a><a href="#overlord-console" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<p>The Overlord provides a UI for managing tasks and workers. For more details, please see <a href="/docs/24.0.0/operations/management-uis.html#overlord-console">overlord console</a>.</p>
+<h3><a class="anchor" aria-hidden="true" id="blacklisted-workers"></a><a href="#blacklisted-workers" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<p>If a MiddleManager has task failures above a threshold, the Overlord will blacklist these MiddleManagers. No more than 20% of the MiddleManagers can be blacklisted. Blacklisted MiddleManagers will be periodically whitelisted.</p>
+<p>The following variables can be used to set the threshold and blacklist timeouts.</p>
+<pre><code class="hljs"><span class="hljs-selector-tag">druid</span><span class="hljs-selector-class">.indexer</span><span class="hljs-selector-class">.runner</span><span class="hljs-selector-class">.maxRetriesBeforeBlacklist</span>
+<span class="hljs-selector-tag">druid</span><span class="hljs-selector-class">.indexer</span><span class="hljs-selector-class">.runner</span><span class="hljs-selector-class">.workerBlackListBackoffTime</span>
+<span class="hljs-selector-tag">druid</span><span class="hljs-selector-class">.indexer</span><span class="hljs-selector-class">.runner</span><span class="hljs-selector-class">.workerBlackListCleanupPeriod</span>
+<span class="hljs-selector-tag">druid</span><span class="hljs-selector-class">.indexer</span><span class="hljs-selector-class">.runner</span><span class="hljs-selector-class">.maxPercentageBlacklistWorkers</span>
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="autoscaling"></a><a href="#autoscaling" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
+<p>The Autoscaling mechanisms currently in place are tightly coupled with our deployment infrastructure but the framework should be in place for other implementations. We are highly open to new implementations or extensions of the existing mechanisms. In our own deployments, MiddleManager processes are Amazon AWS EC2 nodes and they are provisioned to register themselves in a <a href="https://github.com/ning/galaxy">galaxy</a> environment.</p>
+<p>If autoscaling is enabled, new MiddleManagers may be added when a task has been in pending state for too long. MiddleManagers may be terminated if they have not run any tasks for a period of time.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/design/middlemanager.html"><span class="arrow-prev">← </span><span class="function-name-prevnext">MiddleManager Process</span></a><a class="docs-next button" href="/docs/24.0.0/design/router.html"><span>Router Process</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer druid-footer" id="footer"><div class="container" [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/design/peons.html b/docs/24.0.0/design/peons.html
new file mode 100644
index 00000000..72c73e53
--- /dev/null
+++ b/docs/24.0.0/design/peons.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Peons · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/design/peons.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24.0.0" /><meta property="og:ti [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/design/peons.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Peons</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<h3><a class="anchor" aria-hidden="true" id="configuration"></a><a href="#configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>For Apache Druid Peon Configuration, see <a href="/docs/24.0.0/configuration/index.html#peon-query-configuration">Peon Query Configuration</a> and <a href="/docs/24.0.0/configuration/index.html#additional-peon-configuration">Additional Peon Configuration</a>.</p>
+<p>For basic tuning guidance for MiddleManager tasks, see <a href="/docs/24.0.0/operations/basic-cluster-tuning.html#task-configurations">Basic cluster tuning</a>.</p>
+<h3><a class="anchor" aria-hidden="true" id="http-endpoints"></a><a href="#http-endpoints" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p>For a list of API endpoints supported by the Peon, please see the <a href="/docs/24.0.0/operations/api-reference.html#peon">Peon API reference</a>.</p>
+<p>Peons run a single task in a single JVM. MiddleManager is responsible for creating Peons for running tasks.
+Peons should rarely (if ever for testing purposes) be run on their own.</p>
+<h3><a class="anchor" aria-hidden="true" id="running"></a><a href="#running" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
+<p>The Peon should very rarely ever be run independent of the MiddleManager unless for development purposes.</p>
+<pre><code class="hljs"><span class="hljs-selector-tag">org</span><span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.druid</span><span class="hljs-selector-class">.cli</span><span class="hljs-selector-class">.Main</span> <span class="hljs-selector-tag">internal</span> <span class="hljs-selector-tag">peon</span> &lt;<span class="hljs-selector-tag">task_file</span>&gt; &lt;<span class="hljs-selector-tag">status_file</span>&gt;
+</code></pre>
+<p>The task file contains the task JSON object.
+The status file indicates where the task status will be output.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/design/router.html"><span class="arrow-prev">← </span><span>Router Process</span></a><a class="docs-next button" href="/docs/24.0.0/development/extensions-core/approximate-histograms.html"><span>Approximate Histogram aggregators</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer druid-footer" id="footer"><div class= [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/design/plumber.html b/docs/24.0.0/design/plumber.html
new file mode 100644
index 00000000..2f57fca1
--- /dev/null
+++ b/docs/24.0.0/design/plumber.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../ingestion/standalone-realtime.html">
+<meta http-equiv="refresh" content="0; url=../ingestion/standalone-realtime.html">
+<h1>Redirecting...</h1>
+<a href="../ingestion/standalone-realtime.html">Click here if you are not redirected.</a>
+<script>location="../ingestion/standalone-realtime.html"</script>
diff --git a/docs/24.0.0/design/processes.html b/docs/24.0.0/design/processes.html
new file mode 100644
index 00000000..fa65e677
--- /dev/null
+++ b/docs/24.0.0/design/processes.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Processes and servers · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/design/processes.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24.0.0" />< [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/design/processes.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Processes and servers</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<h2><a class="anchor" aria-hidden="true" id="process-types"></a><a href="#process-types" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>Druid has several process types:</p>
+<ul>
+<li><a href="/docs/24.0.0/design/coordinator.html">Coordinator</a></li>
+<li><a href="/docs/24.0.0/design/overlord.html">Overlord</a></li>
+<li><a href="/docs/24.0.0/design/broker.html">Broker</a></li>
+<li><a href="/docs/24.0.0/design/historical.html">Historical</a></li>
+<li><a href="/docs/24.0.0/design/middlemanager.html">MiddleManager</a> and <a href="/docs/24.0.0/design/peons.html">Peons</a></li>
+<li><a href="/docs/24.0.0/design/indexer.html">Indexer (Optional)</a></li>
+<li><a href="/docs/24.0.0/design/router.html">Router (Optional)</a></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="server-types"></a><a href="#server-types" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
+<p>Druid processes can be deployed any way you like, but for ease of deployment we suggest organizing them into three server types:</p>
+<ul>
+<li><strong>Master</strong></li>
+<li><strong>Query</strong></li>
+<li><strong>Data</strong></li>
+</ul>
+<p><img src="../assets/druid-architecture.png" width="800"/></p>
+<p>This section describes the Druid processes and the suggested Master/Query/Data server organization, as shown in the architecture diagram above.</p>
+<h3><a class="anchor" aria-hidden="true" id="master-server"></a><a href="#master-server" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>A Master server manages data ingestion and availability: it is responsible for starting new ingestion jobs and coordinating availability of data on the &quot;Data servers&quot; described below.</p>
+<p>Within a Master server, functionality is split between two processes, the Coordinator and Overlord.</p>
+<h4><a class="anchor" aria-hidden="true" id="coordinator-process"></a><a href="#coordinator-process" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<p><a href="/docs/24.0.0/design/coordinator.html"><strong>Coordinator</strong></a> processes watch over the Historical processes on the Data servers. They are responsible for assigning segments to specific servers, and for ensuring segments are well-balanced across Historicals.</p>
+<h4><a class="anchor" aria-hidden="true" id="overlord-process"></a><a href="#overlord-process" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<p><a href="/docs/24.0.0/design/overlord.html"><strong>Overlord</strong></a> processes watch over the MiddleManager processes on the Data servers and are the controllers of data ingestion into Druid. They are responsible for assigning ingestion tasks to MiddleManagers and for coordinating segment publishing.</p>
+<h3><a class="anchor" aria-hidden="true" id="query-server"></a><a href="#query-server" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
+<p>A Query server provides the endpoints that users and client applications interact with, routing queries to Data servers or other Query servers (and optionally proxied Master server requests as well).</p>
+<p>Within a Query server, functionality is split between two processes, the Broker and Router.</p>
+<h4><a class="anchor" aria-hidden="true" id="broker-process"></a><a href="#broker-process" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p><a href="/docs/24.0.0/design/broker.html"><strong>Broker</strong></a> processes receive queries from external clients and forward those queries to Data servers. When Brokers receive results from those subqueries, they merge those results and return them to the
+caller. End users typically query Brokers rather than querying Historicals or MiddleManagers processes on Data servers directly.</p>
+<h4><a class="anchor" aria-hidden="true" id="router-process-optional"></a><a href="#router-process-optional" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
+<p><a href="/docs/24.0.0/design/router.html"><strong>Router</strong></a> processes are <em>optional</em> processes that provide a unified API gateway in front of Druid Brokers,
+Overlords, and Coordinators. They are optional since you can also simply contact the Druid Brokers, Overlords, and
+Coordinators directly.</p>
+<p>The Router also runs the <a href="/docs/24.0.0/operations/druid-console.html">Druid console</a>, a management UI for datasources, segments, tasks, data processes (Historicals and MiddleManagers), and coordinator dynamic configuration. The user can also run SQL and native Druid queries within the console.</p>
+<h3><a class="anchor" aria-hidden="true" id="data-server"></a><a href="#data-server" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
+<p>A Data server executes ingestion jobs and stores queryable data.</p>
+<p>Within a Data server, functionality is split between two processes, the Historical and MiddleManager.</p>
+<h3><a class="anchor" aria-hidden="true" id="historical-process"></a><a href="#historical-process" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
+<p><a href="/docs/24.0.0/design/historical.html"><strong>Historical</strong></a> processes are the workhorses that handle storage and querying on &quot;historical&quot; data
+(including any streaming data that has been in the system long enough to be committed). Historical processes
+download segments from deep storage and respond to queries about these segments. They don't accept writes.</p>
+<h3><a class="anchor" aria-hidden="true" id="middle-manager-process"></a><a href="#middle-manager-process" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0 [...]
+<p><a href="/docs/24.0.0/design/middlemanager.html"><strong>MiddleManager</strong></a> processes handle ingestion of new data into the cluster. They are responsible
+for reading from external data sources and publishing new Druid segments.</p>
+<h4><a class="anchor" aria-hidden="true" id="peon-processes"></a><a href="#peon-processes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p><a href="/docs/24.0.0/design/peons.html"><strong>Peon</strong></a> processes are task execution engines spawned by MiddleManagers. Each Peon runs a separate JVM and is responsible for executing a single task. Peons always run on the same host as the MiddleManager that spawned them.</p>
+<h3><a class="anchor" aria-hidden="true" id="indexer-process-optional"></a><a href="#indexer-process-optional" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
+<p><a href="/docs/24.0.0/design/indexer.html"><strong>Indexer</strong></a> processes are an alternative to MiddleManagers and Peons. Instead of
+forking separate JVM processes per-task, the Indexer runs tasks as individual threads within a single JVM process.</p>
+<p>The Indexer is designed to be easier to configure and deploy compared to the MiddleManager + Peon system and to
+better enable resource sharing across tasks. The Indexer is a newer feature and is currently designated
+<a href="/docs/24.0.0/development/experimental.html">experimental</a> due to the fact that its memory management system is still under
+development. It will continue to mature in future versions of Druid.</p>
+<p>Typically, you would deploy either MiddleManagers or Indexers, but not both.</p>
+<h2><a class="anchor" aria-hidden="true" id="pros-and-cons-of-colocation"></a><a href="#pros-and-cons-of-colocation" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>Druid processes can be colocated based on the Master/Data/Query server organization as
+described above. This organization generally results in better utilization of
+hardware resources for most clusters.</p>
+<p>For very large scale clusters, however, it can be desirable to split the Druid processes
+such that they run on individual servers to avoid resource contention.</p>
+<p>This section describes guidelines and configuration parameters related to process colocation.</p>
+<h3><a class="anchor" aria-hidden="true" id="coordinators-and-overlords"></a><a href="#coordinators-and-overlords" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H [...]
+<p>The workload on the Coordinator process tends to increase with the number of segments in the cluster. The Overlord's workload also increases based on the number of segments in the cluster, but to a lesser degree than the Coordinator.</p>
+<p>In clusters with very high segment counts, it can make sense to separate the Coordinator and Overlord processes to provide more resources for the Coordinator's segment balancing workload.</p>
+<h4><a class="anchor" aria-hidden="true" id="unified-process"></a><a href="#unified-process" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
+<p>The Coordinator and Overlord processes can be run as a single combined process by setting the <code>druid.coordinator.asOverlord.enabled</code> property.</p>
+<p>Please see <a href="/docs/24.0.0/configuration/index.html#coordinator-operation">Coordinator Configuration: Operation</a> for details.</p>
+<h3><a class="anchor" aria-hidden="true" id="historicals-and-middlemanagers"></a><a href="#historicals-and-middlemanagers" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 1 [...]
+<p>With higher levels of ingestion or query load, it can make sense to deploy the Historical and MiddleManager processes on separate hosts to to avoid CPU and memory contention.</p>
+<p>The Historical also benefits from having free memory for memory mapped segments, which can be another reason to deploy the Historical and MiddleManager processes separately.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/design/segments.html"><span class="arrow-prev">← </span><span>Segments</span></a><a class="docs-next button" href="/docs/24.0.0/dependencies/deep-storage.html"><span>Deep storage</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#process-types">Process types</a></li><li><a href="#server-types">Server types</a><ul c [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/design/realtime.html b/docs/24.0.0/design/realtime.html
new file mode 100644
index 00000000..2f57fca1
--- /dev/null
+++ b/docs/24.0.0/design/realtime.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../ingestion/standalone-realtime.html">
+<meta http-equiv="refresh" content="0; url=../ingestion/standalone-realtime.html">
+<h1>Redirecting...</h1>
+<a href="../ingestion/standalone-realtime.html">Click here if you are not redirected.</a>
+<script>location="../ingestion/standalone-realtime.html"</script>
diff --git a/docs/latest/design/router.html b/docs/24.0.0/design/router.html
similarity index 53%
copy from docs/latest/design/router.html
copy to docs/24.0.0/design/router.html
index 60ce5dbf..67a7b190 100644
--- a/docs/latest/design/router.html
+++ b/docs/24.0.0/design/router.html
@@ -1,9 +1,9 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Router Process · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/latest/design/router.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="0.23.0" /><meta prope [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Router Process · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/design/router.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24.0.0" /><meta prope [...]
               window.dataLayer = window.dataLayer || [];
               function gtag(){dataLayer.push(arguments); }
               gtag('js', new Date());
               gtag('config', 'UA-131010415-1');
-            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
@@ -77,17 +77,14 @@
   ~ specific language governing permissions and limitations
   ~ under the License.
   -->
-<blockquote>
-<p>The Router is an optional and <a href="/docs/latest/development/experimental.html">experimental</a> feature due to the fact that its recommended place in the Druid cluster architecture is still evolving.
-However, it has been battle-tested in production, and it hosts the powerful <a href="/docs/latest/operations/druid-console.html">Druid Console</a>, so you should feel safe deploying it.</p>
-</blockquote>
-<p>The Apache Druid Router process can be used to route queries to different Broker processes. By default, the broker routes queries based on how <a href="/docs/latest/operations/rule-configuration.html">Rules</a> are set up. For example, if 1 month of recent data is loaded into a <code>hot</code> cluster, queries that fall within the recent month can be routed to a dedicated set of brokers. Queries outside this range are routed to another set of brokers. This set up provides query isola [...]
+<p>The Apache Druid Router process can be used to route queries to different Broker processes. By default, the broker routes queries based on how <a href="/docs/24.0.0/operations/rule-configuration.html">Rules</a> are set up. For example, if 1 month of recent data is loaded into a <code>hot</code> cluster, queries that fall within the recent month can be routed to a dedicated set of brokers. Queries outside this range are routed to another set of brokers. This set up provides query isola [...]
 <p>For query routing purposes, you should only ever need the Router process if you have a Druid cluster well into the terabyte range.</p>
-<p>In addition to query routing, the Router also runs the <a href="/docs/latest/operations/druid-console.html">Druid Console</a>, a management UI for datasources, segments, tasks, data processes (Historicals and MiddleManagers), and coordinator dynamic configuration. The user can also run SQL and native Druid queries within the console.</p>
+<p>In addition to query routing, the Router also runs the <a href="/docs/24.0.0/operations/druid-console.html">Druid console</a>, a management UI for datasources, segments, tasks, data processes (Historicals and MiddleManagers), and coordinator dynamic configuration. The user can also run SQL and native Druid queries within the console.</p>
 <h3><a class="anchor" aria-hidden="true" id="configuration"></a><a href="#configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
-<p>For Apache Druid Router Process Configuration, see <a href="/docs/latest/configuration/index.html#router">Router Configuration</a>.</p>
+<p>For Apache Druid Router Process Configuration, see <a href="/docs/24.0.0/configuration/index.html#router">Router Configuration</a>.</p>
+<p>For basic tuning guidance for the Router process, see <a href="/docs/24.0.0/operations/basic-cluster-tuning.html#router">Basic cluster tuning</a>.</p>
 <h3><a class="anchor" aria-hidden="true" id="http-endpoints"></a><a href="#http-endpoints" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<p>For a list of API endpoints supported by the Router, see <a href="/docs/latest/operations/api-reference.html#router">Router API</a>.</p>
+<p>For a list of API endpoints supported by the Router, see <a href="/docs/24.0.0/operations/api-reference.html#router">Router API</a>.</p>
 <h3><a class="anchor" aria-hidden="true" id="running"></a><a href="#running" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
 <pre><code class="hljs">org.apache.druid.cli.Main<span class="hljs-built_in"> server </span>router
 </code></pre>
@@ -156,7 +153,7 @@ This strategy can route both Native and SQL queries (when enabled).</p>
 }
 </code></pre>
 <blockquote>
-<p>JavaScript-based functionality is disabled by default. Please refer to the Druid <a href="/docs/latest/development/javascript.html">JavaScript programming guide</a> for guidelines about using Druid's JavaScript functionality, including instructions on how to enable it.</p>
+<p>JavaScript-based functionality is disabled by default. Please refer to the Druid <a href="/docs/24.0.0/development/javascript.html">JavaScript programming guide</a> for guidelines about using Druid's JavaScript functionality, including instructions on how to enable it.</p>
 </blockquote>
 <h3><a class="anchor" aria-hidden="true" id="routing-of-sql-queries-using-strategies"></a><a href="#routing-of-sql-queries-using-strategies" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2  [...]
 <p>To enable routing of SQL queries using strategies, set <code>druid.router.sql.enable</code> to <code>true</code>. The broker service for a
@@ -222,7 +219,7 @@ Druid always routes Avatica JDBC requests based on connection ID.</p>
 
 <span class="hljs-attr">druid.server.http.numThreads</span>=<span class="hljs-number">100</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/latest/design/overlord.html"><span class="arrow-prev">← </span><span>Overlord Process</span></a><a class="docs-next button" href="/docs/latest/design/peons.html"><span>Peons</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer druid-footer" id="footer"><div class="container"><div class="text-center"><p><a href="/technology"> [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/design/overlord.html"><span class="arrow-prev">← </span><span>Overlord Process</span></a><a class="docs-next button" href="/docs/24.0.0/design/peons.html"><span>Peons</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer druid-footer" id="footer"><div class="container"><div class="text-center"><p><a href="/technology"> [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
@@ -239,6 +236,6 @@ Druid always routes Avatica JDBC requests based on connection ID.</p>
                 apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
                 indexName: 'apache_druid',
                 inputSelector: '#search_input_react',
-                algoliaOptions: {"facetFilters":["language:en","version:0.23.0"]}
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
               });
             </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/design/segments.html b/docs/24.0.0/design/segments.html
new file mode 100644
index 00000000..43189681
--- /dev/null
+++ b/docs/24.0.0/design/segments.html
@@ -0,0 +1,241 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Segments · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/design/segments.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24.0.0" /><meta property= [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/design/segments.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Segments</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>Apache Druid stores its data and indexes in <em>segment files</em> partitioned by time. Druid creates a segment for each segment interval that contains data. If an interval is empty—that is, containing no rows—no segment exists for that time interval. Druid may create multiple segments for the same interval if you ingest data for that period via different ingestion jobs. <a href="/docs/24.0.0/ingestion/compaction.html">Compaction</a> is the Druid process that attempts to combine these [...]
+<p>The time interval is configurable in the <code>segmentGranularity</code> parameter of the <a href="/docs/24.0.0/ingestion/ingestion-spec.html#granularityspec"><code>granularitySpec</code></a>.</p>
+<p>For Druid to operate well under heavy query load, it is important for the segment
+file size to be within the recommended range of 300-700 MB. If your
+segment files are larger than this range, then consider either
+changing the granularity of the segment time interval or partitioning your
+data and/or adjusting the <code>targetRowsPerSegment</code> in your <code>partitionsSpec</code>.
+A good starting point for this parameter is 5 million rows.
+See the Sharding section below and the &quot;Partitioning specification&quot; section of
+the <a href="/docs/24.0.0/ingestion/hadoop.html#partitionsspec">Batch ingestion</a> documentation
+for more guidance.</p>
+<h2><a class="anchor" aria-hidden="true" id="segment-file-structure"></a><a href="#segment-file-structure" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0 [...]
+<p>Segment files are <em>columnar</em>: the data for each column is laid out in
+separate data structures. By storing each column separately, Druid decreases query latency by scanning only those columns actually needed for a query. There are three basic column types: timestamp, dimensions, and metrics:</p>
+<p><img src="../assets/druid-column-types.png" alt="Druid column types" title="Druid Column Types"></p>
+<p>Timestamp and metrics type columns are arrays of integer or floating point values compressed with
+<a href="https://github.com/lz4/lz4-java">LZ4</a>. Once a query identifies which rows to select, it decompresses them, pulls out the relevant rows, and applies the
+desired aggregation operator. If a query doesn’t require a column, Druid skips over that column's data.</p>
+<p>Dimension columns are different because they support filter and
+group-by operations, so each dimension requires the following
+three data structures:</p>
+<ul>
+<li><strong>Dictionary</strong>: Maps values (which are always treated as strings) to integer IDs, allowing compact representation of the list and bitmap values.</li>
+<li><strong>List</strong>: The column’s values, encoded using the dictionary. Required for GroupBy and TopN queries. These operators allow queries that solely aggregate metrics based on filters to run without accessing the list of values.</li>
+<li><strong>Bitmap</strong>: One bitmap for each distinct value in the column, to indicate which rows contain that value. Bitmaps allow for quick filtering operations because they are convenient for quickly applying AND and OR operators. Also known as inverted indexes.</li>
+</ul>
+<p>To get a better sense of these data structures, consider the &quot;Page&quot; column from the example data above, represented by the following data structures:</p>
+<pre><code class="hljs"><span class="hljs-number">1</span>: Dictionary
+   {
+    <span class="hljs-string">"Justin Bieber"</span>: <span class="hljs-number">0</span>,
+    <span class="hljs-string">"Ke$ha"</span>:         <span class="hljs-number">1</span>
+   }
+
+<span class="hljs-number">2</span>: List of column data
+   [<span class="hljs-number">0</span>,
+   <span class="hljs-number">0</span>,
+   <span class="hljs-number">1</span>,
+   <span class="hljs-number">1</span>]
+
+<span class="hljs-number">3</span>: Bitmaps
+   value=<span class="hljs-string">"Justin Bieber"</span>: [<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>]
+   value=<span class="hljs-string">"Ke$ha"</span>:         [<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">1</span>,<span class="hljs-number">1</span>]
+</code></pre>
+<p>Note that the bitmap is different from the dictionary and list data structures: the dictionary and list grow linearly with the size of the data, but the size of the bitmap section is the product of data size and column cardinality. That is, there is one bitmap per separate column value. Columns with the same value share the same bitmap.</p>
+<p>For each row in the list of column data, there is only a single bitmap that has a non-zero entry. This means that high cardinality columns have extremely sparse, and therefore highly compressible, bitmaps. Druid exploits this using compression algorithms that are specially suited for bitmaps, such as <a href="https://github.com/RoaringBitmap/RoaringBitmap">Roaring bitmap compression</a>.</p>
+<h2><a class="anchor" aria-hidden="true" id="handling-null-values"></a><a href="#handling-null-values" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<p>By default, Druid string dimension columns use the values <code>''</code> and <code>null</code> interchangeably. Numeric and metric columns cannot represent <code>null</code> but use nulls to mean <code>0</code>. However, Druid provides a SQL compatible null handling mode, which you can enable at the system level through <code>druid.generic.useDefaultValueForNull</code>. This setting, when set to <code>false</code>, allows Druid to create segments <em>at ingestion time</em> in which t [...]
+<ul>
+<li>String columns can distinguish <code>''</code> from <code>null</code>,</li>
+<li>Numeric columns can represent <code>null</code> valued rows instead of <code>0</code>.</li>
+</ul>
+<p>String dimension columns contain no additional column structures in SQL compatible null handling mode. Instead, they reserve an additional dictionary entry for the <code>null</code> value. Numeric columns are stored in the segment with an additional bitmap in which the set bits indicate <code>null</code>-valued rows.</p>
+<p>In addition to slightly increased segment sizes, SQL compatible null handling can incur a performance cost at query time, due to the need to check the null bitmap. This performance cost only occurs for columns that actually contain null values.</p>
+<h2><a class="anchor" aria-hidden="true" id="segments-with-different-schemas"></a><a href="#segments-with-different-schemas" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 [...]
+<p>Druid segments for the same datasource may have different schemas. If a string column (dimension) exists in one segment but not another, queries that involve both segments still work. In default mode, queries for the segment without the dimension behave as if the dimension contains only blank values. In SQL-compatible mode, queries for the segment without the dimension behave as if the dimension contains only null values. Similarly, if one segment has a numeric column (metric) but ano [...]
+<h2><a class="anchor" aria-hidden="true" id="column-format"></a><a href="#column-format" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>Each column is stored as two parts:</p>
+<ul>
+<li>A Jackson-serialized <code>ColumnDescriptor</code>.</li>
+<li>The binary data for the column.</li>
+</ul>
+<p>A <code>ColumnDescriptor</code> is  Jackson-serialized instance of the internal Druid <code>ColumnDescriptor</code> class . It allows the use of Jackson's polymorphic deserialization to add new and interesting methods of serialization with minimal impact to the code. It consists of some metadata about the column (for example: type, whether it's multi-value) and a list of serialization/deserialization logic that can deserialize the rest of the binary.</p>
+<h3><a class="anchor" aria-hidden="true" id="multi-value-columns"></a><a href="#multi-value-columns" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<p>A multi-value column allows a single row to contain multiple strings for a column. You can think of it as an array of strings. If a datasource uses multi-value columns, then the data structures within the segment files look a bit different. Let's imagine that in the example above, the second row is tagged with both the <code>Ke$ha</code> <em>and</em> <code>Justin Bieber</code> topics, as follows:</p>
+<pre><code class="hljs"><span class="hljs-number">1</span>: Dictionary
+   {
+    <span class="hljs-string">"Justin Bieber"</span>: <span class="hljs-number">0</span>,
+    <span class="hljs-string">"Ke$ha"</span>:         <span class="hljs-number">1</span>
+   }
+
+<span class="hljs-number">2</span>: List of column data
+   [<span class="hljs-number">0</span>,
+   [<span class="hljs-number">0</span>,<span class="hljs-number">1</span>],  &lt;--Row value <span class="hljs-keyword">in</span> a multi-value column can contain an <span class="hljs-built_in">array</span> of values
+   <span class="hljs-number">1</span>,
+   <span class="hljs-number">1</span>]
+
+<span class="hljs-number">3</span>: Bitmaps
+   value=<span class="hljs-string">"Justin Bieber"</span>: [<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>]
+   value=<span class="hljs-string">"Ke$ha"</span>:         [<span class="hljs-number">0</span>,<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">1</span>]
+                            ^
+                            |
+                            |
+   Multi-value column contains multiple non-zero entries
+</code></pre>
+<p>Note the changes to the second row in the list of column data and the <code>Ke$ha</code>
+bitmap. If a row has more than one value for a column, its entry in
+the list is an array of values. Additionally, a row with <em>n</em> values in the list has <em>n</em> non-zero valued entries in bitmaps.</p>
+<h2><a class="anchor" aria-hidden="true" id="compression"></a><a href="#compression" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
+<p>Druid uses LZ4 by default to compress blocks of values for string, long, float, and double columns. Druid uses Roaring to compress bitmaps for string columns and numeric null values. We recommend that you use these defaults unless you've experimented with your data and query patterns suggest that non-default options will perform better in your specific case.</p>
+<p>Druid also supports Concise bitmap compression. For string column bitmaps, the differences between using Roaring and Concise are most pronounced for high cardinality columns. In this case, Roaring is substantially faster on filters that match many values, but in some cases Concise can have a lower footprint due to the overhead of the Roaring format (but is still slower when many values are matched). You configure compression at the segment level, not for individual columns. See <a hre [...]
+<h2><a class="anchor" aria-hidden="true" id="segment-identification"></a><a href="#segment-identification" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0 [...]
+<p>Segment identifiers typically contain the segment datasource, interval start time (in ISO 8601 format), interval end time (in ISO 8601 format), and version information. If data is additionally sharded beyond a time range, the segment identifier also contains a partition number:</p>
+<p><code>datasource_intervalStart_intervalEnd_version_partitionNum</code></p>
+<h3><a class="anchor" aria-hidden="true" id="segment-id-examples"></a><a href="#segment-id-examples" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
+<p>The increasing partition numbers in the following segments indicate that multiple segments exist for the same interval:</p>
+<pre><code class="hljs">foo_2015<span class="hljs-number">-01</span><span class="hljs-number">-01</span>/<span class="hljs-number">2015</span><span class="hljs-number">-01</span><span class="hljs-number">-02</span>_v1_0
+foo_2015<span class="hljs-number">-01</span><span class="hljs-number">-01</span>/<span class="hljs-number">2015</span><span class="hljs-number">-01</span><span class="hljs-number">-02</span>_v1_1
+foo_2015<span class="hljs-number">-01</span><span class="hljs-number">-01</span>/<span class="hljs-number">2015</span><span class="hljs-number">-01</span><span class="hljs-number">-02</span>_v1_2
+</code></pre>
+<p>If you reindex the data with a new schema, Druid allocates a new version ID to the newly created segments:</p>
+<pre><code class="hljs">foo_2015<span class="hljs-number">-01</span><span class="hljs-number">-01</span>/<span class="hljs-number">2015</span><span class="hljs-number">-01</span><span class="hljs-number">-02</span>_v2_0
+foo_2015<span class="hljs-number">-01</span><span class="hljs-number">-01</span>/<span class="hljs-number">2015</span><span class="hljs-number">-01</span><span class="hljs-number">-02</span>_v2_1
+foo_2015<span class="hljs-number">-01</span><span class="hljs-number">-01</span>/<span class="hljs-number">2015</span><span class="hljs-number">-01</span><span class="hljs-number">-02</span>_v2_2
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="sharding"></a><a href="#sharding" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<p>Multiple segments can exist for a single time interval and datasource. These segments form a <code>block</code> for an interval. Depending on the type of <code>shardSpec</code> used to shard the data, Druid queries may only complete if a <code>block</code> is complete. For example, if a block consists of the following three segments:</p>
+<pre><code class="hljs">sampleData_2011<span class="hljs-number">-01</span><span class="hljs-number">-01</span>T02:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>Z_2011<span class="hljs-number">-01</span><span class="hljs-number">-01</span>T03:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>Z_v1_0
+sampleData_2011<span class="hljs-number">-01</span><span class="hljs-number">-01</span>T02:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>Z_2011<span class="hljs-number">-01</span><span class="hljs-number">-01</span>T03:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>Z_v1_1
+sampleData_2011<span class="hljs-number">-01</span><span class="hljs-number">-01</span>T02:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>Z_2011<span class="hljs-number">-01</span><span class="hljs-number">-01</span>T03:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>Z_v1_2
+</code></pre>
+<p>All three segments must load before a query for the interval <code>2011-01-01T02:00:00:00Z_2011-01-01T03:00:00:00Z</code> can complete.</p>
+<p>Linear shard specs are an exception to this rule. Linear shard specs do not enforce &quot;completeness&quot; so queries can complete even if shards are not completely loaded.</p>
+<p>For example, if a real-time ingestion creates three segments that were sharded with linear shard spec, and only two of the segments are loaded, queries return results for those two segments.</p>
+<h2><a class="anchor" aria-hidden="true" id="segment-components"></a><a href="#segment-components" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
+<p>A segment contains several files:</p>
+<ul>
+<li><p><code>version.bin</code></p>
+<p>4 bytes representing the current segment version as an integer. For example, for v9 segments the version is 0x0, 0x0, 0x0, 0x9.</p></li>
+<li><p><code>meta.smoosh</code></p>
+<p>A file containing metadata (filenames and offsets) about the contents of the other <code>smoosh</code> files.</p></li>
+<li><p><code>XXXXX.smoosh</code></p>
+<p>Smoosh (<code>.smoosh</code>) files contain concatenated binary data. This file consolidation reduces the number of file descriptors that must be open when accessing data. The files are 2 GB or less in size to remain within the limit of a memory-mapped <code>ByteBuffer</code> in Java.
+Smoosh files contain the following:</p>
+<ul>
+<li>Individual files for each column in the data, including one for the <code>__time</code> column that refers to the timestamp of the segment.</li>
+<li>An <code>index.drd</code> file that contains additional segment metadata.</li>
+</ul></li>
+</ul>
+<p>In the codebase, segments have an internal format version. The current segment format version is <code>v9</code>.</p>
+<h2><a class="anchor" aria-hidden="true" id="implications-of-updating-segments"></a><a href="#implications-of-updating-segments" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S1 [...]
+<p>Druid uses versioning to manage updates to create a form of multi-version concurrency control (MVCC). These MVCC versions are distinct from the segment format version discussed above.</p>
+<p>Note that updates that span multiple segment intervals are only atomic within each interval. They are not atomic across the entire update. For example, if you have the following segments:</p>
+<pre><code class="hljs">foo_2015<span class="hljs-number">-01</span><span class="hljs-number">-01</span>/<span class="hljs-number">2015</span><span class="hljs-number">-01</span><span class="hljs-number">-02</span>_v1_0
+foo_2015<span class="hljs-number">-01</span><span class="hljs-number">-02</span>/<span class="hljs-number">2015</span><span class="hljs-number">-01</span><span class="hljs-number">-03</span>_v1_1
+foo_2015<span class="hljs-number">-01</span><span class="hljs-number">-03</span>/<span class="hljs-number">2015</span><span class="hljs-number">-01</span><span class="hljs-number">-04</span>_v1_2
+</code></pre>
+<p><code>v2</code> segments are loaded into the cluster as soon as they are built and replace <code>v1</code> segments for the period of time the segments overlap. Before <code>v2</code> segments are completely loaded, the cluster may contain a mixture of <code>v1</code> and <code>v2</code> segments.</p>
+<pre><code class="hljs">foo_2015<span class="hljs-number">-01</span><span class="hljs-number">-01</span>/<span class="hljs-number">2015</span><span class="hljs-number">-01</span><span class="hljs-number">-02</span>_v1_0
+foo_2015<span class="hljs-number">-01</span><span class="hljs-number">-02</span>/<span class="hljs-number">2015</span><span class="hljs-number">-01</span><span class="hljs-number">-03</span>_v2_1
+foo_2015<span class="hljs-number">-01</span><span class="hljs-number">-03</span>/<span class="hljs-number">2015</span><span class="hljs-number">-01</span><span class="hljs-number">-04</span>_v1_2
+</code></pre>
+<p>In this case, queries may hit a mixture of <code>v1</code> and <code>v2</code> segments.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/design/architecture.html"><span class="arrow-prev">← </span><span>Design</span></a><a class="docs-next button" href="/docs/24.0.0/design/processes.html"><span>Processes and servers</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#segment-file-structure">Segment file structure</a></li><li><a href="#handling-null-v [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/development/approximate-histograms.html b/docs/24.0.0/development/approximate-histograms.html
new file mode 100644
index 00000000..8df48399
--- /dev/null
+++ b/docs/24.0.0/development/approximate-histograms.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="extensions-core/approximate-histograms.html">
+<meta http-equiv="refresh" content="0; url=extensions-core/approximate-histograms.html">
+<h1>Redirecting...</h1>
+<a href="extensions-core/approximate-histograms.html">Click here if you are not redirected.</a>
+<script>location="extensions-core/approximate-histograms.html"</script>
diff --git a/docs/24.0.0/development/build.html b/docs/24.0.0/development/build.html
new file mode 100644
index 00000000..bc1244a3
--- /dev/null
+++ b/docs/24.0.0/development/build.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Build from source · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/development/build.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24.0.0" /><met [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/development/build.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Build from source</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>You can build Apache Druid directly from source. Use the version of this page
+that matches the version you want to build.
+For building the latest code in master, follow the latest version of this page
+<a href="https://github.com/apache/druid/blob/master/docs/development/build.md">here</a>:
+make sure it has <code>/master/</code> in the URL.</p>
+<h4><a class="anchor" aria-hidden="true" id="prerequisites"></a><a href="#prerequisites" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<h5><a class="anchor" aria-hidden="true" id="installing-java-and-maven"></a><a href="#installing-java-and-maven" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
+<ul>
+<li>JDK 8, 8u92+ or JDK 11. See our <a href="/docs/24.0.0/operations/java.html">Java documentation</a> for information about obtaining a JDK.</li>
+<li><a href="http://maven.apache.org/download.cgi">Maven version 3.x</a></li>
+</ul>
+<h5><a class="anchor" aria-hidden="true" id="other-dependencies"></a><a href="#other-dependencies" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
+<ul>
+<li>Distribution builds require Python 3.x and the <code>pyyaml</code> module</li>
+</ul>
+<h5><a class="anchor" aria-hidden="true" id="downloading-the-source"></a><a href="#downloading-the-source" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0 [...]
+<pre><code class="hljs css language-bash">git <span class="hljs-built_in">clone</span> git@github.com:apache/druid.git
+<span class="hljs-built_in">cd</span> druid
+</code></pre>
+<h4><a class="anchor" aria-hidden="true" id="building-from-source"></a><a href="#building-from-source" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
+<p>The basic command to build Druid from source is:</p>
+<pre><code class="hljs css language-bash">mvn clean install
+</code></pre>
+<p>This will run static analysis, unit tests, compile classes, and package the projects into JARs. It will <em>not</em> generate the source or binary distribution tarball.</p>
+<p>In addition to the basic stages, you may also want to add the following profiles and properties:</p>
+<ul>
+<li><strong>-Pdist</strong> - Distribution profile: Generates the binary distribution tarball by pulling in core extensions and dependencies and packaging the files as <code>distribution/target/apache-druid-x.x.x-bin.tar.gz</code></li>
+<li><strong>-Papache-release</strong> - Apache release profile: Generates GPG signature and checksums, and builds the source distribution tarball as <code>distribution/target/apache-druid-x.x.x-src.tar.gz</code></li>
+<li><strong>-Prat</strong> - Apache Rat profile: Runs the Apache Rat license audit tool</li>
+<li><strong>-DskipTests</strong> - Skips unit tests (which reduces build time)</li>
+<li><strong>-Ddruid.console.skip=true</strong> - Skip front end project</li>
+</ul>
+<p>Putting these together, if you wish to build the source and binary distributions with signatures and checksums, audit licenses, and skip the unit tests, you would run:</p>
+<pre><code class="hljs css language-bash">mvn clean install -Papache-release,dist,rat -DskipTests
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="building-hadoop-3-distribution"></a><a href="#building-hadoop-3-distribution" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 1 [...]
+<p>By default, druid ships hadoop 2.x.x jars along with the distribution. Exact version can be found in the
+main <a href="https://github.com/apache/druid/blob/master/pom.xml">pom</a>. To build druid with hadoop 3.x.x jars, hadoop3 profile
+needs to be activated.</p>
+<p>To generate build with hadoop 3 dependencies, run:</p>
+<pre><code class="hljs css language-bash">mvn clean install -Phadoop3
+</code></pre>
+<p>To generate distribution with hadoop3 dependencies, run :</p>
+<pre><code class="hljs css language-bash">mvn clean install -Papache-release,dist-hadoop3,rat,hadoop3 -DskipTests 
+</code></pre>
+<h4><a class="anchor" aria-hidden="true" id="potential-issues"></a><a href="#potential-issues" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<h5><a class="anchor" aria-hidden="true" id="missing-pyyaml"></a><a href="#missing-pyyaml" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
+<p>You are building Druid from source following the instructions on this page but you get</p>
+<pre><code class="hljs">[ERROR] Failed to<span class="hljs-built_in"> execute </span>goal org.codehaus.mojo:exec-maven-plugin:1.6.0:exec (generate-binary-license) on project distribution: Command execution failed.: Process exited with an error: 1 (Exit value: 1) -&gt; [Help 1]
+</code></pre>
+<p>Resolution: Make sure you have Python installed as well as the <code>yaml</code> module:</p>
+<pre><code class="hljs css language-bash">pip install pyyaml
+</code></pre>
+<p>On some systems, ensure you use the Python 3.x version of <code>pip</code>:</p>
+<pre><code class="hljs css language-bash">pip3 install pyyaml
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/development/javascript.html"><span class="arrow-prev">← </span><span class="function-name-prevnext">JavaScript functionality</span></a><a class="docs-next button" href="/docs/24.0.0/development/versioning.html"><span>Versioning</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer druid-footer" id="footer"><div class=" [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/development/community-extensions/azure.html b/docs/24.0.0/development/community-extensions/azure.html
new file mode 100644
index 00000000..8c8a06e4
--- /dev/null
+++ b/docs/24.0.0/development/community-extensions/azure.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../extensions-core/azure.html">
+<meta http-equiv="refresh" content="0; url=../extensions-core/azure.html">
+<h1>Redirecting...</h1>
+<a href="../extensions-core/azure.html">Click here if you are not redirected.</a>
+<script>location="../extensions-core/azure.html"</script>
diff --git a/docs/24.0.0/development/community-extensions/cassandra.html b/docs/24.0.0/development/community-extensions/cassandra.html
new file mode 100644
index 00000000..7026a6a6
--- /dev/null
+++ b/docs/24.0.0/development/community-extensions/cassandra.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../extensions-contrib/cassandra.html">
+<meta http-equiv="refresh" content="0; url=../extensions-contrib/cassandra.html">
+<h1>Redirecting...</h1>
+<a href="../extensions-contrib/cassandra.html">Click here if you are not redirected.</a>
+<script>location="../extensions-contrib/cassandra.html"</script>
diff --git a/docs/24.0.0/development/community-extensions/cloudfiles.html b/docs/24.0.0/development/community-extensions/cloudfiles.html
new file mode 100644
index 00000000..0c9b8c5e
--- /dev/null
+++ b/docs/24.0.0/development/community-extensions/cloudfiles.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../extensions-contrib/cloudfiles.html">
+<meta http-equiv="refresh" content="0; url=../extensions-contrib/cloudfiles.html">
+<h1>Redirecting...</h1>
+<a href="../extensions-contrib/cloudfiles.html">Click here if you are not redirected.</a>
+<script>location="../extensions-contrib/cloudfiles.html"</script>
diff --git a/docs/24.0.0/development/community-extensions/graphite.html b/docs/24.0.0/development/community-extensions/graphite.html
new file mode 100644
index 00000000..dc318948
--- /dev/null
+++ b/docs/24.0.0/development/community-extensions/graphite.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../extensions-contrib/graphite.html">
+<meta http-equiv="refresh" content="0; url=../extensions-contrib/graphite.html">
+<h1>Redirecting...</h1>
+<a href="../extensions-contrib/graphite.html">Click here if you are not redirected.</a>
+<script>location="../extensions-contrib/graphite.html"</script>
diff --git a/docs/24.0.0/development/community-extensions/kafka-simple.html b/docs/24.0.0/development/community-extensions/kafka-simple.html
new file mode 100644
index 00000000..179d16a8
--- /dev/null
+++ b/docs/24.0.0/development/community-extensions/kafka-simple.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../extensions-core/kafka-ingestion.html">
+<meta http-equiv="refresh" content="0; url=../extensions-core/kafka-ingestion.html">
+<h1>Redirecting...</h1>
+<a href="../extensions-core/kafka-ingestion.html">Click here if you are not redirected.</a>
+<script>location="../extensions-core/kafka-ingestion.html"</script>
diff --git a/docs/24.0.0/development/community-extensions/rabbitmq.html b/docs/24.0.0/development/community-extensions/rabbitmq.html
new file mode 100644
index 00000000..179d16a8
--- /dev/null
+++ b/docs/24.0.0/development/community-extensions/rabbitmq.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../extensions-core/kafka-ingestion.html">
+<meta http-equiv="refresh" content="0; url=../extensions-core/kafka-ingestion.html">
+<h1>Redirecting...</h1>
+<a href="../extensions-core/kafka-ingestion.html">Click here if you are not redirected.</a>
+<script>location="../extensions-core/kafka-ingestion.html"</script>
diff --git a/docs/24.0.0/development/datasketches-aggregators.html b/docs/24.0.0/development/datasketches-aggregators.html
new file mode 100644
index 00000000..9ef81f45
--- /dev/null
+++ b/docs/24.0.0/development/datasketches-aggregators.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="extensions-core/datasketches-extension.html">
+<meta http-equiv="refresh" content="0; url=extensions-core/datasketches-extension.html">
+<h1>Redirecting...</h1>
+<a href="extensions-core/datasketches-extension.html">Click here if you are not redirected.</a>
+<script>location="extensions-core/datasketches-extension.html"</script>
diff --git a/docs/24.0.0/development/experimental.html b/docs/24.0.0/development/experimental.html
new file mode 100644
index 00000000..fc37b6a1
--- /dev/null
+++ b/docs/24.0.0/development/experimental.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Experimental features · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/development/experimental.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" content="24. [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/development/experimental.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Experimental features</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>Features often start out in &quot;experimental&quot; status that indicates they are still evolving.
+This can mean any of the following things:</p>
+<ol>
+<li>The feature's API may change even in minor releases or patch releases.</li>
+<li>The feature may have known &quot;missing&quot; pieces that will be added later.</li>
+<li>The feature may or may not have received full battle-testing in production environments.</li>
+</ol>
+<p>All experimental features are optional.</p>
+<p>Note that not all of these points apply to every experimental feature. Some have been battle-tested in terms of
+implementation, but are still marked experimental due to an evolving API. Please check the documentation for each
+feature for full details.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/development/versioning.html"><span class="arrow-prev">← </span><span>Versioning</span></a><a class="docs-next button" href="/docs/24.0.0/misc/papers-and-talks.html"><span>Papers</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer druid-footer" id="footer"><div class="container"><div class="text-center"><p><a href="/t [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/latest/development/extensions-contrib/aliyun-oss.html b/docs/24.0.0/development/extensions-contrib/aliyun-oss.html
similarity index 50%
copy from docs/latest/development/extensions-contrib/aliyun-oss.html
copy to docs/24.0.0/development/extensions-contrib/aliyun-oss.html
index b0d8875a..e2f54a7c 100644
--- a/docs/latest/development/extensions-contrib/aliyun-oss.html
+++ b/docs/24.0.0/development/extensions-contrib/aliyun-oss.html
@@ -1,9 +1,9 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Aliyun OSS · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/latest/development/extensions-contrib/aliyun-oss.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" conten [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Aliyun OSS · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/development/extensions-contrib/aliyun-oss.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" conten [...]
               window.dataLayer = window.dataLayer || [];
               function gtag(){dataLayer.push(arguments); }
               gtag('js', new Date());
               gtag('config', 'UA-131010415-1');
-            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
@@ -80,7 +80,7 @@
 <p><a href="https://www.aliyun.com">Alibaba Cloud</a> is the 3rd largest cloud infrastructure provider in the world. It provides its own storage solution known as OSS, <a href="https://www.aliyun.com/product/oss">Object Storage Service</a>.
 This document describes how to use OSS as Druid deep storage.</p>
 <h2><a class="anchor" aria-hidden="true" id="installation"></a><a href="#installation" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Use the <a href="/docs/latest/operations/pull-deps.html">pull-deps</a> tool shipped with Druid to install the <code>aliyun-oss-extensions</code> extension, as described <a href="/docs/latest/development/extensions.html#community-extensions">here</a> on middle manager and historical nodes.</p>
+<p>Use the <a href="/docs/24.0.0/operations/pull-deps.html">pull-deps</a> tool shipped with Druid to install the <code>aliyun-oss-extensions</code> extension, as described <a href="/docs/24.0.0/development/extensions.html#community-extensions">here</a> on middle manager and historical nodes.</p>
 <pre><code class="hljs css language-bash">java -classpath <span class="hljs-string">"{YOUR_DRUID_DIR}/lib/*"</span> org.apache.druid.cli.Main tools pull-deps -c org.apache.druid.extensions.contrib:aliyun-oss-extensions:{YOUR_DRUID_VERSION}
 </code></pre>
 <h2><a class="anchor" aria-hidden="true" id="enabling"></a><a href="#enabling" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
@@ -152,8 +152,8 @@ To do this, add following configurations:</p>
 <tr><th>Property</th><th>Description</th><th>Default</th><th>Required</th></tr>
 </thead>
 <tbody>
-<tr><td>accessKey</td><td>The <a href="/docs/latest/operations/password-provider.html">Password Provider</a> or plain text string of this OSS InputSource's access key</td><td>None</td><td>yes</td></tr>
-<tr><td>secretKey</td><td>The <a href="/docs/latest/operations/password-provider.html">Password Provider</a> or plain text string of this OSS InputSource's secret key</td><td>None</td><td>yes</td></tr>
+<tr><td>accessKey</td><td>The <a href="/docs/24.0.0/operations/password-provider.html">Password Provider</a> or plain text string of this OSS InputSource's access key</td><td>None</td><td>yes</td></tr>
+<tr><td>secretKey</td><td>The <a href="/docs/24.0.0/operations/password-provider.html">Password Provider</a> or plain text string of this OSS InputSource's secret key</td><td>None</td><td>yes</td></tr>
 <tr><td>endpoint</td><td>The endpoint of this OSS InputSource</td><td>None</td><td>no</td></tr>
 </tbody>
 </table>
@@ -274,7 +274,7 @@ In this case, the <code>uris</code> property of the OSS's input source can be us
 <h2><a class="anchor" aria-hidden="true" id="troubleshooting"></a><a href="#troubleshooting" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
 <p>When using OSS as deep storage or reading from OSS, the most problems that users will encounter are related to OSS permission.
 Please refer to the official <a href="https://www.alibabacloud.com/help/doc-detail/42777.htm">OSS permission troubleshooting document</a> to find a solution.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/latest/development/extensions-contrib/gce-extensions.html"><span class="arrow-prev">← </span><span>GCE Extensions</span></a><a class="docs-next button" href="/docs/latest/development/extensions-contrib/prometheus.html"><span>Prometheus Emitter</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#installation">Installation</ [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/development/extensions-contrib/gce-extensions.html"><span class="arrow-prev">← </span><span>GCE Extensions</span></a><a class="docs-next button" href="/docs/24.0.0/development/extensions-contrib/prometheus.html"><span>Prometheus Emitter</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#installation">Installation</ [...]
                 document.addEventListener('keyup', function(e) {
                   if (e.target !== document.body) {
                     return;
@@ -291,6 +291,6 @@ Please refer to the official <a href="https://www.alibabacloud.com/help/doc-deta
                 apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
                 indexName: 'apache_druid',
                 inputSelector: '#search_input_react',
-                algoliaOptions: {"facetFilters":["language:en","version:0.23.0"]}
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
               });
             </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/development/extensions-contrib/ambari-metrics-emitter.html b/docs/24.0.0/development/extensions-contrib/ambari-metrics-emitter.html
new file mode 100644
index 00000000..3f543f30
--- /dev/null
+++ b/docs/24.0.0/development/extensions-contrib/ambari-metrics-emitter.html
@@ -0,0 +1,159 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Ambari Metrics Emitter · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/development/extensions-contrib/ambari-metrics-emitter.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="d [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/development/extensions-contrib/ambari-metrics-emitter.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Ambari Metrics Emitter</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>To use this Apache Druid extension, <a href="/docs/24.0.0/development/extensions.html#loading-extensions">include</a> <code>ambari-metrics-emitter</code> in the extensions load list.</p>
+<h2><a class="anchor" aria-hidden="true" id="introduction"></a><a href="#introduction" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
+<p>This extension emits Druid metrics to an ambari-metrics carbon server. Events are sent after been pickled (i.e., batched). The size of the batch is configurable.</p>
+<h2><a class="anchor" aria-hidden="true" id="configuration"></a><a href="#configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>All the configuration parameters for ambari-metrics emitter are under <code>druid.emitter.ambari-metrics</code>.</p>
+<table>
+<thead>
+<tr><th>property</th><th>description</th><th>required?</th><th>default</th></tr>
+</thead>
+<tbody>
+<tr><td><code>druid.emitter.ambari-metrics.hostname</code></td><td>The hostname of the ambari-metrics server.</td><td>yes</td><td>none</td></tr>
+<tr><td><code>druid.emitter.ambari-metrics.port</code></td><td>The port of the ambari-metrics server.</td><td>yes</td><td>none</td></tr>
+<tr><td><code>druid.emitter.ambari-metrics.protocol</code></td><td>The protocol used to send metrics to ambari metrics collector. One of http/https</td><td>no</td><td>http</td></tr>
+<tr><td><code>druid.emitter.ambari-metrics.trustStorePath</code></td><td>Path to trustStore to be used for https</td><td>no</td><td>none</td></tr>
+<tr><td><code>druid.emitter.ambari-metrics.trustStoreType</code></td><td>trustStore type to be used for https</td><td>no</td><td>none</td></tr>
+<tr><td><code>druid.emitter.ambari-metrics.trustStoreType</code></td><td>trustStore password to be used for https</td><td>no</td><td>none</td></tr>
+<tr><td><code>druid.emitter.ambari-metrics.batchSize</code></td><td>Number of events to send as one batch.</td><td>no</td><td>100</td></tr>
+<tr><td><code>druid.emitter.ambari-metrics.eventConverter</code></td><td>Filter and converter of druid events to ambari-metrics timeline event(please see next section).</td><td>yes</td><td>none</td></tr>
+<tr><td><code>druid.emitter.ambari-metrics.flushPeriod</code></td><td>Queue flushing period in milliseconds.</td><td>no</td><td>1 minute</td></tr>
+<tr><td><code>druid.emitter.ambari-metrics.maxQueueSize</code></td><td>Maximum size of the queue used to buffer events.</td><td>no</td><td><code>MAX_INT</code></td></tr>
+<tr><td><code>druid.emitter.ambari-metrics.alertEmitters</code></td><td>List of emitters where alerts will be forwarded to.</td><td>no</td><td>empty list (no forwarding)</td></tr>
+<tr><td><code>druid.emitter.ambari-metrics.emitWaitTime</code></td><td>wait time in milliseconds to try to send the event otherwise emitter will throwing event.</td><td>no</td><td>0</td></tr>
+<tr><td><code>druid.emitter.ambari-metrics.waitForEventTime</code></td><td>waiting time in milliseconds if necessary for an event to become available.</td><td>no</td><td>1000 (1 sec)</td></tr>
+</tbody>
+</table>
+<h3><a class="anchor" aria-hidden="true" id="druid-to-ambari-metrics-timeline-event-converter"></a><a href="#druid-to-ambari-metrics-timeline-event-converter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9z [...]
+<p>Ambari Metrics Timeline Event Converter defines a mapping between druid metrics name plus dimensions to a timeline event metricName.
+ambari-metrics metric path is organized using the following schema:
+<code>&lt;namespacePrefix&gt;.[&lt;druid service name&gt;].[&lt;druid hostname&gt;].&lt;druid metrics dimensions&gt;.&lt;druid metrics name&gt;</code>
+Properly naming the metrics is critical to avoid conflicts, confusing data and potentially wrong interpretation later on.</p>
+<p>Example <code>druid.historical.hist-host1:8080.MyDataSourceName.GroupBy.query/time</code>:</p>
+<ul>
+<li><code>druid</code> -&gt; namespace prefix</li>
+<li><code>historical</code> -&gt; service name</li>
+<li><code>hist-host1:8080</code> -&gt; druid hostname</li>
+<li><code>MyDataSourceName</code> -&gt; dimension value</li>
+<li><code>GroupBy</code> -&gt; dimension value</li>
+<li><code>query/time</code> -&gt; metric name</li>
+</ul>
+<p>We have two different implementation of event converter:</p>
+<h4><a class="anchor" aria-hidden="true" id="send-all-converter"></a><a href="#send-all-converter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
+<p>The first implementation called <code>all</code>, will send all the druid service metrics events.
+The path will be in the form <code>&lt;namespacePrefix&gt;.[&lt;druid service name&gt;].[&lt;druid hostname&gt;].&lt;dimensions values ordered by dimension's name&gt;.&lt;metric&gt;</code>
+User has control of <code>&lt;namespacePrefix&gt;.[&lt;druid service name&gt;].[&lt;druid hostname&gt;].</code></p>
+<pre><code class="hljs css language-json">
+druid.emitter.ambari-metrics.eventConverter={"type":"all", "namespacePrefix": "druid.test", "appName":"druid"}
+
+</code></pre>
+<h4><a class="anchor" aria-hidden="true" id="white-list-based-converter"></a><a href="#white-list-based-converter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H [...]
+<p>The second implementation called <code>whiteList</code>, will send only the white listed metrics and dimensions.
+Same as for the <code>all</code> converter user has control of <code>&lt;namespacePrefix&gt;.[&lt;druid service name&gt;].[&lt;druid hostname&gt;].</code>
+White-list based converter comes with the following  default white list map located under resources in <code>./src/main/resources/defaultWhiteListMap.json</code></p>
+<p>Although user can override the default white list map by supplying a property called <code>mapPath</code>.
+This property is a String containing  the path for the file containing <strong>white list map JSON object</strong>.
+For example the following converter will read the map from the file <code>/pathPrefix/fileName.json</code>.</p>
+<pre><code class="hljs css language-json">
+druid.emitter.ambari-metrics.eventConverter={"type":"whiteList", "namespacePrefix": "druid.test", "ignoreHostname":true, "appName":"druid", "mapPath":"/pathPrefix/fileName.json"}
+
+</code></pre>
+<p><strong>Druid emits a huge number of metrics we highly recommend to use the <code>whiteList</code> converter</strong></p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/development/extensions-core/kubernetes.html"><span class="arrow-prev">← </span><span>Kubernetes</span></a><a class="docs-next button" href="/docs/24.0.0/development/extensions-contrib/cassandra.html"><span>Apache Cassandra</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#introduction">Introduction</a></li><li><a  [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/development/extensions-contrib/cassandra.html b/docs/24.0.0/development/extensions-contrib/cassandra.html
new file mode 100644
index 00000000..3076b561
--- /dev/null
+++ b/docs/24.0.0/development/extensions-contrib/cassandra.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Apache Cassandra · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/development/extensions-contrib/cassandra.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" c [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/development/extensions-contrib/cassandra.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Apache Cassandra</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>To use this Apache Druid extension, <a href="/docs/24.0.0/development/extensions.html#loading-extensions">include</a> <code>druid-cassandra-storage</code> in the extensions load list.</p>
+<p><a href="http://www.datastax.com/what-we-offer/products-services/datastax-enterprise/apache-cassandra">Apache Cassandra</a> can also
+be leveraged for deep storage.  This requires some additional Druid configuration as well as setting up the necessary
+schema within a Cassandra keystore.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/development/extensions-contrib/ambari-metrics-emitter.html"><span class="arrow-prev">← </span><span>Ambari Metrics Emitter</span></a><a class="docs-next button" href="/docs/24.0.0/development/extensions-contrib/cloudfiles.html"><span>Rackspace Cloud Files</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer druid-foot [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/development/extensions-contrib/cloudfiles.html b/docs/24.0.0/development/extensions-contrib/cloudfiles.html
new file mode 100644
index 00000000..5e5296c4
--- /dev/null
+++ b/docs/24.0.0/development/extensions-contrib/cloudfiles.html
@@ -0,0 +1,170 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Rackspace Cloud Files · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/development/extensions-contrib/cloudfiles.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:vers [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/development/extensions-contrib/cloudfiles.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Rackspace Cloud Files</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>To use this Apache Druid extension, <a href="/docs/24.0.0/development/extensions.html#loading-extensions">include</a> <code>druid-cloudfiles-extensions</code> in the extensions load list.</p>
+<h2><a class="anchor" aria-hidden="true" id="deep-storage"></a><a href="#deep-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
+<p><a href="http://www.rackspace.com/cloud/files/">Rackspace Cloud Files</a> is another option for deep storage. This requires some additional Druid configuration.</p>
+<table>
+<thead>
+<tr><th>Property</th><th>Possible Values</th><th>Description</th><th>Default</th></tr>
+</thead>
+<tbody>
+<tr><td><code>druid.storage.type</code></td><td>cloudfiles</td><td></td><td>Must be set.</td></tr>
+<tr><td><code>druid.storage.region</code></td><td></td><td>Rackspace Cloud Files region.</td><td>Must be set.</td></tr>
+<tr><td><code>druid.storage.container</code></td><td></td><td>Rackspace Cloud Files container name.</td><td>Must be set.</td></tr>
+<tr><td><code>druid.storage.basePath</code></td><td></td><td>Rackspace Cloud Files base path to use in the container.</td><td>Must be set.</td></tr>
+<tr><td><code>druid.storage.operationMaxRetries</code></td><td></td><td>Number of tries before cancel a Rackspace operation.</td><td>10</td></tr>
+<tr><td><code>druid.cloudfiles.userName</code></td><td></td><td>Rackspace Cloud username</td><td>Must be set.</td></tr>
+<tr><td><code>druid.cloudfiles.apiKey</code></td><td></td><td>Rackspace Cloud API key.</td><td>Must be set.</td></tr>
+<tr><td><code>druid.cloudfiles.provider</code></td><td>rackspace-cloudfiles-us,rackspace-cloudfiles-uk</td><td>Name of the provider depending on the region.</td><td>Must be set.</td></tr>
+<tr><td><code>druid.cloudfiles.useServiceNet</code></td><td>true,false</td><td>Whether to use the internal service net.</td><td>true</td></tr>
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="firehose"></a><a href="#firehose" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
+<p><a name="firehose"></a></p>
+<h4><a class="anchor" aria-hidden="true" id="staticcloudfilesfirehose"></a><a href="#staticcloudfilesfirehose" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
+<p>This firehose ingests events, similar to the StaticAzureBlobStoreFirehose, but from Rackspace's Cloud Files.</p>
+<p>Data is newline delimited, with one JSON object per line and parsed as per the <code>InputRowParser</code> configuration.</p>
+<p>The storage account is shared with the one used for Rackspace's Cloud Files deep storage functionality, but blobs can be in a different region and container.</p>
+<p>As with the Azure blobstore, it is assumed to be gzipped if the extension ends in .gz</p>
+<p>This firehose is <em>splittable</em> and can be used by <a href="/docs/24.0.0/ingestion/native-batch.html">native parallel index tasks</a>.
+Since each split represents an object in this firehose, each worker task of <code>index_parallel</code> will read an object.</p>
+<p>Sample spec:</p>
+<pre><code class="hljs css language-json">"firehose" : {
+    "type" : "static-cloudfiles",
+    "blobs": [
+        {
+          "region": "DFW"
+          "container": "container",
+          "path": "/path/to/your/file.json"
+        },
+        {
+          "region": "ORD"
+          "container": "anothercontainer",
+          "path": "/another/path.json"
+        }
+    ]
+}
+</code></pre>
+<p>This firehose provides caching and prefetching features. In IndexTask, a firehose can be read twice if intervals or
+shardSpecs are not specified, and, in this case, caching can be useful. Prefetching is preferred when direct scan of objects is slow.</p>
+<table>
+<thead>
+<tr><th>property</th><th>description</th><th>default</th><th>required?</th></tr>
+</thead>
+<tbody>
+<tr><td>type</td><td>This should be <code>static-cloudfiles</code>.</td><td>N/A</td><td>yes</td></tr>
+<tr><td>blobs</td><td>JSON array of Cloud Files blobs.</td><td>N/A</td><td>yes</td></tr>
+<tr><td>maxCacheCapacityBytes</td><td>Maximum size of the cache space in bytes. 0 means disabling cache.</td><td>1073741824</td><td>no</td></tr>
+<tr><td>maxCacheCapacityBytes</td><td>Maximum size of the cache space in bytes. 0 means disabling cache. Cached files are not removed until the ingestion task completes.</td><td>1073741824</td><td>no</td></tr>
+<tr><td>maxFetchCapacityBytes</td><td>Maximum size of the fetch space in bytes. 0 means disabling prefetch. Prefetched files are removed immediately once they are read.</td><td>1073741824</td><td>no</td></tr>
+<tr><td>fetchTimeout</td><td>Timeout for fetching a Cloud Files object.</td><td>60000</td><td>no</td></tr>
+<tr><td>maxFetchRetry</td><td>Maximum retry for fetching a Cloud Files object.</td><td>3</td><td>no</td></tr>
+</tbody>
+</table>
+<p>Cloud Files Blobs:</p>
+<table>
+<thead>
+<tr><th>property</th><th>description</th><th>default</th><th>required?</th></tr>
+</thead>
+<tbody>
+<tr><td>container</td><td>Name of the Cloud Files container</td><td>N/A</td><td>yes</td></tr>
+<tr><td>path</td><td>The path where data is located.</td><td>N/A</td><td>yes</td></tr>
+</tbody>
+</table>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/development/extensions-contrib/cassandra.html"><span class="arrow-prev">← </span><span>Apache Cassandra</span></a><a class="docs-next button" href="/docs/24.0.0/development/extensions-contrib/distinctcount.html"><span class="function-name-prevnext">DistinctCount Aggregator</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li>< [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/development/extensions-contrib/distinctcount.html b/docs/24.0.0/development/extensions-contrib/distinctcount.html
new file mode 100644
index 00000000..835d0c3f
--- /dev/null
+++ b/docs/24.0.0/development/extensions-contrib/distinctcount.html
@@ -0,0 +1,162 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>DistinctCount Aggregator · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/development/extensions-contrib/distinctcount.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearc [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/development/extensions-contrib/distinctcount.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">DistinctCount Aggregator</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>To use this Apache Druid extension, <a href="/docs/24.0.0/development/extensions.html#loading-extensions">include</a> the <code>druid-distinctcount</code> in the extensions load list.</p>
+<p>Additionally, follow these steps:</p>
+<ol>
+<li>First, use a single dimension hash-based partition spec to partition data by a single dimension. For example visitor_id. This to make sure all rows with a particular value for that dimension will go into the same segment, or this might over count.</li>
+<li>Second, use distinctCount to calculate the distinct count, make sure queryGranularity is divided exactly by segmentGranularity or else the result will be wrong.</li>
+</ol>
+<p>There are some limitations, when used with groupBy, the groupBy keys' numbers should not exceed maxIntermediateRows in every segment. If exceeded the result will be wrong. When used with topN, numValuesPerPass should not be too big. If too big the distinctCount will use a lot of memory and might cause the JVM to go our of memory.</p>
+<p>Example:</p>
+<h2><a class="anchor" aria-hidden="true" id="timeseries-query"></a><a href="#timeseries-query" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<pre><code class="hljs css language-json">{
+  <span class="hljs-attr">"queryType"</span>: <span class="hljs-string">"timeseries"</span>,
+  <span class="hljs-attr">"dataSource"</span>: <span class="hljs-string">"sample_datasource"</span>,
+  <span class="hljs-attr">"granularity"</span>: <span class="hljs-string">"day"</span>,
+  <span class="hljs-attr">"aggregations"</span>: [
+    {
+      <span class="hljs-attr">"type"</span>: <span class="hljs-string">"distinctCount"</span>,
+      <span class="hljs-attr">"name"</span>: <span class="hljs-string">"uv"</span>,
+      <span class="hljs-attr">"fieldName"</span>: <span class="hljs-string">"visitor_id"</span>
+    }
+  ],
+  <span class="hljs-attr">"intervals"</span>: [
+    <span class="hljs-string">"2016-03-01T00:00:00.000/2013-03-20T00:00:00.000"</span>
+  ]
+}
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="topn-query"></a><a href="#topn-query" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<pre><code class="hljs css language-json">{
+  <span class="hljs-attr">"queryType"</span>: <span class="hljs-string">"topN"</span>,
+  <span class="hljs-attr">"dataSource"</span>: <span class="hljs-string">"sample_datasource"</span>,
+  <span class="hljs-attr">"dimension"</span>: <span class="hljs-string">"sample_dim"</span>,
+  <span class="hljs-attr">"threshold"</span>: <span class="hljs-number">5</span>,
+  <span class="hljs-attr">"metric"</span>: <span class="hljs-string">"uv"</span>,
+  <span class="hljs-attr">"granularity"</span>: <span class="hljs-string">"all"</span>,
+  <span class="hljs-attr">"aggregations"</span>: [
+    {
+      <span class="hljs-attr">"type"</span>: <span class="hljs-string">"distinctCount"</span>,
+      <span class="hljs-attr">"name"</span>: <span class="hljs-string">"uv"</span>,
+      <span class="hljs-attr">"fieldName"</span>: <span class="hljs-string">"visitor_id"</span>
+    }
+  ],
+  <span class="hljs-attr">"intervals"</span>: [
+    <span class="hljs-string">"2016-03-06T00:00:00/2016-03-06T23:59:59"</span>
+  ]
+}
+</code></pre>
+<h2><a class="anchor" aria-hidden="true" id="groupby-query"></a><a href="#groupby-query" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<pre><code class="hljs css language-json">{
+  <span class="hljs-attr">"queryType"</span>: <span class="hljs-string">"groupBy"</span>,
+  <span class="hljs-attr">"dataSource"</span>: <span class="hljs-string">"sample_datasource"</span>,
+  <span class="hljs-attr">"dimensions"</span>: [<span class="hljs-string">"sample_dim"</span>],
+  <span class="hljs-attr">"granularity"</span>: <span class="hljs-string">"all"</span>,
+  <span class="hljs-attr">"aggregations"</span>: [
+    {
+      <span class="hljs-attr">"type"</span>: <span class="hljs-string">"distinctCount"</span>,
+      <span class="hljs-attr">"name"</span>: <span class="hljs-string">"uv"</span>,
+      <span class="hljs-attr">"fieldName"</span>: <span class="hljs-string">"visitor_id"</span>
+    }
+  ],
+  <span class="hljs-attr">"intervals"</span>: [
+    <span class="hljs-string">"2016-03-06T00:00:00/2016-03-06T23:59:59"</span>
+  ]
+}
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/development/extensions-contrib/cloudfiles.html"><span class="arrow-prev">← </span><span>Rackspace Cloud Files</span></a><a class="docs-next button" href="/docs/24.0.0/development/extensions-contrib/graphite.html"><span>Graphite Emitter</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#timeseries-query">Timeseries  [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/development/extensions-contrib/gce-extensions.html b/docs/24.0.0/development/extensions-contrib/gce-extensions.html
new file mode 100644
index 00000000..c723da42
--- /dev/null
+++ b/docs/24.0.0/development/extensions-contrib/gce-extensions.html
@@ -0,0 +1,168 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>GCE Extensions · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/development/extensions-contrib/gce-extensions.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/development/extensions-contrib/gce-extensions.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">GCE Extensions</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>To use this Apache Druid extension, <a href="/docs/24.0.0/development/extensions.html#loading-extensions">include</a> <code>gce-extensions</code> in the extensions load list.</p>
+<p>At the moment, this extension enables only Druid to autoscale instances in GCE.</p>
+<p>The extension manages the instances to be scaled up and down through the use of the <a href="https://cloud.google.com/compute/docs/instance-groups/creating-groups-of-managed-instances#resize_managed_group">Managed Instance Groups</a>
+of GCE (MIG from now on). This choice has been made to ease the configuration of the machines and simplify their
+management.</p>
+<p>For this reason, in order to use this extension, the user must have created</p>
+<ol>
+<li>An instance template with the right machine type and image to bu used to run the MiddleManager</li>
+<li>A MIG that has been configured to use the instance template created in the point above</li>
+</ol>
+<p>Moreover, in order to be able to rescale the machines in the MIG, the Overlord must run with a service account
+guaranteeing the following two scopes from the <a href="https://developers.google.com/identity/protocols/googlescopes#computev1">Compute Engine API</a></p>
+<ul>
+<li><code>https://www.googleapis.com/auth/cloud-platform</code></li>
+<li><code>https://www.googleapis.com/auth/compute</code></li>
+</ul>
+<h2><a class="anchor" aria-hidden="true" id="overlord-dynamic-configuration"></a><a href="#overlord-dynamic-configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 1 [...]
+<p>The Overlord can dynamically change worker behavior.</p>
+<p>The JSON object can be submitted to the Overlord via a POST request at:</p>
+<pre><code class="hljs">http:<span class="hljs-regexp">//</span>&lt;OVERLORD_IP&gt;:&lt;port&gt;<span class="hljs-regexp">/druid/i</span>ndexer<span class="hljs-regexp">/v1/</span>worker
+</code></pre>
+<p>Optional Header Parameters for auditing the config change can also be specified.</p>
+<table>
+<thead>
+<tr><th>Header Param Name</th><th>Description</th><th>Default</th></tr>
+</thead>
+<tbody>
+<tr><td><code>X-Druid-Author</code></td><td>author making the config change</td><td>&quot;&quot;</td></tr>
+<tr><td><code>X-Druid-Comment</code></td><td>comment describing the change being done</td><td>&quot;&quot;</td></tr>
+</tbody>
+</table>
+<p>A sample worker config spec is shown below:</p>
+<pre><code class="hljs css language-json">{
+  <span class="hljs-attr">"autoScaler"</span>: {
+    <span class="hljs-attr">"envConfig"</span> : {
+      <span class="hljs-attr">"numInstances"</span> : <span class="hljs-number">1</span>,
+      <span class="hljs-attr">"projectId"</span> : <span class="hljs-string">"super-project"</span>,
+      <span class="hljs-attr">"zoneName"</span> : <span class="hljs-string">"us-central-1"</span>,
+      <span class="hljs-attr">"managedInstanceGroupName"</span> : <span class="hljs-string">"druid-middlemanagers"</span>
+    },
+    <span class="hljs-attr">"maxNumWorkers"</span> : <span class="hljs-number">4</span>,
+    <span class="hljs-attr">"minNumWorkers"</span> : <span class="hljs-number">2</span>,
+    <span class="hljs-attr">"type"</span> : <span class="hljs-string">"gce"</span>
+  }
+}
+</code></pre>
+<p>The configuration of the autoscaler is quite simple and it is made of two levels only.</p>
+<p>The external level specifies the <code>type</code>—always <code>gce</code> in this case— and two numeric values,
+the <code>maxNumWorkers</code> and <code>minNumWorkers</code> used to define the boundaries in between which the
+number of instances must be at any time.</p>
+<p>The internal level is the <code>envConfig</code> and it is used to specify</p>
+<ul>
+<li>The <code>numInstances</code> used to specify how many workers will be spawned at each
+request to provision more workers.  This is safe to be left to <code>1</code></li>
+<li>The <code>projectId</code> used to specify the name of the project in which the MIG resides</li>
+<li>The <code>zoneName</code> used to identify in which zone of the worlds the MIG is</li>
+<li>The <code>managedInstanceGroupName</code> used to specify the MIG containing the instances created or
+removed</li>
+</ul>
+<p>Please refer to the Overlord Dynamic Configuration section in the main <a href="/docs/24.0.0/configuration/index.html">documentation</a>
+for parameters other than the ones specified here, such as <code>selectStrategy</code> etc.</p>
+<h2><a class="anchor" aria-hidden="true" id="known-limitations"></a><a href="#known-limitations" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
+<ul>
+<li>The module internally uses the <a href="https://cloud.google.com/compute/docs/reference/rest/v1/instanceGroupManagers/listManagedInstances">ListManagedInstances</a>
+call from the API and, while the documentation of the API states that the call can be paged through using the
+<code>pageToken</code> argument, the responses to such call do not provide any <code>nextPageToken</code> to set such parameter. This means
+that the extension can operate safely with a maximum of 500 MiddleManagers instances at any time (the maximum number
+of instances to be returned for each call).</li>
+</ul>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/development/extensions-contrib/time-min-max.html"><span class="arrow-prev">← </span><span>Timestamp Min/Max aggregators</span></a><a class="docs-next button" href="/docs/24.0.0/development/extensions-contrib/aliyun-oss.html"><span>Aliyun OSS</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#overlord-dynamic-config [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/development/extensions-contrib/google.html b/docs/24.0.0/development/extensions-contrib/google.html
new file mode 100644
index 00000000..cca1c233
--- /dev/null
+++ b/docs/24.0.0/development/extensions-contrib/google.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../extensions-core/google.html">
+<meta http-equiv="refresh" content="0; url=../extensions-core/google.html">
+<h1>Redirecting...</h1>
+<a href="../extensions-core/google.html">Click here if you are not redirected.</a>
+<script>location="../extensions-core/google.html"</script>
diff --git a/docs/24.0.0/development/extensions-contrib/graphite.html b/docs/24.0.0/development/extensions-contrib/graphite.html
new file mode 100644
index 00000000..a4c50396
--- /dev/null
+++ b/docs/24.0.0/development/extensions-contrib/graphite.html
@@ -0,0 +1,170 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Graphite Emitter · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/development/extensions-contrib/graphite.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version" co [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/development/extensions-contrib/graphite.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Graphite Emitter</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>To use this Apache Druid extension, <a href="/docs/24.0.0/development/extensions.html#loading-extensions">include</a> <code>graphite-emitter</code> in the extensions load list.</p>
+<h2><a class="anchor" aria-hidden="true" id="introduction"></a><a href="#introduction" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
+<p>This extension emits druid metrics to a graphite carbon server.
+Metrics can be sent by using <a href="http://graphite.readthedocs.io/en/latest/feeding-carbon.html#the-plaintext-protocol">plaintext</a> or <a href="http://graphite.readthedocs.io/en/latest/feeding-carbon.html#the-pickle-protocol">pickle</a> protocol.
+The pickle protocol is more efficient and supports sending batches of metrics (plaintext protocol send only one metric) in one request; batch size is configurable.</p>
+<h2><a class="anchor" aria-hidden="true" id="configuration"></a><a href="#configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>All the configuration parameters for graphite emitter are under <code>druid.emitter.graphite</code>.</p>
+<table>
+<thead>
+<tr><th>property</th><th>description</th><th>required?</th><th>default</th></tr>
+</thead>
+<tbody>
+<tr><td><code>druid.emitter.graphite.hostname</code></td><td>The hostname of the graphite server.</td><td>yes</td><td>none</td></tr>
+<tr><td><code>druid.emitter.graphite.port</code></td><td>The port of the graphite server.</td><td>yes</td><td>none</td></tr>
+<tr><td><code>druid.emitter.graphite.batchSize</code></td><td>Number of events to send as one batch (only for pickle protocol)</td><td>no</td><td>100</td></tr>
+<tr><td><code>druid.emitter.graphite.protocol</code></td><td>Graphite protocol; available protocols: pickle, plaintext.</td><td>no</td><td>pickle</td></tr>
+<tr><td><code>druid.emitter.graphite.eventConverter</code></td><td>Filter and converter of druid events to graphite event (please see next section).</td><td>yes</td><td>none</td></tr>
+<tr><td><code>druid.emitter.graphite.flushPeriod</code></td><td>Queue flushing period in milliseconds.</td><td>no</td><td>1 minute</td></tr>
+<tr><td><code>druid.emitter.graphite.maxQueueSize</code></td><td>Maximum size of the queue used to buffer events.</td><td>no</td><td><code>MAX_INT</code></td></tr>
+<tr><td><code>druid.emitter.graphite.alertEmitters</code></td><td>List of emitters where alerts will be forwarded to. This is a JSON list of emitter names, e.g. <code>[&quot;logging&quot;, &quot;http&quot;]</code></td><td>no</td><td>empty list (no forwarding)</td></tr>
+<tr><td><code>druid.emitter.graphite.requestLogEmitters</code></td><td>List of emitters where request logs (i.e., query logging events sent to emitters when <code>druid.request.logging.type</code> is set to <code>emitter</code>) will be forwarded to. This is a JSON list of emitter names, e.g. <code>[&quot;logging&quot;, &quot;http&quot;]</code></td><td>no</td><td>empty list (no forwarding)</td></tr>
+<tr><td><code>druid.emitter.graphite.emitWaitTime</code></td><td>wait time in milliseconds to try to send the event otherwise emitter will throwing event.</td><td>no</td><td>0</td></tr>
+<tr><td><code>druid.emitter.graphite.waitForEventTime</code></td><td>waiting time in milliseconds if necessary for an event to become available.</td><td>no</td><td>1000 (1 sec)</td></tr>
+</tbody>
+</table>
+<h3><a class="anchor" aria-hidden="true" id="supported-event-types"></a><a href="#supported-event-types" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
+<p>The graphite emitter only emits service metric events to graphite (See <a href="/docs/24.0.0/operations/metrics.html">Druid Metrics</a> for a list of metrics).</p>
+<p>Alerts and request logs are not sent to graphite. These event types are not well represented in Graphite, which is more suited for timeseries views on numeric metrics, vs. storing non-numeric log events.</p>
+<p>Instead, alerts and request logs are optionally forwarded to other emitter implementations, specified by <code>druid.emitter.graphite.alertEmitters</code> and <code>druid.emitter.graphite.requestLogEmitters</code> respectively.</p>
+<h3><a class="anchor" aria-hidden="true" id="druid-to-graphite-event-converter"></a><a href="#druid-to-graphite-event-converter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S1 [...]
+<p>Graphite Event Converter defines a mapping between druid metrics name plus dimensions to a Graphite metric path.
+Graphite metric path is organized using the following schema:
+<code>&lt;namespacePrefix&gt;.[&lt;druid service name&gt;].[&lt;druid hostname&gt;].&lt;druid metrics dimensions&gt;.&lt;druid metrics name&gt;</code>
+Properly naming the metrics is critical to avoid conflicts, confusing data and potentially wrong interpretation later on.</p>
+<p>Example <code>druid.historical.hist-host1_yahoo_com:8080.MyDataSourceName.GroupBy.query/time</code>:</p>
+<ul>
+<li><code>druid</code> -&gt; namespace prefix</li>
+<li><code>historical</code> -&gt; service name</li>
+<li><code>hist-host1.yahoo.com:8080</code> -&gt; druid hostname</li>
+<li><code>MyDataSourceName</code> -&gt; dimension value</li>
+<li><code>GroupBy</code> -&gt; dimension value</li>
+<li><code>query/time</code> -&gt; metric name</li>
+</ul>
+<p>We have two different implementation of event converter:</p>
+<h4><a class="anchor" aria-hidden="true" id="send-all-converter"></a><a href="#send-all-converter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
+<p>The first implementation called <code>all</code>, will send all the druid service metrics events.
+The path will be in the form <code>&lt;namespacePrefix&gt;.[&lt;druid service name&gt;].[&lt;druid hostname&gt;].&lt;dimensions values ordered by dimension's name&gt;.&lt;metric&gt;</code>
+User has control of <code>&lt;namespacePrefix&gt;.[&lt;druid service name&gt;].[&lt;druid hostname&gt;].</code></p>
+<p>You can omit the hostname by setting <code>ignoreHostname=true</code>
+<code>druid.SERVICE_NAME.dataSourceName.queryType.query/time</code></p>
+<p>You can omit the service name by setting <code>ignoreServiceName=true</code>
+<code>druid.HOSTNAME.dataSourceName.queryType.query/time</code></p>
+<p>Elements in metric name by default are separated by &quot;/&quot;, so graphite will create all metrics on one level. If you want to have metrics in the tree structure, you have to set <code>replaceSlashWithDot=true</code>
+Original: <code>druid.HOSTNAME.dataSourceName.queryType.query/time</code>
+Changed: <code>druid.HOSTNAME.dataSourceName.queryType.query.time</code></p>
+<pre><code class="hljs css language-json">
+druid.emitter.graphite.eventConverter={"type":"all", "namespacePrefix": "druid.test", "ignoreHostname":true, "ignoreServiceName":true}
+
+</code></pre>
+<h4><a class="anchor" aria-hidden="true" id="white-list-based-converter"></a><a href="#white-list-based-converter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H [...]
+<p>The second implementation called <code>whiteList</code>, will send only the white listed metrics and dimensions.
+Same as for the <code>all</code> converter user has control of <code>&lt;namespacePrefix&gt;.[&lt;druid service name&gt;].[&lt;druid hostname&gt;].</code>
+White-list based converter comes with the following  default white list map located under resources in <code>./src/main/resources/defaultWhiteListMap.json</code></p>
+<p>Although user can override the default white list map by supplying a property called <code>mapPath</code>.
+This property is a String containing the path for the file containing <strong>white list map JSON object</strong>.
+For example the following converter will read the map from the file <code>/pathPrefix/fileName.json</code>.</p>
+<pre><code class="hljs css language-json">
+druid.emitter.graphite.eventConverter={"type":"whiteList", "namespacePrefix": "druid.test", "ignoreHostname":true, "ignoreServiceName":true, "mapPath":"/pathPrefix/fileName.json"}
+
+</code></pre>
+<p><strong>Druid emits a huge number of metrics we highly recommend to use the <code>whiteList</code> converter</strong></p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/development/extensions-contrib/distinctcount.html"><span class="arrow-prev">← </span><span class="function-name-prevnext">DistinctCount Aggregator</span></a><a class="docs-next button" href="/docs/24.0.0/development/extensions-contrib/influx.html"><span class="function-name-prevnext">InfluxDB Line Protocol Parser</span><span class="arrow-next"> →</span></a></div></div></div><nav class=" [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/development/extensions-contrib/influx.html b/docs/24.0.0/development/extensions-contrib/influx.html
new file mode 100644
index 00000000..12406587
--- /dev/null
+++ b/docs/24.0.0/development/extensions-contrib/influx.html
@@ -0,0 +1,132 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>InfluxDB Line Protocol Parser · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/development/extensions-contrib/influx.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch: [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/development/extensions-contrib/influx.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">InfluxDB Line Protocol Parser</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>To use this Apache Druid extension, <a href="/docs/24.0.0/development/extensions.html#loading-extensions">include</a> <code>druid-influx-extensions</code> in the extensions load list.</p>
+<p>This extension enables Druid to parse the <a href="https://docs.influxdata.com/influxdb/v1.5/write_protocols/line_protocol_tutorial/">InfluxDB Line Protocol</a>, a popular text-based timeseries metric serialization format.</p>
+<h2><a class="anchor" aria-hidden="true" id="line-protocol"></a><a href="#line-protocol" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>A typical line looks like this:</p>
+<p><code>cpu,application=dbhost=prdb123,region=us-east-1 usage_idle=99.24,usage_user=0.55 1520722030000000000</code></p>
+<p>which contains four parts:</p>
+<ul>
+<li>measurement: A string indicating the name of the measurement represented (e.g. cpu, network, web_requests)</li>
+<li>tags: zero or more key-value pairs (i.e. dimensions)</li>
+<li>measurements: one or more key-value pairs; values can be numeric, boolean, or string</li>
+<li>timestamp: nanoseconds since Unix epoch (the parser truncates it to milliseconds)</li>
+</ul>
+<p>The parser extracts these fields into a map, giving the measurement the key <code>measurement</code> and the timestamp the key <code>_ts</code>. The tag and measurement keys are copied verbatim, so users should take care to avoid name collisions. It is up to the ingestion spec to decide which fields should be treated as dimensions and which should be treated as metrics (typically tags correspond to dimensions and measurements correspond to metrics).</p>
+<p>The parser is configured like so:</p>
+<pre><code class="hljs css language-json">"parser": {
+      "type": "string",
+      "parseSpec": {
+        "format": "influx",
+        "timestampSpec": {
+          "column": "__ts",
+          "format": "millis"
+        },
+        "dimensionsSpec": {
+          "dimensionExclusions": [
+            "__ts"
+          ]
+        },
+        "whitelistMeasurements": [
+          "cpu"
+        ]
+      }
+</code></pre>
+<p>The <code>whitelistMeasurements</code> field is an optional list of strings. If present, measurements that do not match one of the strings in the list will be ignored.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/development/extensions-contrib/graphite.html"><span class="arrow-prev">← </span><span>Graphite Emitter</span></a><a class="docs-next button" href="/docs/24.0.0/development/extensions-contrib/influxdb-emitter.html"><span class="function-name-prevnext">InfluxDB Emitter</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/development/extensions-contrib/influxdb-emitter.html b/docs/24.0.0/development/extensions-contrib/influxdb-emitter.html
new file mode 100644
index 00000000..0e4eff93
--- /dev/null
+++ b/docs/24.0.0/development/extensions-contrib/influxdb-emitter.html
@@ -0,0 +1,143 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>InfluxDB Emitter · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/development/extensions-contrib/influxdb-emitter.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:ver [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/development/extensions-contrib/influxdb-emitter.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">InfluxDB Emitter</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>To use this Apache Druid extension, <a href="/docs/24.0.0/development/extensions.html#loading-extensions">include</a> <code>druid-influxdb-emitter</code> in the extensions load list.</p>
+<h2><a class="anchor" aria-hidden="true" id="introduction"></a><a href="#introduction" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
+<p>This extension emits druid metrics to <a href="https://www.influxdata.com/time-series-platform/influxdb/">InfluxDB</a> over HTTP. Currently this emitter only emits service metric events to InfluxDB (See <a href="/docs/24.0.0/operations/metrics.html">Druid metrics</a> for a list of metrics).
+When a metric event is fired it is added to a queue of events. After a configurable amount of time, the events on the queue are transformed to InfluxDB's line protocol
+and POSTed to the InfluxDB HTTP API. The entire queue is flushed at this point. The queue is also flushed as the emitter is shutdown.</p>
+<p>Note that authentication and authorization must be <a href="https://docs.influxdata.com/influxdb/v1.7/administration/authentication_and_authorization/">enabled</a> on the InfluxDB server.</p>
+<h2><a class="anchor" aria-hidden="true" id="configuration"></a><a href="#configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>All the configuration parameters for the influxdb emitter are under <code>druid.emitter.influxdb</code>.</p>
+<table>
+<thead>
+<tr><th>Property</th><th>Description</th><th>Required?</th><th>Default</th></tr>
+</thead>
+<tbody>
+<tr><td><code>druid.emitter.influxdb.hostname</code></td><td>The hostname of the InfluxDB server.</td><td>Yes</td><td>N/A</td></tr>
+<tr><td><code>druid.emitter.influxdb.port</code></td><td>The port of the InfluxDB server.</td><td>No</td><td>8086</td></tr>
+<tr><td><code>druid.emitter.influxdb.protocol</code></td><td>The protocol used to send metrics to InfluxDB. One of http/https</td><td>No</td><td>http</td></tr>
+<tr><td><code>druid.emitter.influxdb.trustStorePath</code></td><td>The path to the trustStore to be used for https</td><td>No</td><td>none</td></tr>
+<tr><td><code>druid.emitter.influxdb.trustStoreType</code></td><td>The trustStore type to be used for https</td><td>No</td><td><code>jks</code></td></tr>
+<tr><td><code>druid.emitter.influxdb.trustStorePassword</code></td><td>The trustStore password to be used for https</td><td>No</td><td>none</td></tr>
+<tr><td><code>druid.emitter.influxdb.databaseName</code></td><td>The name of the database in InfluxDB.</td><td>Yes</td><td>N/A</td></tr>
+<tr><td><code>druid.emitter.influxdb.maxQueueSize</code></td><td>The size of the queue that holds events.</td><td>No</td><td>Integer.MAX_VALUE(=2^31-1)</td></tr>
+<tr><td><code>druid.emitter.influxdb.flushPeriod</code></td><td>How often (in milliseconds) the events queue is parsed into Line Protocol and POSTed to InfluxDB.</td><td>No</td><td>60000</td></tr>
+<tr><td><code>druid.emitter.influxdb.flushDelay</code></td><td>How long (in milliseconds) the scheduled method will wait until it first runs.</td><td>No</td><td>60000</td></tr>
+<tr><td><code>druid.emitter.influxdb.influxdbUserName</code></td><td>The username for authenticating with the InfluxDB database.</td><td>Yes</td><td>N/A</td></tr>
+<tr><td><code>druid.emitter.influxdb.influxdbPassword</code></td><td>The password of the database authorized user</td><td>Yes</td><td>N/A</td></tr>
+<tr><td><code>druid.emitter.influxdb.dimensionWhitelist</code></td><td>A whitelist of metric dimensions to include as tags</td><td>No</td><td><code>[&quot;dataSource&quot;,&quot;type&quot;,&quot;numMetrics&quot;,&quot;numDimensions&quot;,&quot;threshold&quot;,&quot;dimension&quot;,&quot;taskType&quot;,&quot;taskStatus&quot;,&quot;tier&quot;]</code></td></tr>
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="influxdb-line-protocol"></a><a href="#influxdb-line-protocol" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0 [...]
+<p>An example of how this emitter parses a Druid metric event into InfluxDB's <a href="https://docs.influxdata.com/influxdb/v1.7/write_protocols/line_protocol_reference/">line protocol</a> is given here:</p>
+<p>The syntax of the line protocol is :</p>
+<p><code>&lt;measurement&gt;[,&lt;tag_key&gt;=&lt;tag_value&gt;[,&lt;tag_key&gt;=&lt;tag_value&gt;]] &lt;field_key&gt;=&lt;field_value&gt;[,&lt;field_key&gt;=&lt;field_value&gt;] [&lt;timestamp&gt;]</code></p>
+<p>where timestamp is in nanoseconds since epoch.</p>
+<p>A typical service metric event as recorded by Druid's logging emitter is: <code>Event [{&quot;feed&quot;:&quot;metrics&quot;,&quot;timestamp&quot;:&quot;2017-10-31T09:09:06.857Z&quot;,&quot;service&quot;:&quot;druid/historical&quot;,&quot;host&quot;:&quot;historical001:8083&quot;,&quot;version&quot;:&quot;0.11.0-SNAPSHOT&quot;,&quot;metric&quot;:&quot;query/cache/total/hits&quot;,&quot;value&quot;:34787256}]</code>.</p>
+<p>This event is parsed into line protocol according to these rules:</p>
+<ul>
+<li>The measurement becomes druid_query since query is the first part of the metric.</li>
+<li>The tags are service=druid/historical, hostname=historical001, metric=druid_cache_total. (The metric tag is the middle part of the druid metric separated with _ and preceded by druid_. Another example would be if an event has metric=query/time then there is no middle part and hence no metric tag)</li>
+<li>The field is druid_hits since this is the last part of the metric.</li>
+</ul>
+<p>This gives the following String which can be POSTed to InfluxDB: <code>&quot;druid_query,service=druid/historical,hostname=historical001,metric=druid_cache_total druid_hits=34787256 1509440946857000000&quot;</code></p>
+<p>The InfluxDB emitter has a white list of dimensions
+which will be added as a tag to the line protocol string if the metric has a dimension from the white list.
+The value of the dimension is sanitized such that every occurrence of a dot or whitespace is replaced with a <code>_</code> .</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/development/extensions-contrib/influx.html"><span class="arrow-prev">← </span><span class="function-name-prevnext">InfluxDB Line Protocol Parser</span></a><a class="docs-next button" href="/docs/24.0.0/development/extensions-contrib/kafka-emitter.html"><span>Kafka Emitter</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/development/extensions-contrib/kafka-emitter.html b/docs/24.0.0/development/extensions-contrib/kafka-emitter.html
new file mode 100644
index 00000000..2f618c74
--- /dev/null
+++ b/docs/24.0.0/development/extensions-contrib/kafka-emitter.html
@@ -0,0 +1,126 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Kafka Emitter · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/development/extensions-contrib/kafka-emitter.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:version"  [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/development/extensions-contrib/kafka-emitter.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Kafka Emitter</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>To use this Apache Druid extension, <a href="/docs/24.0.0/development/extensions.html#loading-extensions">include</a> <code>kafka-emitter</code> in the extensions load list.</p>
+<h2><a class="anchor" aria-hidden="true" id="introduction"></a><a href="#introduction" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
+<p>This extension emits Druid metrics to <a href="https://kafka.apache.org">Apache Kafka</a> directly with JSON format.<br>
+Currently, Kafka has not only their nice ecosystem but also consumer API readily available.
+So, If you currently use Kafka, It's easy to integrate various tool or UI
+to monitor the status of your Druid cluster with this extension.</p>
+<h2><a class="anchor" aria-hidden="true" id="configuration"></a><a href="#configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
+<p>All the configuration parameters for the Kafka emitter are under <code>druid.emitter.kafka</code>.</p>
+<table>
+<thead>
+<tr><th>property</th><th>description</th><th>required?</th><th>default</th></tr>
+</thead>
+<tbody>
+<tr><td><code>druid.emitter.kafka.bootstrap.servers</code></td><td>Comma-separated Kafka broker. (<code>[hostname:port],[hostname:port]...</code>)</td><td>yes</td><td>none</td></tr>
+<tr><td><code>druid.emitter.kafka.metric.topic</code></td><td>Kafka topic name for emitter's target to emit service metric.</td><td>yes</td><td>none</td></tr>
+<tr><td><code>druid.emitter.kafka.alert.topic</code></td><td>Kafka topic name for emitter's target to emit alert.</td><td>yes</td><td>none</td></tr>
+<tr><td><code>druid.emitter.kafka.request.topic</code></td><td>Kafka topic name for emitter's target to emit request logs. If left empty then request logs will not be sent to the Kafka topic.</td><td>no</td><td>none</td></tr>
+<tr><td><code>druid.emitter.kafka.producer.config</code></td><td>JSON formatted configuration which user want to set additional properties to Kafka producer.</td><td>no</td><td>none</td></tr>
+<tr><td><code>druid.emitter.kafka.clusterName</code></td><td>Optional value to specify name of your druid cluster. It can help make groups in your monitoring environment.</td><td>no</td><td>none</td></tr>
+</tbody>
+</table>
+<h3><a class="anchor" aria-hidden="true" id="example"></a><a href="#example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
+<pre><code class="hljs">druid<span class="hljs-selector-class">.emitter</span><span class="hljs-selector-class">.kafka</span><span class="hljs-selector-class">.bootstrap</span>.servers=hostname1:<span class="hljs-number">9092</span>,hostname2:<span class="hljs-number">9092</span>
+druid<span class="hljs-selector-class">.emitter</span><span class="hljs-selector-class">.kafka</span><span class="hljs-selector-class">.metric</span>.topic=druid-metric
+druid<span class="hljs-selector-class">.emitter</span><span class="hljs-selector-class">.kafka</span><span class="hljs-selector-class">.alert</span>.topic=druid-alert
+druid<span class="hljs-selector-class">.emitter</span><span class="hljs-selector-class">.kafka</span><span class="hljs-selector-class">.producer</span>.config={<span class="hljs-string">"max.block.ms"</span>:<span class="hljs-number">10000</span>}
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/development/extensions-contrib/influxdb-emitter.html"><span class="arrow-prev">← </span><span class="function-name-prevnext">InfluxDB Emitter</span></a><a class="docs-next button" href="/docs/24.0.0/development/extensions-contrib/materialized-view.html"><span>Materialized View</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings">< [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/development/extensions-contrib/kafka-simple.html b/docs/24.0.0/development/extensions-contrib/kafka-simple.html
new file mode 100644
index 00000000..4d4bfd20
--- /dev/null
+++ b/docs/24.0.0/development/extensions-contrib/kafka-simple.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Redirecting...</title>
+<link rel="canonical" href="../../ingestion/standalone-realtime.html">
+<meta http-equiv="refresh" content="0; url=../../ingestion/standalone-realtime.html">
+<h1>Redirecting...</h1>
+<a href="../../ingestion/standalone-realtime.html">Click here if you are not redirected.</a>
+<script>location="../../ingestion/standalone-realtime.html"</script>
diff --git a/docs/24.0.0/development/extensions-contrib/materialized-view.html b/docs/24.0.0/development/extensions-contrib/materialized-view.html
new file mode 100644
index 00000000..33be4d1d
--- /dev/null
+++ b/docs/24.0.0/development/extensions-contrib/materialized-view.html
@@ -0,0 +1,208 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Materialized View · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/development/extensions-contrib/materialized-view.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta name="docsearch:v [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/development/extensions-contrib/materialized-view.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Materialized View</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>To use this Apache Druid feature, make sure to load <code>materialized-view-selection</code> and <code>materialized-view-maintenance</code>. In addition, this feature currently requires a Hadoop cluster.</p>
+<p>This feature enables Druid to greatly improve the query performance, especially when the query dataSource has a very large number of dimensions but the query only required several dimensions. This feature includes two parts. One is <code>materialized-view-maintenance</code>, and the other is <code>materialized-view-selection</code>.</p>
+<h2><a class="anchor" aria-hidden="true" id="materialized-view-maintenance"></a><a href="#materialized-view-maintenance" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12  [...]
+<p>In materialized-view-maintenance, dataSources user ingested are called &quot;base-dataSource&quot;. For each base-dataSource, we can submit <code>derivativeDataSource</code> supervisors to create and maintain other dataSources which we called  &quot;derived-dataSource&quot;. The dimensions and metrics of derived-dataSources are the subset of base-dataSource's.
+The <code>derivativeDataSource</code> supervisor is used to keep the timeline of derived-dataSource consistent with base-dataSource. Each <code>derivativeDataSource</code> supervisor  is responsible for one derived-dataSource.</p>
+<p>A sample derivativeDataSource supervisor spec is shown below:</p>
+<pre><code class="hljs css language-json">   {
+       <span class="hljs-attr">"type"</span>: <span class="hljs-string">"derivativeDataSource"</span>,
+       <span class="hljs-attr">"baseDataSource"</span>: <span class="hljs-string">"wikiticker"</span>,
+       <span class="hljs-attr">"dimensionsSpec"</span>: {
+           <span class="hljs-attr">"dimensions"</span>: [
+               <span class="hljs-string">"isUnpatrolled"</span>,
+               <span class="hljs-string">"metroCode"</span>,
+               <span class="hljs-string">"namespace"</span>,
+               <span class="hljs-string">"page"</span>,
+               <span class="hljs-string">"regionIsoCode"</span>,
+               <span class="hljs-string">"regionName"</span>,
+               <span class="hljs-string">"user"</span>
+           ]
+       },
+       <span class="hljs-attr">"metricsSpec"</span>: [
+           {
+               <span class="hljs-attr">"name"</span>: <span class="hljs-string">"count"</span>,
+               <span class="hljs-attr">"type"</span>: <span class="hljs-string">"count"</span>
+           },
+           {
+               <span class="hljs-attr">"name"</span>: <span class="hljs-string">"added"</span>,
+               <span class="hljs-attr">"type"</span>: <span class="hljs-string">"longSum"</span>,
+               <span class="hljs-attr">"fieldName"</span>: <span class="hljs-string">"added"</span>
+           }
+       ],
+       <span class="hljs-attr">"tuningConfig"</span>: {
+           <span class="hljs-attr">"type"</span>: <span class="hljs-string">"hadoop"</span>
+       }
+   }
+</code></pre>
+<p><strong>Supervisor Configuration</strong></p>
+<table>
+<thead>
+<tr><th>Field</th><th>Description</th><th>Required</th></tr>
+</thead>
+<tbody>
+<tr><td>Type</td><td>The supervisor type. This should always be <code>derivativeDataSource</code>.</td><td>yes</td></tr>
+<tr><td>baseDataSource</td><td>The name of base dataSource. This dataSource data should be already stored inside Druid, and the dataSource will be used as input data.</td><td>yes</td></tr>
+<tr><td>dimensionsSpec</td><td>Specifies the dimensions of the data. These dimensions must be the subset of baseDataSource's dimensions.</td><td>yes</td></tr>
+<tr><td>metricsSpec</td><td>A list of aggregators. These metrics must be the subset of baseDataSource's metrics. See <a href="/docs/24.0.0/querying/aggregations.html">aggregations</a>.</td><td>yes</td></tr>
+<tr><td>tuningConfig</td><td>TuningConfig must be HadoopTuningConfig. See <a href="/docs/24.0.0/ingestion/hadoop.html#tuningconfig">Hadoop tuning config</a>.</td><td>yes</td></tr>
+<tr><td>dataSource</td><td>The name of this derived dataSource.</td><td>no(default=baseDataSource-hashCode of supervisor)</td></tr>
+<tr><td>hadoopDependencyCoordinates</td><td>A JSON array of Hadoop dependency coordinates that Druid will use, this property will override the default Hadoop coordinates. Once specified, Druid will look for those Hadoop dependencies from the location specified by druid.extensions.hadoopDependenciesDir</td><td>no</td></tr>
+<tr><td>classpathPrefix</td><td>Classpath that will be prepended for the Peon process.</td><td>no</td></tr>
+<tr><td>context</td><td>See below.</td><td>no</td></tr>
+</tbody>
+</table>
+<p><strong>Context</strong></p>
+<table>
+<thead>
+<tr><th>Field</th><th>Description</th><th>Required</th></tr>
+</thead>
+<tbody>
+<tr><td>maxTaskCount</td><td>The max number of tasks the supervisor can submit simultaneously.</td><td>no(default=1)</td></tr>
+</tbody>
+</table>
+<h2><a class="anchor" aria-hidden="true" id="materialized-view-selection"></a><a href="#materialized-view-selection" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
+<p>In materialized-view-selection, we implement a new query type <code>view</code>. When we request a view query, Druid will try its best to optimize the query based on query dataSource and intervals.</p>
+<p>A sample view query spec is shown below:</p>
+<pre><code class="hljs css language-json">   {
+       <span class="hljs-attr">"queryType"</span>: <span class="hljs-string">"view"</span>,
+       <span class="hljs-attr">"query"</span>: {
+           <span class="hljs-attr">"queryType"</span>: <span class="hljs-string">"groupBy"</span>,
+           <span class="hljs-attr">"dataSource"</span>: <span class="hljs-string">"wikiticker"</span>,
+           <span class="hljs-attr">"granularity"</span>: <span class="hljs-string">"all"</span>,
+           <span class="hljs-attr">"dimensions"</span>: [
+               <span class="hljs-string">"user"</span>
+           ],
+           <span class="hljs-attr">"limitSpec"</span>: {
+               <span class="hljs-attr">"type"</span>: <span class="hljs-string">"default"</span>,
+               <span class="hljs-attr">"limit"</span>: <span class="hljs-number">1</span>,
+               <span class="hljs-attr">"columns"</span>: [
+                   {
+                       <span class="hljs-attr">"dimension"</span>: <span class="hljs-string">"added"</span>,
+                       <span class="hljs-attr">"direction"</span>: <span class="hljs-string">"descending"</span>,
+                       <span class="hljs-attr">"dimensionOrder"</span>: <span class="hljs-string">"numeric"</span>
+                   }
+               ]
+           },
+           <span class="hljs-attr">"aggregations"</span>: [
+               {
+                   <span class="hljs-attr">"type"</span>: <span class="hljs-string">"longSum"</span>,
+                   <span class="hljs-attr">"name"</span>: <span class="hljs-string">"added"</span>,
+                   <span class="hljs-attr">"fieldName"</span>: <span class="hljs-string">"added"</span>
+               }
+           ],
+           <span class="hljs-attr">"intervals"</span>: [
+               <span class="hljs-string">"2015-09-12/2015-09-13"</span>
+           ]
+       }
+   }
+</code></pre>
+<p>There are 2 parts in a view query:</p>
+<table>
+<thead>
+<tr><th>Field</th><th>Description</th><th>Required</th></tr>
+</thead>
+<tbody>
+<tr><td>queryType</td><td>The query type. This should always be view</td><td>yes</td></tr>
+<tr><td>query</td><td>The real query of this <code>view</code> query. The real query must be <a href="/docs/24.0.0/querying/groupbyquery.html">groupBy</a>, <a href="/docs/24.0.0/querying/topnquery.html">topN</a>, or <a href="/docs/24.0.0/querying/timeseriesquery.html">timeseries</a> type.</td><td>yes</td></tr>
+</tbody>
+</table>
+<p><strong>Note that Materialized View is currently designated as experimental. Please make sure the time of all processes are the same and increase monotonically. Otherwise, some unexpected errors may happen on query results.</strong></p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/development/extensions-contrib/kafka-emitter.html"><span class="arrow-prev">← </span><span>Kafka Emitter</span></a><a class="docs-next button" href="/docs/24.0.0/development/extensions-contrib/momentsketch-quantiles.html"><span>Moment Sketches for Approximate Quantiles module</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><l [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
+                  if (e.keyCode === 191) {
+                    const search = document.getElementById('search_input_react');
+                    search && search.focus();
+                  }
+                });
+              </script><script>
+              var search = docsearch({
+                
+                apiKey: '2de99082a9f38e49dfaa059bbe4c901d',
+                indexName: 'apache_druid',
+                inputSelector: '#search_input_react',
+                algoliaOptions: {"facetFilters":["language:en","version:24.0.0"]}
+              });
+            </script></body></html>
\ No newline at end of file
diff --git a/docs/24.0.0/development/extensions-contrib/momentsketch-quantiles.html b/docs/24.0.0/development/extensions-contrib/momentsketch-quantiles.html
new file mode 100644
index 00000000..6db6347c
--- /dev/null
+++ b/docs/24.0.0/development/extensions-contrib/momentsketch-quantiles.html
@@ -0,0 +1,180 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Moment Sketches for Approximate Quantiles module · Apache Druid</title><meta name="viewport" content="width=device-width"/><link rel="canonical" href="https://druid.apache.org/docs/24.0.0/development/extensions-contrib/momentsketch-quantiles.html"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" c [...]
+              window.dataLayer = window.dataLayer || [];
+              function gtag(){dataLayer.push(arguments); }
+              gtag('js', new Date());
+              gtag('config', 'UA-131010415-1');
+            </script><link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css"/><link rel="stylesheet" href="/css/code-block-buttons.css"/><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script><script type="text/javascript" src="/js/code-block-buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head>< [...]
+            var coll = document.getElementsByClassName('collapsible');
+            var checkActiveCategory = true;
+            for (var i = 0; i < coll.length; i++) {
+              var links = coll[i].nextElementSibling.getElementsByTagName('*');
+              if (checkActiveCategory){
+                for (var j = 0; j < links.length; j++) {
+                  if (links[j].classList.contains('navListItemActive')){
+                    coll[i].nextElementSibling.classList.toggle('hide');
+                    coll[i].childNodes[1].classList.toggle('rotate');
+                    checkActiveCategory = false;
+                    break;
+                  }
+                }
+              }
+
+              coll[i].addEventListener('click', function() {
+                var arrow = this.childNodes[1];
+                arrow.classList.toggle('rotate');
+                var content = this.nextElementSibling;
+                content.classList.toggle('hide');
+              });
+            }
+
+            document.addEventListener('DOMContentLoaded', function() {
+              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
+              createToggler('#tocToggler', 'body', 'tocActive');
+
+              var headings = document.querySelector('.toc-headings');
+              headings && headings.addEventListener('click', function(event) {
+                var el = event.target;
+                while(el !== headings){
+                  if (el.tagName === 'A') {
+                    document.body.classList.remove('tocActive');
+                    break;
+                  } else{
+                    el = el.parentNode;
+                  }
+                }
+              }, false);
+
+              function createToggler(togglerSelector, targetSelector, className) {
+                var toggler = document.querySelector(togglerSelector);
+                var target = document.querySelector(targetSelector);
+
+                if (!toggler) {
+                  return;
+                }
+
+                toggler.onclick = function(event) {
+                  event.preventDefault();
+
+                  target.classList.toggle(className);
+                };
+              }
+            });
+        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/druid/edit/master/docs/development/extensions-contrib/momentsketch-quantiles.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Moment Sketches for Approximate Quantiles module</h1></header><article><div><span><!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<p>This module provides aggregators for approximate quantile queries using the <a href="https://github.com/stanford-futuredata/momentsketch">momentsketch</a> library.
+The momentsketch provides coarse quantile estimates with less space and aggregation time overheads than traditional sketches, approaching the performance of counts and sums by reconstructing distributions from computed statistics.</p>
+<p>To use this Apache Druid extension, <a href="/docs/24.0.0/development/extensions.html#loading-extensions">include</a> in the extensions load list.</p>
+<h3><a class="anchor" aria-hidden="true" id="aggregator"></a><a href="#aggregator" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
+<p>The result of the aggregation is a momentsketch that is the union of all sketches either built from raw data or read from the segments.</p>
+<p>The <code>momentSketch</code> aggregator operates over raw data while the <code>momentSketchMerge</code> aggregator should be used when aggregating precomputed sketches.</p>
+<pre><code class="hljs css language-json">{
+  <span class="hljs-attr">"type"</span> : &lt;aggregator_type&gt;,
+  <span class="hljs-attr">"name"</span> : &lt;output_name&gt;,
+  <span class="hljs-attr">"fieldName"</span> : &lt;input_name&gt;,
+  <span class="hljs-attr">"k"</span> : &lt;int&gt;,
+  <span class="hljs-attr">"compress"</span> : &lt;boolean&gt;
+ }
+</code></pre>
+<table>
+<thead>
+<tr><th>property</th><th>description</th><th>required?</th></tr>
+</thead>
+<tbody>
+<tr><td>type</td><td>Type of aggregator desired. Either &quot;momentSketch&quot; or &quot;momentSketchMerge&quot;</td><td>yes</td></tr>
+<tr><td>name</td><td>A String for the output (result) name of the calculation.</td><td>yes</td></tr>
+<tr><td>fieldName</td><td>A String for the name of the input field (can contain sketches or raw numeric values).</td><td>yes</td></tr>
+<tr><td>k</td><td>Parameter that determines the accuracy and size of the sketch. Higher k means higher accuracy but more space to store sketches. Usable range is generally [3,15]</td><td>no, defaults to 13.</td></tr>
+<tr><td>compress</td><td>Flag for whether the aggregator compresses numeric values using arcsinh. Can improve robustness to skewed and long-tailed distributions, but reduces accuracy slightly on more uniform distributions.</td><td>no, defaults to true</td></tr>
+</tbody>
+</table>
+<h3><a class="anchor" aria-hidden="true" id="post-aggregators"></a><a href="#post-aggregators" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<p>Users can query for a set of quantiles using the <code>momentSketchSolveQuantiles</code> post-aggregator on the sketches created by the <code>momentSketch</code> or <code>momentSketchMerge</code> aggregators.</p>
+<pre><code class="hljs css language-json">{
+  <span class="hljs-attr">"type"</span>  : <span class="hljs-string">"momentSketchSolveQuantiles"</span>,
+  <span class="hljs-attr">"name"</span> : &lt;output_name&gt;,
+  <span class="hljs-attr">"field"</span> : &lt;reference to moment sketch&gt;,
+  <span class="hljs-attr">"fractions"</span> : &lt;array of doubles in [<span class="hljs-number">0</span>,<span class="hljs-number">1</span>]&gt;
+}
+</code></pre>
+<p>Users can also query for the min/max of a distribution:</p>
+<pre><code class="hljs css language-json">{
+  <span class="hljs-attr">"type"</span> : <span class="hljs-string">"momentSketchMin"</span> | <span class="hljs-string">"momentSketchMax"</span>,
+  <span class="hljs-attr">"name"</span> : &lt;output_name&gt;,
+  <span class="hljs-attr">"field"</span> : &lt;reference to moment sketch&gt;,
+}
+</code></pre>
+<h3><a class="anchor" aria-hidden="true" id="example"></a><a href="#example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
+<p>As an example of a query with sketches pre-aggregated at ingestion time, one could set up the following aggregator at ingest:</p>
+<pre><code class="hljs css language-json">{
+  <span class="hljs-attr">"type"</span>: <span class="hljs-string">"momentSketch"</span>,
+  <span class="hljs-attr">"name"</span>: <span class="hljs-string">"sketch"</span>,
+  <span class="hljs-attr">"fieldName"</span>: <span class="hljs-string">"value"</span>,
+  <span class="hljs-attr">"k"</span>: <span class="hljs-number">10</span>,
+  <span class="hljs-attr">"compress"</span>: <span class="hljs-literal">true</span>,
+}
+</code></pre>
+<p>and make queries using the following aggregator + post-aggregator:</p>
+<pre><code class="hljs css language-json">{
+  <span class="hljs-attr">"aggregations"</span>: [{
+    <span class="hljs-attr">"type"</span>: <span class="hljs-string">"momentSketchMerge"</span>,
+    <span class="hljs-attr">"name"</span>: <span class="hljs-string">"sketch"</span>,
+    <span class="hljs-attr">"fieldName"</span>: <span class="hljs-string">"sketch"</span>,
+    <span class="hljs-attr">"k"</span>: <span class="hljs-number">10</span>,
+    <span class="hljs-attr">"compress"</span>: <span class="hljs-literal">true</span>
+  }],
+  <span class="hljs-attr">"postAggregations"</span>: [
+  {
+    <span class="hljs-attr">"type"</span>: <span class="hljs-string">"momentSketchSolveQuantiles"</span>,
+    <span class="hljs-attr">"name"</span>: <span class="hljs-string">"quantiles"</span>,
+    <span class="hljs-attr">"fractions"</span>: [<span class="hljs-number">0.1</span>, <span class="hljs-number">0.5</span>, <span class="hljs-number">0.9</span>],
+    <span class="hljs-attr">"field"</span>: {
+      <span class="hljs-attr">"type"</span>: <span class="hljs-string">"fieldAccess"</span>,
+      <span class="hljs-attr">"fieldName"</span>: <span class="hljs-string">"sketch"</span>
+    }
+  },
+  {
+    <span class="hljs-attr">"type"</span>: <span class="hljs-string">"momentSketchMin"</span>,
+    <span class="hljs-attr">"name"</span>: <span class="hljs-string">"min"</span>,
+    <span class="hljs-attr">"field"</span>: {
+      <span class="hljs-attr">"type"</span>: <span class="hljs-string">"fieldAccess"</span>,
+      <span class="hljs-attr">"fieldName"</span>: <span class="hljs-string">"sketch"</span>
+    }
+  }]
+}
+</code></pre>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/24.0.0/development/extensions-contrib/materialized-view.html"><span class="arrow-prev">← </span><span>Materialized View</span></a><a class="docs-next button" href="/docs/24.0.0/development/extensions-contrib/moving-average-query.html"><span>Moving Average Query</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer druid-foote [...]
+                document.addEventListener('keyup', function(e) {
+                  if (e.target !== document.body) {
+                    return;
+                  }
+                  // keyCode for '/' (slash)
... 50460 lines suppressed ...


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@druid.apache.org
For additional commands, e-mail: commits-help@druid.apache.org