TiKV ("Ti" stands for Titanium) is an open source distributed transactional key-value database. Unlike other traditional NoSQL systems, TiKV not only provides classical key-value APIs, but also transactional APIs with ACID compliance. Built in Rust and powered by Raft, TiKV was originally created to complement TiDB, a distributed HTAP database compatible with the MySQL protocol.
The design of TiKV is inspired by some great distributed systems from Google, such as BigTable, Spanner, and Percolator, and some of the latest achievements in academia in recent years, such as the Raft consensus algorithm.
TiKV is an incubating project of the Cloud Native Computing Foundation (CNCF). If you are an organization that wants to help shape the evolution of technologies that are container-packaged, dynamically-scheduled and microservices-oriented, consider joining the CNCF. For details about who's involved and how TiKV plays a role, read the CNCF announcement.
With the implementation of the Raft consensus algorithm in Rust and consensus state stored in RocksDB, TiKV guarantees data consistency. Placement Driver (PD), which is introduced to implement auto-sharding, enables automatic data migration. The transaction model is similar to Google's Percolator with some performance improvements. TiKV also provides snapshot isolation (SI), snapshot isolation with lock (SQL: SELECT ... FOR UPDATE
), and externally consistent reads and writes in distributed transactions.
TiKV has the following key features:
-
Geo-Replication
TiKV uses Raft and the Placement Driver to support Geo-Replication.
-
Horizontal scalability
With PD and carefully designed Raft groups, TiKV excels in horizontal scalability and can easily scale to 100+ TBs of data.
-
Consistent distributed transactions
Similar to Google's Spanner, TiKV supports externally-consistent distributed transactions.
-
Coprocessor support
Similar to Hbase, TiKV implements a coprocessor framework to support distributed computing.
-
Cooperates with TiDB
Thanks to the internal optimization, TiKV and TiDB can work together to be a compelling database solution with high horizontal scalability, externally-consistent transactions, support for RDBMS, and NoSQL design patterns.
For instructions on deployment, configuration, and maintenance of TiKV, see our Documentation on TiKV's wiki page or on our website. For more details on concepts and designs behind TiKV, see Deep Dive TiKV.
Note:
We are currently migrating our documentation from the TiKV's wiki page to the official website. We'd appreciate if you could check out the new look on the website and offer your feedback here. The Wiki page will be discontinued when the migration is finished. Stay tuned!
You can view the list of TiKV Adopters.
You can see the TiKV Roadmap.
- Placement Driver: PD is the cluster manager of TiKV, which periodically checks replication constraints to balance load and data automatically.
- Store: There is a RocksDB within each Store and it stores data into the local disk.
- Region: Region is the basic unit of Key-Value data movement. Each Region is replicated to multiple Nodes. These multiple replicas form a Raft group.
- Node: A physical node in the cluster. Within each node, there are one or more Stores. Within each Store, there are many Regions.
When a node starts, the metadata of the Node, Store and Region are recorded into PD. The status of each Region and Store is reported to PD regularly.
TiKV was originally a component of TiDB. To run TiKV you must build and run it with PD, which is used to manage a TiKV cluster. You can use TiKV together with TiDB or separately on its own.
We provide multiple deployment methods, but it is recommended to use our Ansible deployment for production environment. The TiKV documentation is available on TiKV's wiki page.
-
You can use
tidb-docker-compose
to quickly test TiKV and TiDB on a single machine. This is the easiest way. For other ways, see TiDB documentation. -
Try TiKV separately
- Deploy TiKV Using Docker Compose: To quickly test TiKV separately without TiDB using
tidb-docker-compose
on a single machine - Deploy TiKV Using Docker: To deploy a multi-node TiKV testing cluster using Docker
- Deploy TiKV Using Binary Files: To deploy a TiKV cluster using binary files on a single node or on multiple nodes
- Deploy TiKV Using Docker Compose: To quickly test TiKV separately without TiDB using
For the production environment, use Ansible to deploy the cluster.
Currently, the interfaces to TiKV are the TiDB Go client and the TiSpark Java client.
These are the clients for TiKV:
If you want to try the Go client, see Try Two Types of APIs.
The TiKV codebase is primarily written in Rust, but has components written in C++ (RocksDB) and Go (gRPC). To provide consistency and avoid opinion-based arguments, we make extensive use of linters and automated formatting tools. Additionally, due to Rust's youth we are currently utilizing nightly builds which provide access to many useful features.
To build TiKV you'll need to at least have the following installed:
git
- Version controlrustup
- Rust toolchain managerawk
- Pattern scanning/processing languagecmake
- Build tool (required for gRPC)make
- Build tool (run common workflows)llvm
andclang
- Used to generate bindings for different platforms and build native libraries (required for grpcio, rocksdb)
git clone https://github.com/tikv/tikv.git
cd tikv
# Future instructions assume you are in this repository
rustup
is an official toolchain manager for Rust, similar to rvm
or rbenv
from the Ruby world.
TiKV uses the version of the Rust toolchain specified in rust-toolchain
. rustup
and cargo
will automatically utilize this file. We also make use of the rustfmt
and clippy
components.
rustup component add rustfmt-preview
While TiKV includes a Makefile
with common workflows, you are also able to use cargo
as you would in a normal Rust project.
At this point, you can build TiKV:
make build
During interactive development, you may prefer using cargo check
, which will do parse, borrow check, and lint run on your code, but not actually compile it. It is particularly handy alongside cargo-watch
which will run a command each time you change a file.
cargo install cargo-watch
cargo watch -s "cargo check"
When you're ready to test out your changes, use the dev
task. It will format your codebase, build with clippy
enabled, and run tests. This should run without failure before you create a PR.
make dev
You can run the full test suite locally, or just run a specific test:
# Run the full suite
make test
# Run a specific test
cargo test $TESTNAME
Our CI systems automatically test all the pull requests, so making sure the full suite passes the test before creating your PR is not strictly required. All merged PRs must have passed CI test.
Note that, to reduce compilation time, TiKV builds do not include debugging information by default. The easiest way to enable debuginfo is to precede build commands with RUSTFLAGS=-Cdebuginfo=1
(for line numbers), or RUSTFLAGS=-Cdebuginfo=2
(for full debuginfo).
RUSTFLAGS=-Cdebuginfo=2 make
RUSTFLAGS=-Cdebuginfo=2 cargo build
When building with make, cargo will automatically use pipelined compilation to increase the paralellism of the build. To turn on pipelining while using cargo directly,
set CARGO_BUILD_PIPELINING=true
:
CARGO_BUILD_PIPELINING=true cargo build
To get PD working with TiKV, we suggest you follow the instructions in Deploy TiKV Using Binary Files, because you need the pd-server
at least to work alongside tikv-server
for integration level testing.
Read our configuration guide to learn about various configuration options. Also, here is a configuration template.
Contributions are welcome! See CONTRIBUTING for details on submitting patches and the contribution workflow.
For beginners, we have prepared many suitable tasks for you. Checkout our Help Wanted issues for a list, in which we have also marked the difficulty level.
If you are planning something big, for example, relates to multiple components or changes current behaviors, make sure to open an issue to discuss with us before going on.
The TiKV team actively develops and maintains a bunch of dependencies used in TiKV, which you may be also interested in:
- rust-prometheus: The Prometheus client for Rust, our metrics collecting and reporting library
- rust-rocksdb: Our RocksDB binding and wrapper for Rust
- raft-rs: The Raft distributed consensus algorithm implemented in Rust
- grpc-rs: The gRPC library for Rust built on the gRPC C Core library and Rust Futures
- fail-rs: Fail points for Rust
Communication within the TiKV community abides by TiKV Code of Conduct. Here is an excerpt:
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.
- Blog
- Post questions or help answer them on Stack Overflow
Join the TiKV community on Slack - Sign up and join channels on TiKV topics that interest you.
The TiKV community is also available on WeChat, a very popular messaging and social media application in China. If you want to join our WeChat group, send a request mail to [email protected], with your personal information that includes the following:
- WeChat ID (Required)
- PR you submitted to TiKV Repos (Required)
- Other basic information
We will invite you in right away.
TiKV is under the Apache 2.0 license. See the LICENSE file for details.
- Thanks etcd for providing some great open source tools.
- Thanks RocksDB for their powerful storage engines.
- Thanks rust-clippy. We do love the great project.