Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ [Tarchia] incremental compaction #1953

Open
joocer opened this issue Aug 29, 2024 · 0 comments
Open

✨ [Tarchia] incremental compaction #1953

joocer opened this issue Aug 29, 2024 · 0 comments

Comments

@joocer
Copy link
Contributor

joocer commented Aug 29, 2024

Using a BRIN (Block Range INdex) in combination with partial sorting during compaction can be an effective strategy for improving the performance of queries over a large number of SST files. Let's explore how this would work and the benefits it might offer.

1. Concept Overview

BRIN Index

  • BRIN Basics: A BRIN is a lightweight index that stores metadata about ranges of blocks within a file. For example, in the context of your SST files, a BRIN could store the minimum and maximum values of a key within a certain range of rows (or blocks) in each SST file.
  • Efficiency: BRINs are particularly efficient in scenarios where the data within the file is somewhat ordered or at least exhibits locality of reference, as they can quickly exclude large portions of data that don’t match the query criteria.

Partial Sorting During Compaction

  • Batch Compaction: When compacting SST files, instead of merging all SST files into one, you could compact them in smaller batches (e.g., groups of four files). During this compaction, you partially sort the data based on specific keys.
  • Creating Order Over Time: Over multiple compaction operations, this partial sorting would gradually introduce a sense of order across the SST files, improving the efficiency of both range and point queries.

2. Workflow with BRIN and Partial Sorting

Initial Data Insertion

  • As data is written, new SST files are created without any global order. These files are written quickly and are optimized for write performance.

Compaction Strategy

  • During periodic compaction:
    • Batch Selection: Choose a small batch of SST files (e.g., four) to compact.
    • Partial Sorting: Within the batch, sort records based on one or more keys (e.g., primary key or timestamp).
    • BRIN Creation: After sorting, create a BRIN for each of the compacted files, storing the minimum and maximum values for the keys in defined ranges (e.g., blocks of rows or disk pages).

Query Execution

  • When a query is issued:
    • BRIN Scan: Use the BRINs across all SST files to identify which files (and even which specific block ranges within those files) might contain the target rows.
    • Bloom Filter Check: For the identified SST files, further refine the search using per-file Bloom filters to check for the presence of the specific row key.
    • Row Retrieval: Finally, perform a binary search or scan within the relevant blocks to retrieve the data.

3. Benefits of This Approach

Faster Query Performance

  • Selective File Access: BRINs allow the system to quickly exclude large portions of data from the search, significantly speeding up query performance.
  • Improved Locality: Partial sorting improves data locality over time, which means that even though the entire dataset isn't globally sorted, related records are increasingly clustered together. This enhances the performance of both point queries and range queries.

Incremental Ordering

  • Progressive Compaction: By compacting in batches and introducing partial order, the dataset becomes more ordered over time without the need for expensive full dataset reordering.
  • Scalable: This approach scales well because it doesn’t require massive compaction operations that could become bottlenecks. Instead, smaller, more manageable compactions gradually improve the structure of the data.

Space Efficiency

  • Lightweight Indexing: BRINs are compact and don’t consume much space compared to more granular indexes like B-trees, making them suitable for large datasets.

4. Potential Challenges

Handling Multiple Keys

  • Key Selection: If you need to sort by multiple keys or support multiple query patterns, you’ll need to decide how to balance these requirements. One approach might be to rotate the sort key with each compaction cycle or create separate BRINs for different keys.
  • Data Skew: If the data distribution is highly skewed, the partial sorting might lead to uneven data distribution across SST files, which could affect query performance. Careful monitoring and adaptive strategies might be needed to manage this.

Compaction Overhead

  • Compaction Cost: Frequent compactions might introduce overhead, so it’s essential to balance the frequency and size of compaction operations to minimize their impact on write performance.

5. Example Scenario

Imagine a scenario where you have 100 SST files, each storing user data with keys like user_id and timestamp.

  • Initial State: The SST files are unordered, with each file containing a random mix of records.
  • First Compaction: You compact four files and sort them by user_id. After compaction, these four files have BRIN indexes on user_id, with each BRIN storing min/max user_id for defined ranges.
  • Subsequent Queries: When a query for user_id = 1234 is issued, the system uses the BRIN to quickly narrow down to the relevant blocks within the newly compacted files. The search is further refined using Bloom filters.

Over time, as more files are compacted, the data becomes increasingly ordered, improving query performance across the board.

Conclusion

Using BRINs in conjunction with partial sorting during compaction offers a practical and scalable way to enhance query performance over a large number of SST files. It allows you to gradually introduce order into the dataset, making queries faster while maintaining the flexibility and efficiency of an LSM-like storage system.

Would you like to explore any specific aspect of this design further?

@joocer joocer changed the title ✨ tarchia ✨ [Tarchia] incremental compaction Oct 4, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant