Ordered Key-Value Store

From HandWiki

An Ordered Key-Value Store (OKVS) is a type of data storage paradigm that can support multi-model database. An OKVS is an ordered mapping of bytes to bytes. It is a more powerful paradigm than Key-Value Store because OKVS allow to build higher level abstractions without the need to do full scans. An OKVS will keep the key-value pairs sorted by the key lexicographic order. OKVS systems provides different set of features and performance trade-offs. Most of them are shipped as a library without network interfaces, in order to be embedded in another process. Most OKVS support ACID guarantees. Some OKVS are distributed databases. Ordered Key-Value Store found their way into many modern database systems including NewSQL database systems.

History

The origin of Ordered Key-Value Store stems from the work of Ken Thompson on dbm in 1979. Later in 1991, Berkeley DB was released that featured a B-Tree backend that allowed the keys to stay sorted. Berkeley DB was said to be very fast and made its way into various commercial product.[1] It was included in Python standard library until 2.7.[2] In 2009, Tokyo Cabinet was released that was superseded by Kyoto Cabinet that support both transaction and ordered keys. In 2011, LMDB was created to replace Berkeley DB in OpenLDAP. There is also Google's LevelDB that was forked by Facebook in 2012 as RocksDB. In 2014, WiredTiger, successor of Berkeley DB was acquired by MongoDB and is since 2019 the primary backend of MongoDB database.

Other notable implementation of the OKVS paradigm are Sophia[3] and SQLite3 LSM extension.[4] Another notable use of OKVS paradigm is the multi-model database system called ArangoDB[5] based on RocksDB.

Some NewSQL databases are supported by Ordered Key-Value Stores. JanusGraph, a property graph database, has both a Berkeley DB backend and FoundationDB backend.

Key concepts

Lexicographic encoding

There are algorithms that encode basic data types (boolean, string, number) and composition of those data types inside sorted containers (tuple, list, vector) that preserve their natural ordering. It is possible to work with an Ordered Key-Value Store without having to work directly with bytes. In FoundationDB, it is called the tuple layer.[6]

Range query

Inside an OKVS, keys are ordered, and because of that it is possible to do range queries. A range query allow to retrieve all keys between two keys such as all keys that are fetched are ordered.

Subspaces

Key composition

One can construct key spaces to build higher level abstractions. The idea is to construct keys, that takes advantage of the ordered nature of the top level key space. When taking advantage of the ordered nature of the key space, one can query ranges of keys that have particular pattern.

Denormalization

Denormalization, as in, repeating the same piece of data in multiple subspace is common practice. It allows to create secondary representation, also called indices, that will allow to speed up queries.

Higher level abstractions

The following abstraction or databases were built on top Ordered Key-Value Stores:

  • Timeseries database,[7]
  • Record Database,[8] also known as Row store databases, they behave similarly to what is dubbed RDBMS,
  • Tuple Stores, also known as Triple Store or Quad Store but also Generic Tuple Store,[9][10]
  • Document database,[11] that mimics MongoDB API,
  • Full-text search[12]
  • Geographic Information Systems[13]
  • Property Graph[14]
  • Versioned Data[15]

All those abstraction can co-exist with the same OKVS database and when ACID is supported, the operations happens with the guarantees offered by the transaction system.

Feature matrix

Comparison of several Ordered Key-Value Stores
OKVS License Transactions Distributed In-memory Multiple threads Multiple processes
Berkeley DB AGPL Yes No No yes yes
WiredTiger GPL Yes No Yes yes no
LevelDB Apache No No No no
Kyoto Cabinet GPL Yes No No no
RocksDB Apache Yes No No yes no
SQLite LSM Extension Public domain Yes1 No Yes yes2 yes2
TiKV Apache Yes Yes No yes yes
FoundationDB Apache Yes Yes Yes yes yes
  1. SQLite LSM extension's transactions can be nested
  2. SQLite LSM extension support multiple readers, and only a single writer that do not block readers

See also

References

  1. "BerkeleyDB & other distributed high performance key/value databases - High Scalability -" (in en). http://highscalability.com/blog/2007/7/31/berkeleydb-other-distributed-high-performance-keyvalue-datab.html. 
  2. "11.11. bsddb — Interface to Berkeley DB library — Python 2.7.17 documentation". https://docs.python.org/2/library/bsddb.html. 
  3. "sophia - modern transactional key-value/row storage library.". http://sophia.systems/. 
  4. "LSM Key/Value Storage in SQLite3". https://charlesleifer.com/blog/lsm-key-value-storage-in-sqlite3/. 
  5. "Comparing new RocksDB and MMFiles storage engines" (in en-US). https://www.arangodb.com/why-arangodb/rocksdb-storage-engine/. 
  6. "Python API — FoundationDB 6.2". https://apple.github.io/foundationdb/api-python.html#api-python-tuple-layer. 
  7. "How FoundationDB Powers Snowflake Metadata Forward | Snowflake Blog" (in en-US). 2018-04-19. https://www.snowflake.com/blog/how-foundationdb-powers-snowflake-metadata-forward/. 
  8. A record-oriented store built on FoundationDB., FoundationDB, 2020-01-16, https://github.com/FoundationDB/fdb-record-layer, retrieved 2020-01-17 
  9. "Generic Tuple Store Database". https://srfi.schemers.org/srfi-168/. 
  10. "Generic Tuple Store". https://github.com/amirouche/hoply/. 
  11. A document data model on FoundationDB, implementing MongoDB® wire protocol: FoundationDB/fdb-document-layer, FoundationDB, 2019-12-09, https://github.com/FoundationDB/fdb-document-layer, retrieved 2020-01-17 
  12. meilisearch/MeiliSearch, MeiliSearch, 2021-06-19, https://github.com/meilisearch/MeiliSearch, retrieved 2021-06-19 
  13. "6.1. GeoMesa Index Structure — GeoMesa 1.3.1 Manuals". https://www.geomesa.org/documentation/1.3.1/user/datastores/index_structure.html. 
  14. "The JanusGraph FoundationDB Storage Adapter - Ted Wilmes, Expero Inc.". https://www.youtube.com/watch?v=rQM_ZPZy8Ck. 
  15. "Lightning Talk: Entity Store: A FoundationDB Layer for Versioned... - Stephen Pimentel, - YouTube". https://www.youtube.com/embed/16uU_Aaxp9Y?autoplay=1&feature=oembed&wmode=opaque.