麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > 綜合 > 正文

TiDB 官方設計文檔翻譯(二)

2024-07-21 02:52:54
字體:
來源:轉載
供稿:網友

這個系列共三篇譯文: TiDB 官方設計文檔翻譯(一) TiDB 官方設計文檔翻譯(二) TiDB 官方設計文檔翻譯(三)

原文: https://pingcap.github.io/blog/2016/10/17/how-we-build-tidb/

5 如何開發

在本節中,將介紹TiKV和TiDB的架構和核心技術。

5.1 架構

這里寫圖片描述

關于TiKV架構,讓我們從下往上看。

最底層,RocksDB。上一層,Raft KV,是一個分布式層。MVCC,Multiversion并發控制。 我相信很多人都熟悉MVCC。 TiKV是一個多版本的數據庫。 MVCC使我們能夠支持無鎖讀取和ACID事務。事務層:事務模型的靈感來自Google的Percolator。 它主要是一個優化的兩階段提交協議。 此模型依靠時間戳分配器為每個事務分配單調遞增時間戳,因此可以檢測沖突。 稍后會詳細說明。KV API:它是一組編程接口,并允許開發人員put或get數據。Placement 驅動程序:Placement 驅動程序是非常重要的部分,它有助于實現地理復制,水平伸縮和分布式事務。 它是集群的大腦。

這里寫圖片描述

關于TiDB架構:

MySQL客戶端:頂層是一系列MySQL客戶端。 這些客戶端向下一層發送請求。 你仍然可以使用任何你已經熟悉的MySQL驅動程序。負載均衡器:這是一個可選層。 如HAPRoxy或LVS。TiDB服務器:它是無狀態的,客戶端可以連接到任何TiDB服務器。 在TiDB服務器中,頂層是MySQL協議,它提供MySQL協議支持; 下一層是SQL優化器,用于將MySQL請求翻譯為TiDB SQL。底層是KV API和分布式SQL API(DistSQL API)。 如果底層存儲引擎支持協處理器,TiDB SQL Layer將使用DistSQL API,這比KV API高效得多。 TiDB支持可插拔存儲引擎。 我們建議TiKV作為默認存儲引擎。

5.2 TiKV核心技術

讓我們來看看TiKV核心技術。

我們構建TiKV作為分布式鍵值層以存儲數據。

5.2.1 TiKV軟件堆棧

讓我們來看看軟件堆棧。

這里寫圖片描述

首先,我們可以看到有一個客戶端連接到TiKV。 我們還有幾個TiKV節點。 在每個節點內,有一個store存儲在物理磁盤。 在每個store里面有很多region。 region是數據移動的基本單位,根據Raft協議進行復制。 每個Region都復制到幾個節點。 Raft Group由一個Region的副本組成。 Region更像是一個邏輯概念,在單個store中,許多Region可能共享相同的Rocksdb實例。

5.2.2 Placement Driver

關于Placement Driver,這個概念來自Google Spanner的原始文件。 它提供了整個集群的信息。 它有以下職責:

存儲元數據:客戶端有每個Region的位置信息的緩存。維護復制約束,默認情況下為3個副本。處理數據移動從而實現。 當Placement Driver注意到負載太高時,它將重新平衡數據或使用Raft轉移領導權。

感謝Raft,Placement Driver也是一個高可用的集群。

5.2.3 Raft

在TiKV中,我們使用Raft進行縮放和復制。 我們有多個Raft組。 工作負載分布在多個region。 在一個大集群中可能有數百萬個region。 一旦region太大,它將被分裂成兩個較小的區域,就像細胞分裂。

下面我將展示橫向擴容的過程。

這里寫圖片描述

如上圖所示,我們有4個節點,即節點A,節點B,節點C和節點D。還有3個Region,Region1,Region2和Region3。節點A上有3個Region。

為了平衡數據,需要添加一個新節點,節點E。第一步是將領導權從節點A上的Region1的副本傳輸到節點B上的副本。

