TiDB 總結

TiDB

tidb和mysql幾乎完全兼容,所以我們的程序沒有任何改動就能完成數據庫從mysql到TiDb的轉換,TiDB是一個分佈式NewSQL數據庫。它支持水平彈性擴展、ACID 事務、標準 SQL、MySQL 語法和 MySQL協議,具有數據強一致的高可用特性,是一個不僅適合 OLTP 場景還適合 OLAP 場景的混合數據庫。

SQL、NoSQL和NewSQL

單機數據庫: MySQL、PostgreSQL

存儲

數據庫最根本的功能是能把數據存下來。

TiKV – Key-Value存儲

特點:

  1. 這是一個巨大的 Map,也就是存儲的是 Key-Value pair
  2. 這個 Map 中的 Key-Value pair 按照 Key 的二進制順序有序,也就是我們可以 Seek 到某一個 Key 的位置,然後不斷的調用 Next 方法以遞增的順序獲取比這個 Key 大的 Key-Value

RocksDB

TiKV 沒有選擇直接向磁盤上寫數據,而是把數據保存在 RocksDB 中,具體的數據落地由 RocksDB 負責。

原因:開發一個單機存儲引擎工作量很大…。

Raft

TiKV 利用 Raft 來做數據複製,每個數據變更都會落地爲一條 Raft 日誌,通過 Raft 的日誌複製功能,將數據安全可靠地同步到 Group 的多數節點中。

保證單機失效的情況下,數據不丟失,不出錯!把數據複製到多臺機器上,這樣一臺機器掛了,我們還有其他的機器上的副本;複雜來說,我們還需要這個複製方案是可靠、高效並且能處理副本失效的情況。

Raft是一個一致性協議,功能:Leader 選舉、成員變更、日誌複製。

Region

實現存儲的水平擴展,我們需要將數據分散在多臺機器上。(分佈式)

將數據分散在多臺機器上有兩種比較典型的方案:一種是按照 Key 做 Hash,根據 Hash 值選擇對應的存儲節點;另一種是分 Range,某一段連續的 Key 都保存在一個存儲節點上

TiKV 選擇了第二種方式,將整個 Key-Value 空間分成很多段,每一段是一系列連續的 Key,我們將每一段叫做一個 Region,並且我們會盡量保持每個 Region 中保存的數據不超過一定的大小(這個大小可以配置,目前默認是 64mb)。每一個 Region 都可以用 StartKey 到 EndKey 這樣一個左閉右開區間來描述。

  1. 數據按照 Key 切分成很多 Region,每個 Region 的數據只會保存在一個節點上面。
  2. TiKV 是以 Region 爲單位做數據的複製,也就是一個 Region 的數據會保存多個副本(Replica)。Replica 之間是通過 Raft 來保持數據的一致。一個 Region 的多個 Replica 會保存在不同的節點上,構成一個 Raft Group。其中一個 Replica 會作爲這個 Group 的 Leader,其他的 Replica 作爲 Follower。所有的讀和寫都是通過 Leader 進行,再由 Leader 複製給 Follower。

MVCC多版本控制

TiKV 的 MVCC 實現是通過在 Key 後面添加 Version 來實現多版本控制

Key1 -> Value
Key2 -> Value
……
KeyN -> Value

改後->

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
……

注意,對於同一個 Key 的多個版本,我們把版本號較大的放在前面,版本號小的放在後面(回憶一下 Key-Value 一節我們介紹過的 Key 是有序的排列),這樣當用戶通過一個 Key + Version 來獲取 Value 的時候,可以將 Key 和 Version 構造出 MVCC 的 Key,也就是 Key-Version。然後可以直接 Seek(Key-Version),定位到第一個大於等於這個 Key-Version 的位置。

事務

TiKV 的事務採用樂觀鎖,事務的執行過程中,不會檢測寫寫衝突,只有在提交過程中,纔會做衝突檢測,衝突的雙方中比較早完成提交的會寫入成功,另一方會嘗試重新執行整個事務。當業務的寫入衝突不嚴重的情況下,這種模型性能會很好,比如隨機更新表中某一行的數據,並且表很大。但是如果業務的寫入衝突嚴重,性能就會很差,舉一個極端的例子,就是計數器,多個客戶端同時修改少量行,導致衝突嚴重的,造成大量的無效重試。

計算

存儲

參考文檔-存儲
參考文檔-計算
參考文檔-調度

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章