天天看點

TiDB分布式資料庫

概述

TiDB 是 PingCAP 公司設計的開源分布式資料庫,結合了傳統的 RDBMS 和 NoSQL 的最佳特性。TiDB 相容 MySQL,支援無限的水準擴充,具備強一緻性和高可用性

TIDB架構圖

TiDB分布式資料庫

TiDB 特性:

  1. 高度相容mysql
  2. 水準彈性擴充,通過簡單地增加新節點即可實作 TiDB 的水準擴充,按需擴充吞吐或存儲,輕松應對高并發、海量資料場景。
  3. 分布式事務,支援标準的 ACID 事務(原子性(Atomicity),一緻性(Consistency),隔離性(Isolation)持久性(Durability))
  4. 真正金融級高可用,基于 Raft 的多數派選舉協定可以提供金融級的 100% 資料強一緻性保證,且在不丢失大多數副本的前提下,可以實作故障的自動恢複 (auto-failover),無需人工介入
  5. TiDB 的設計目标是 100% 的 OLTP 場景和 80% 的 OLAP 場景

TIDB叢集元件TIDB,TIKV ,PD

TiDB Server

負責接收 SQL 請求,處理 SQL 相關的邏輯,并通過 PD 找到存儲計算所需資料的 TiKV 位址,與 TiKV 互動擷取資料,最終傳回結果。 TiDB Server 是無狀态的,其本身并不存儲資料,隻負責計算,可以無限水準擴充,可以通過負載均衡元件(如LVS、HAProxy 或 F5)對外提供統一的接入位址

PD Server

是整個叢集的管理子產品,其主要工作有三個: 一是存儲叢集的元資訊(某個 Key 存儲在哪個 TiKV 節點);二是對 TiKV 叢集進行排程和負載均衡(如資料的遷移、Raft group leader 的遷移等);三是配置設定全局唯一且遞增的事務 ID

TiKV

TiKV Server 負責存儲資料,資料以什麼樣的形式儲存下來。TiKV 的選擇是 Key-Value 模型,并且提供有序周遊方法,那麼資料是如何落盤的, TiKV 沒有選擇直接向磁盤上寫資料,而是把資料儲存在 RocksDB 存儲引擎中,具體的資料落地由 RocksDB 負責。為了實作存儲的水準擴充,我們需要将資料分散在多台機器上,将資料分散在多台機器上有兩種比較典型的方案:一種是按照 Key 做 Hash,根據 Hash 值選擇對應的存儲節點;另一種是分 Range,某一段連續的 Key 都儲存在一個存儲節點上。TiKV 選擇了第二種方式,将整個 Key-Value 空間分成很多段,每一段是一系列連續的 Key,我們将每一段叫做一個 Region,以 Region 為機關做 Raft 的複制和成員管理

MVCC

很多資料庫都會實作多版本控制(MVCC),TiKV 也不例外。設想這樣的場景,兩個 Client 同時去修改一個 Key 的 Value,如果沒有 MVCC,就需要對資料上鎖,在分布式場景下,可能會帶來性能以及死鎖問題。 TiKV 的 MVCC 實作是通過在 Key 後面添加 Version 來實作的。

Key1-Version3 -> Value
	Key1-Version2 -> Value
	Key1-Version1 -> Value
	……
	Key2-Version4 -> Value
	Key2-Version3 -> Value
	Key2-Version2 -> Value
	Key2-Version1 -> Value
	……
	KeyN-Version2 -> Value
	KeyN-Version1 -> Value
           

事務

TiKV 的事務采用的是 Percolator 模型,并且做了大量的優化。事務的細節這裡不詳述,大家可以參考論文以及我們的其他文章。這裡隻提一點,TiKV 的事務采用樂觀鎖,事務的執行過程中,不會檢測寫寫沖突,隻有在送出過程中,才會做沖突檢測

沖突的雙方中比較早完成送出的會寫入成功,另一方會嘗試重新執行整個事務