LinDB

LinDB is a distributed time-series DBMS written in Go. It is optimized especially for real-time writing and retrieval tasks, and is used internally by ELEME Inc. The internal version is Java based, however open sourced version is redesigned in Go.

History

Companies like ELEME Inc. need to monitor all its systems, which calls for DBMS capable of saving multi dimension monitoring metrics for several PB per day. Previously the company use graphite, however its performance downgrades when the dimension of the metrics increases. LinDB is developed to address this demand. The project is launched at 2016 internally, and has been updated three versions. The open sourced version is a redesign and rewrite in Go since 2019, but is not in production stage yet.

Compression

Bitmap Encoding

LinDB uses a combination of bitmap encoding and data compression. Since it is designed for time-series data, all data entry contains a timestamp and several multi dimensional metrics, such as ip string, shard id, etc. The timestamp is saved with a base timestamp and a bitmap with each bit encoding a time within some time period following the base timestamp. The data blocks are compressed with xor, in reference to Gorilla.

Concurrency Control

Not Supported

Concurrency control is not supported. All writing to the DB is first directed to the specific shard based on its tagKey and tagValue. Within each shard all writing is handled by a single thread.

Data Model

Column Family

Similar to other time-series DBMS, the data model contains four main components: timestamp, metrics, tags, and fields. The metric is the name of the measurement attribute. Tags are combinations of dimensions of measurement used during query, and the fields stores metric data. User has to define whether their columns belong to tags or fields.

Foreign Keys

Not Supported

Query Interface

SQL

LinDB supports SQL-like query interface.

System Architecture

Shared-Nothing

LinDB is designed to support both fast insert and high throughput read, including mainly aggregation operations such as group by. Meanwhile, it needs distributed storage due to the size of the stored data. The storage layer mainly stores data with write replication, with shard number configurable to user. Each cluster contains several servers, and data are redundantly stored across servers. User interacts with the DBMS via brokers. The broker is in charge of receiving query requests, parsing queries, redirect child execute plan to storage layer, and aggregation if needed. In addition, metadata of the clusters for broker layer and storage layer are stored by ETCD, an external dependency. It servers as a distributed configuration service in Go. The internal Java version LinDB use Zookeeper for the same functionality.

People Also Viewed

LinDB Logo
Website

https://github.com/eleme/lindb

Source Code

https://github.com/eleme/lindb

Tech Docs

https://github.com/eleme/lindb/wiki

Developer

ELEME Inc.

Country of Origin

CN

Start Year

2019

Project Type

Open Source

Written in

Go

Supported languages

SQL

Embeds / Uses

etcd

Inspired By

InfluxDB

Licenses

Apache v2

People Also Viewed