From b0820d903de872687e9e9a81e27ff8ca806b553b Mon Sep 17 00:00:00 2001 From: josh-wong Date: Mon, 11 Nov 2024 09:29:02 +0000 Subject: [PATCH] AUTO: Sync ScalarDB docs in English to docs site repo --- versioned_docs/version-3.11/design.mdx | 30 ++++++++++++++++-- .../images/scalardb-architecture.png | Bin 0 -> 337407 bytes 2 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 versioned_docs/version-3.11/images/scalardb-architecture.png diff --git a/versioned_docs/version-3.11/design.mdx b/versioned_docs/version-3.11/design.mdx index d900065c..10474d91 100644 --- a/versioned_docs/version-3.11/design.mdx +++ b/versioned_docs/version-3.11/design.mdx @@ -5,9 +5,35 @@ tags: - Enterprise Premium --- -# ScalarDB Design Document +# ScalarDB Design -For details about the design and implementation of ScalarDB, please see the following documents, which we presented at the VLDB 2023 conference: +This document briefly explains the design and implementation of ScalarDB. For what ScalarDB is and its use cases, see [ScalarDB Overview](./overview.mdx). + +## Overall architecture + +ScalarDB is hybrid transaction/analytical processing (HTAP) middleware that sits in between applications and databases. As shown in the following figure, ScalarDB consists of three components: Core, Cluster, and Analytics. ScalarDB basically employs a layered architecture, so the Cluster and Analytics components use the Core component to interact with underlying databases but sometimes bypass the Core component for performance optimization without sacrificing correctness. Likewise, each component also consists of several layers. + +![ScalarDB architecture](images/scalardb-architecture.png) + +## Components + +The following subsections explain each component one by one. + +### Core + +ScalarDB Core, which is provided as open-source software under the Apache 2 License, is an integral part of ScalarDB. Core provides a database manager that has an abstraction layer that abstracts underlying databases and adapters (or shims) that implement the abstraction for each database. In addition, it provides a transaction manager on top of the database abstraction that achieves database-agnostic transaction management based on Scalar's novel distributed transaction protocol called Consensus Commit. Core is provided as a library that offers a simple CRUD interface. + +### Cluster + +ScalarDB Cluster, which is licensed under a commercial license, is a component that provides a clustering solution for the Core component to work as a clustered server. Cluster is mainly designed for OLTP workloads, which have many small, transactional and non-transactional reads and writes. In addition, it provides several enterprise features such as authentication, authorization, encryption at rest, and fine-grained access control (still under development). Not only does Cluster offer the same CRUD interface as the Core component, but it also offers SQL and GraphQL interfaces. Since Cluster is provided as a container in a Kubernetes Pod, you can increase performance and availability by having more containers. + +### Analytics + +ScalarDB Analytics, which is licensed under a commercial license, is a component that provides scalable analytical processing for the data managed by the Core component or managed by applications that don’t use ScalarDB. Analytics is mainly designed for OLAP workloads, which have a small number of large, analytical read queries. In addition, it offers a SQL and DataSet API through Spark. Since the Analytics component is provided as a Java package that can be installed on Apache Spark engines, you can increase performance by having more Spark worker nodes. + +## See also + +For details about the design and implementation of ScalarDB, see the following documents, which were presented at the VLDB 2023 conference: - **Speakerdeck presentation:** [ScalarDB: Universal Transaction Manager for Polystores](https://speakerdeck.com/scalar/scalardb-universal-transaction-manager-for-polystores-vldb23) - **Detailed paper:** [ScalarDB: Universal Transaction Manager for Polystores](https://www.vldb.org/pvldb/vol16/p3768-yamada.pdf) diff --git a/versioned_docs/version-3.11/images/scalardb-architecture.png b/versioned_docs/version-3.11/images/scalardb-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..c44efa813c13805c9b8d1514b778a6d692493b86 GIT binary patch literal 337407 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