From 1b4b610c9428cccc37fac5f54e060449443af2b4 Mon Sep 17 00:00:00 2001 From: Harshini Rangaswamy Date: Fri, 22 Sep 2023 11:52:06 +0200 Subject: [PATCH] address review feedback --- .../kafka/concepts/kafka-tiered-storage.rst | 15 +++++++++------ .../concepts/list-kafka-tiered-storage.rst | 4 +++- .../concepts/tiered-storage-guarantees.rst | 2 +- .../concepts/tiered-storage-how-it-works.rst | 4 ++++ .../kafka/tiered-storage/data-retention.png | Bin 0 -> 20470 bytes 5 files changed, 17 insertions(+), 8 deletions(-) create mode 100644 images/products/kafka/tiered-storage/data-retention.png diff --git a/docs/products/kafka/concepts/kafka-tiered-storage.rst b/docs/products/kafka/concepts/kafka-tiered-storage.rst index 8aaa0084ae..bf0f5eaf9d 100644 --- a/docs/products/kafka/concepts/kafka-tiered-storage.rst +++ b/docs/products/kafka/concepts/kafka-tiered-storage.rst @@ -1,11 +1,12 @@ Tiered storage overview ========================== -Tiered storage in Aiven for Apache Kafka allows you to manage your data more efficiently by leveraging two distinct storage types—local disk and remote cloud storage options like AWS S3 and Google Cloud Storage. This feature offers a tailored approach to data storage, allowing you to allocate frequently accessed data to high-speed local disks while offloading less critical or infrequently accessed data to more cost-effective remote storage solutions. Tiered storage enables you to indefinitely store data on specific topics without running out of space. Once enabled, it is configured per topic, giving you granular control over data storage needs. +Tiered storage in Aiven for Apache Kafka® allows you to manage your data more efficiently by leveraging two distinct storage types—local disk and remote cloud storage options like AWS S3 and Google Cloud Storage. This feature offers a tailored approach to data storage, allowing you to allocate frequently accessed data to high-speed local disks while offloading less critical or infrequently accessed data to more cost-effective remote storage solutions. Tiered storage enables you to indefinitely store data on specific topics without running out of space. Once enabled, it is configured per topic, giving you granular control over data storage needs. .. note:: - Azure blob storage is not yet supported for tiered storage in Aiven for Apache Kafka. + - Tiered stoage for Aiven for Apache Kafka® is support from Apache Kafka version 3.6 or higher + - Azure blob storage is not yet supported for tiered storage in Aiven for Apache Kafka. Tiered storage offers multiple benefits, including: @@ -25,6 +26,8 @@ Understanding when and why to use tiered storage in Aiven for Apache Kafka will * **Long-term data retention**: Many organizations require large-scale data storage for extended periods, either for regulatory compliance or historical data analysis. Cloud services provide an almost limitless storage capacity, making it possible to keep data accessible for as long as required at a reasonable cost. This is where tiered storage becomes especially valuable. * **High-speed data ingestion**: Tiered storage can offer a solution when dealing with unpredictable or sudden influxes of data. By supplementing the local disks with cloud storage, sudden increases in incoming data can be managed, ensuring optimum system performance. +* **Unlock unexplored opportunities:** Tiered storage in Aiven for Apache Kafka addresses existing storage challenges and opens the door to new and innovative use cases that were once unfeasible or cost-prohibitive. By eliminating traditional storage limitations, organizations gain the flexibility to support a wide range of applications and workflows, even those where Apache Kafka might have been considered impractical before. We encourage users to leverage this newfound flexibility to think creatively and redefine their experience with Apache Kafka. + Pricing @@ -35,8 +38,8 @@ Tiered storage costs are determined by the amount of remote storage used, measur Related reading ---------------- -* :doc:`How tiered storage works in Aiven for Apache Kafka® <../tiered-storage-how-it-works.html>` -* :doc:`Guarantees <../tiered-storage-guarantees>` -* :doc:`Backups <../tiered-storage-backups>` -* :doc:`Limiations <../tiered-storage-limitations>` +* :doc:`How tiered storage works in Aiven for Apache Kafka® ` +* :doc:`Guarantees ` +* :doc:`Backups ` +* :doc:`Limiations ` diff --git a/docs/products/kafka/concepts/list-kafka-tiered-storage.rst b/docs/products/kafka/concepts/list-kafka-tiered-storage.rst index ae6005167f..81d06cba49 100644 --- a/docs/products/kafka/concepts/list-kafka-tiered-storage.rst +++ b/docs/products/kafka/concepts/list-kafka-tiered-storage.rst @@ -1,7 +1,9 @@ Tiered storage in Aiven for Apache Kafka® =========================================== -Discover the tiered storage capability in Aiven for Apache Kafka®. Learn how it works and explore its use cases. Check why you might need it and what benefits you get using it. +Discover how tiered storage works in Aiven for Apache Kafka®, explore its use cases, and learn why you might need it and what benefits it offers. + + .. tableofcontents:: \ No newline at end of file diff --git a/docs/products/kafka/concepts/tiered-storage-guarantees.rst b/docs/products/kafka/concepts/tiered-storage-guarantees.rst index 3a71e9a028..8ede2ce70a 100644 --- a/docs/products/kafka/concepts/tiered-storage-guarantees.rst +++ b/docs/products/kafka/concepts/tiered-storage-guarantees.rst @@ -10,7 +10,7 @@ With Aiven for Apache Kafka®'s tiered storage, there are two primary types of d Example -------- -Let's say you have a topic with a total retention threshold of 1000 GB and a local retention threshold of 200 GB. This means that: +Let's say you have a topic with a **total retention threshold** of **1000 GB** and a **local retention threshold** of **200 GB**. This means that: * All data for the topic will be retained, regardless of whether it is stored locally or remotely, as long as the total size of the data does not exceed 1000 GB. * If tiered storage is enabled per topic, older segments will be uploaded immediately to remote storage, irrespective of whether the local retention threshold of 200 GB is exceeded. Data will be deleted from local storage only after it has been safely transferred to remote storage. diff --git a/docs/products/kafka/concepts/tiered-storage-how-it-works.rst b/docs/products/kafka/concepts/tiered-storage-how-it-works.rst index 05f08c02cb..6c9635cc49 100644 --- a/docs/products/kafka/concepts/tiered-storage-how-it-works.rst +++ b/docs/products/kafka/concepts/tiered-storage-how-it-works.rst @@ -17,6 +17,9 @@ Local vs. remote data retention --------------------------------- When tiered storage is enabled, data is initially stored on the local disk of the Kafka broker. Data is then asynchronously transferred to remote storage based on the pre-defined local retention threshold. During periods of high data ingestion or transient errors, such as network connectivity issues, the local storage might temporarily hold more data than specified by the local retention threshold. +.. image:: /images/products/kafka/tiered-storage/data-retention.png + :alt: Diagram depicting the concept of local vs. remote data retention in a tiered storage system. + Segment management ------------------- Data is organized into segments, which are uploaded to remote storage individually. The active (newest) segment remains in local storage, which means that the segment size can also influence local data retention. For instance, if the local retention threshold is 1 GB, but the segment size is 2 GB, the local storage will exceed the 1 GB limit until the active segment is rolled over and uploaded to remote storage. @@ -25,6 +28,7 @@ Data is organized into segments, which are uploaded to remote storage individual Asynchronous uploads and replication -------------------------------------- Data is transferred to remote storage asynchronously and does not interfere with the producer activity. While the broker aims to move data as swiftly as possible, certain conditions, such as high-throughput or connectivity issues, may cause more data to be stored in the local storage than the specified local retention policy. + Any data exceeding the local retention threshold will not be purged by the log cleaner until it is successfully uploaded to remote storage. The replication factor is not considered during the upload process, and only one copy of each segment is uploaded to the remote storage. Most remote storage options have their own measures, including data replication, to ensure data durability. diff --git a/images/products/kafka/tiered-storage/data-retention.png b/images/products/kafka/tiered-storage/data-retention.png new file mode 100644 index 0000000000000000000000000000000000000000..b42cc3eaaeec980c593ee3f9738c266a0ed68945 GIT binary patch literal 20470 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 literal 0 HcmV?d00001