From 443e0d043aa7b8b1ac8534f68b5b8cfc37e40b60 Mon Sep 17 00:00:00 2001 From: Zhang Jian Date: Wed, 1 Jul 2020 17:38:24 +0800 Subject: [PATCH 1/4] add tikv overview --- TOC.md | 2 ++ media/tikv-arch.png | Bin 0 -> 43653 bytes tikv-overview.md | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 media/tikv-arch.png create mode 100644 tikv-overview.md diff --git a/TOC.md b/TOC.md index d06064b0dbab1..879dfad943355 100644 --- a/TOC.md +++ b/TOC.md @@ -403,6 +403,8 @@ + [MySQL System Variables](/system-variables.md) + [TiDB Specific System Variables](/tidb-specific-system-variables.md) + Storage Engines + + TiKV + + [TiKV Overview](/tikv-overview.md) + TiFlash + [Overview](/tiflash/tiflash-overview.md) + [Use TiFlash](/tiflash/use-tiflash.md) diff --git a/media/tikv-arch.png b/media/tikv-arch.png new file mode 100644 index 0000000000000000000000000000000000000000..7272faf31e018c8698617f61c793ab63b616eeda GIT binary patch literal 43653 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 Date: Mon, 6 Jul 2020 23:13:54 +0800 Subject: [PATCH 2/4] Update tikv-overview.md --- tikv-overview.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tikv-overview.md b/tikv-overview.md index 7bd3b7b93c1c1..b10e93323ffef 100644 --- a/tikv-overview.md +++ b/tikv-overview.md @@ -9,28 +9,28 @@ TiKV is a distributed and transactional key-value database, which provides trans ## Architecture Overview -TiKV is a distributed Key-Value database which is based on the design of Google Spanner. TiKV implements the multiple raft-group replica mechanism. Region is the basic unit of Key-Value data movement and corresponds to a data range in a Store. Each Region is replicated to multiple nodes. These multiple replicas form a Raft group. A replica of a Region is called a Peer. Typically there are 3 peers in a Region. One of them is the leader, which provides the read and write services. Region is the basic data movement unit, the PD balances all the Regions automatically to guarantee that the read and write throughput is balanced among all the nodes in the TiKV cluster. With PD and carefully designed Raft groups, TiKV excels in horizontal scalability and can easily scale to 100+ TBs of data. +TiKV is a distributed Key-Value database which is based on the design of Google Spanner. TiKV implements the multi-raft-group replica mechanism. The Region is the basic unit of the Key-Value data movement and corresponds to a data range in a Store. Each Region is replicated to multiple nodes. These multiple replicas form a Raft group. A replica of a Region is called a Peer. Typically there are 3 peers in a Region. One of them is the leader, which provides the read and write services. The Region is the basic data movement unit, the PD balances all the Regions automatically to guarantee that the read and write throughput is balanced among all the nodes in the TiKV cluster. With PD and carefully designed Raft groups, TiKV excels in horizontal scalability and can easily scale to 100+ TBs of data. ![TiKV Architecture](/media/tikv-arch.png) ### Region and RocksDB There is a RocksDB database within each store and it stores data into the local disk. All the Region data are stored in the same RocksDB in each store. All the logs used for the Raft consensus algorithm is stored in another RocksDB in each store. This is because the performance of sequential I/O is -better than random I/O. With different RocksDB for raftlog and Region data, TiKV can combine all the data write operation of raft log and TiKV regions into one I/O operation to improve the performance. +better than random I/O. With different RocksDB for raft log and Region data, TiKV can combine all the data write operation of raft log and TiKV regions into one I/O operation to improve the performance. ### Region and Raft Consensus Algorithm -Data consistency between replicas of a Region is guaranteed by the Raft Consensus Algorithm. Only the leader of the Region can provid the write service, only when the data is written to the majority replicated of a Region, the write operation is succeed. +Data consistency between replicas of a Region is guaranteed by the Raft Consensus Algorithm. Only the leader of the Region can provide the writing service, only when the data is written to the majority replicated of a Region, the write operation succeeds. -When the size of a certain Region exceed a threshold, which is 144 MB by default, TiKV splits it to two of more Regions. This operation guarantees the size of all the Regions in the cluster are nearly the same. It helps the PD to balance Regions among nodes in a TiKV cluster. When the size of a certain Region is smaller than a threshold, TiKV merges the two smaller adjacent Regins into one Region. +When the size of a certain Region exceeds a threshold, which is 144 MB by default, TiKV splits it to two or more Regions. This operation guarantees the size of all the Regions in the cluster is nearly the same. It helps the PD to balance Regions among nodes in a TiKV cluster. When the size of a certain Region is smaller than a threshold, TiKV merges the two smaller adjacent Regions into one Region. When PD moves a replica from one TiKV to another, it firstly adds a Learner replica on the destination node, after the data in Follower replica is nearly the same with the Leader replica, PD changes it to the Follower replica and removes the replica on the source node. -Moving Leader replica from one node to another follows nearly the same mechanism, the difference is, after the Learner replica becomes the Follower replica, there is operation to transfer Leader from the source node to the destination node. Finanly the new Leader removes the old replica in the source node. +Moving Leader replica from one node to another follows nearly the same mechanism, the difference is, after the Learner replica becomes the Follower replica, there is an operation to transfer Leader from the source node to the destination node. Finally, the new Leader removes the old replica in the source node. ## Distributed Transaction -TiKV supports distributed transaction. Users can write multiple key-value pairs without worrying about whether they belong to the same Region. TiKV uses two phase commit to achive the ACID constraints, see [TiDB Optimistic Transaction Model](/optimistic-transaction.md) for details. +TiKV supports distributed transactions. Users can write multiple key-value pairs without worrying about whether they belong to the same Region. TiKV uses two-phase commit to achieve the ACID constraints, see [TiDB Optimistic Transaction Model](/optimistic-transaction.md) for details. ## TiKV Coprocessor From c17ff1cfa572dbb5d8e4e4aecc2fb89a448bb8f7 Mon Sep 17 00:00:00 2001 From: Zhang Jian Date: Mon, 13 Jul 2020 17:41:49 +0800 Subject: [PATCH 3/4] Apply suggestions from code review Co-authored-by: Keke Yi <40977455+yikeke@users.noreply.github.com> --- tikv-overview.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tikv-overview.md b/tikv-overview.md index b10e93323ffef..69e0174215143 100644 --- a/tikv-overview.md +++ b/tikv-overview.md @@ -5,33 +5,33 @@ category: reference # TiKV Overview -TiKV is a distributed and transactional key-value database, which provides transactional APIs with ACID compliance. With the implementation of the [Raft consensus algorithm](https://raft.github.io/raft.pdf) and consensus state stored in RocksDB, TiKV guarantees data consistency between multiple replicas and high availability. As the storage layer of the TiDB distributed database, it provides the read and write service, and persist the written data from applications. It also stores the statistic data of the TiDB cluster. +TiKV is a distributed and transactional key-value database, which provides transactional APIs with ACID compliance. With the implementation of the [Raft consensus algorithm](https://raft.github.io/raft.pdf) and consensus state stored in RocksDB, TiKV guarantees data consistency between multiple replicas and high availability. As the storage layer of the TiDB distributed database, TiKV provides the read and write service, and persist the written data from applications. It also stores the statistics data of the TiDB cluster. ## Architecture Overview -TiKV is a distributed Key-Value database which is based on the design of Google Spanner. TiKV implements the multi-raft-group replica mechanism. The Region is the basic unit of the Key-Value data movement and corresponds to a data range in a Store. Each Region is replicated to multiple nodes. These multiple replicas form a Raft group. A replica of a Region is called a Peer. Typically there are 3 peers in a Region. One of them is the leader, which provides the read and write services. The Region is the basic data movement unit, the PD balances all the Regions automatically to guarantee that the read and write throughput is balanced among all the nodes in the TiKV cluster. With PD and carefully designed Raft groups, TiKV excels in horizontal scalability and can easily scale to 100+ TBs of data. +TiKV implements the multi-raft-group replica mechanism based on the design of Google Spanner. A Region is a basic unit of the key-value data movement and refers to a data range in a Store. Each Region is replicated to multiple nodes. These multiple replicas form a Raft group. A replica of a Region is called a Peer. Typically there are 3 peers in a Region. One of them is the leader, which provides the read and write services. The PD component balances all the Regions automatically to guarantee that the read and write throughput is balanced among all the nodes in the TiKV cluster. With PD and carefully designed Raft groups, TiKV excels in horizontal scalability and can easily scale to store more than 100 TBs of data. ![TiKV Architecture](/media/tikv-arch.png) ### Region and RocksDB -There is a RocksDB database within each store and it stores data into the local disk. All the Region data are stored in the same RocksDB in each store. All the logs used for the Raft consensus algorithm is stored in another RocksDB in each store. This is because the performance of sequential I/O is -better than random I/O. With different RocksDB for raft log and Region data, TiKV can combine all the data write operation of raft log and TiKV regions into one I/O operation to improve the performance. +There is a RocksDB database within each Store and it stores data into the local disk. All the Region data are stored in the same RocksDB instance in each Store. All the logs used for the Raft consensus algorithm is stored in another RocksDB instance in each Store. This is because the performance of sequential I/O is +better than random I/O. With different RocksDB instances storing raft logs and Region data, TiKV combines all the data write operations of raft logs and TiKV Regions into one I/O operation to improve the performance. ### Region and Raft Consensus Algorithm -Data consistency between replicas of a Region is guaranteed by the Raft Consensus Algorithm. Only the leader of the Region can provide the writing service, only when the data is written to the majority replicated of a Region, the write operation succeeds. +Data consistency between replicas of a Region is guaranteed by the Raft Consensus Algorithm. Only the leader of the Region can provide the writing service, and only when the data is written to the majority of replicas of a Region, the write operation succeeds. -When the size of a certain Region exceeds a threshold, which is 144 MB by default, TiKV splits it to two or more Regions. This operation guarantees the size of all the Regions in the cluster is nearly the same. It helps the PD to balance Regions among nodes in a TiKV cluster. When the size of a certain Region is smaller than a threshold, TiKV merges the two smaller adjacent Regions into one Region. +When the size of a Region exceeds a threshold, which is 144 MB by default, TiKV splits it to two or more Regions. This operation guarantees the size of all the Regions in the cluster is nearly the same, which helps the PD component to balance Regions among nodes in a TiKV cluster. When the size of a Region is smaller than the threshold, TiKV merges the two smaller adjacent Regions into one Region. -When PD moves a replica from one TiKV to another, it firstly adds a Learner replica on the destination node, after the data in Follower replica is nearly the same with the Leader replica, PD changes it to the Follower replica and removes the replica on the source node. +When PD moves a replica from one TiKV node to another, it firstly adds a Learner replica on the target node, after the data in the Learner replica is nearly the same as that in the Leader replica, PD changes it to a Follower replica and removes the Follower replica on the source node. -Moving Leader replica from one node to another follows nearly the same mechanism, the difference is, after the Learner replica becomes the Follower replica, there is an operation to transfer Leader from the source node to the destination node. Finally, the new Leader removes the old replica in the source node. +Moving Leader replica from one node to another has a similar mechanism. The difference is that after the Learner replica becomes the Follower replica, there is a "Leader Transfer" operation in which the Follower replica actively proposes an election to elect itself as the Leader. Finally, the new Leader removes the old Leader replica in the source node. ## Distributed Transaction -TiKV supports distributed transactions. Users can write multiple key-value pairs without worrying about whether they belong to the same Region. TiKV uses two-phase commit to achieve the ACID constraints, see [TiDB Optimistic Transaction Model](/optimistic-transaction.md) for details. +TiKV supports distributed transactions. Users (or TiDB) can write multiple key-value pairs without worrying about whether they belong to the same Region. TiKV uses two-phase commit to achieve ACID constraints. See [TiDB Optimistic Transaction Model](/optimistic-transaction.md) for details. ## TiKV Coprocessor -TiDB pushes some data computation logic to TiKV Coprocessor. TiKV Coprocessor processes the computation for each Region. Each request send to TiKV Coprocessor only involves the data of one Region. +TiDB pushes some data computation logic to TiKV Coprocessor. TiKV Coprocessor processes the computation for each Region. Each request sent to TiKV Coprocessor only involves the data of one Region. From 3cb811a2164c38a612e22beb88b4c81c8b2287e6 Mon Sep 17 00:00:00 2001 From: Keke Yi <40977455+yikeke@users.noreply.github.com> Date: Mon, 13 Jul 2020 17:52:04 +0800 Subject: [PATCH 4/4] remove category meta --- tikv-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tikv-overview.md b/tikv-overview.md index 69e0174215143..df672d12aed81 100644 --- a/tikv-overview.md +++ b/tikv-overview.md @@ -1,6 +1,6 @@ --- title: TiKV Overview -category: reference +summary: An overview of the TiKV storage engine. --- # TiKV Overview