這里寫圖片描述

第二步,給節點E添加Region1的副本

這里寫圖片描述

第三步,從節點A中刪除Region1的副本。

這里寫圖片描述

現在數據是平衡的,集群從4個節點擴展到5個節點。

這就是TiKV如何擴容。 讓我們看看它如何處理自動故障轉移。

5.2.4 MVCC

每個事務在此事務的開始時間看到數據庫的快照。 在事務提交之前,其他事務將不會看到此事務所做的任何更改。數據使用以下格式的版本標記:Key_version:value。MVCC還確保無鎖快照讀取。

5.2.5 事務

這些是事務API。 作為一個程序員,我想編寫如下代碼:

txn := store.Begin() // start a transactiontxn.Set([]byte("key1"), []byte("value1"))txn.Set([]byte("key2"), []byte("value2"))err = txn.Commit() // commit transactionif err != nil {txn.Rollback()}

說到事務,它主要是一個優化過的兩階段提交協議。 在事務模型中,有3個列族,即cf:lock,cf:write和cf:data。

cf:lock:未提交的事務正在寫此單元格,并包含主鎖的位置/指針。 對于每個事務,我們選擇一個主鎖來指示事務的狀態。cf:write:它存儲數據的提交時間戳cf:data:存儲數據本身

讓我們看一個例子:Bob想要給Joe轉7美元。

初始狀態:Joe有2美元,Bob有10美元。

這里寫圖片描述

轉賬事務通過寫入lock列鎖定Bob的帳戶開始。 此鎖是事務的主鎖。 事務將開始時間戳7寫入數據。

這里寫圖片描述

事務現在鎖定Joe的帳戶,并寫入Joe的新余額。 鎖是事務的二級鎖,并包含對主鎖的引用; 所以我們可以使用這個二級鎖找到主鎖。

這里寫圖片描述

事務現在已達到提交點:刪除主鎖,并在新時間戳(提交時間戳)8處用寫記錄替換它。寫記錄包含指向存儲數據的時間戳的指針。 將來讀行“Bob”中的列“bal”將看到值$ 3。

這里寫圖片描述

通過添加寫記錄并在次要單元刪除鎖來完成事務。 在這種情況下,只有“Joe”一行。(譯者注:這里數字應該是寫錯了,變成轉賬4美元了,領會原作者的核心意思就好)

這里寫圖片描述

下面是事務完成時的樣子

這里寫圖片描述

說明 如有轉載,請注明出處 http://blog.csdn.net/antony9118/article/details/60470115


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 日韩精品久久久久久 | 成人午夜网址 | 免费黄色在线电影 | 久久久久久久久久久久免费 | 亚洲国产美女视频 | 欧美精品一区二区久久 | 91av视频大全 | 欧美在线观看视频一区二区 | 欧产日产国产精品v | 黄色电影免费提供 | 亚洲国产高清视频 | 亚洲视色 | 99精品电影 | av噜噜噜噜 | 一级黄色免费观看视频 | 亚洲电影免费观看国语版 | 亚洲成人精品一区二区 | 国产精品hd免费观看 | 亚洲精品午夜国产va久久成人 | 中文在线免费观看 | 成人毛片免费视频 | 精品国产一区二区亚洲人成毛片 | 一分钟免费观看完整版电影 | 久草视频在线看 | 操嫩草| 国产三级在线观看a | 亚洲国产高清自拍 | 韩国一大片a毛片 | 女人裸体让男人桶全过程 | 午夜视频在线 | 狠狠久久伊人中文字幕 | 久久国产精品二区 | 亚洲免费片 | 黄色影院在线 | 精品国产一区二区三区久久久狼牙 | 日韩欧美中文字幕视频 | 91在线色 | 狠狠干最新网址 | 久久久久二区 | 久久人人爽人人爽人人片av免费 | 精品久久久久久亚洲精品 |