這段時間學習了tidb,現抽空整理了一下。
tidb 主要分三部分: tidb servers(sql 層)、pd servers、tikv cluster(即儲存引擎層)
tidb 儲存的資料報括三部分:表的元資料,表的row,索引資料。對於 index,tidb 不止需要支援 primary index,還需要支援 secondary index。tidb 對每個表分配乙個 tableid,每乙個索引都會分配乙個 indexid,每一行分配乙個 rowid(如果表有整數型的 primary key,那麼會用 primary key 的值當做 rowid),其中 tableid 在整個集群內唯一,indexid/rowid 在表內唯一,這些 id 都是 int64 型別。
元資料按照如下規則進行編碼成 key-value pair:
key: tableprefix_recordprefixsepunique index key-value pair:value: [col1, col2...]
key: tableprefix_indexprefixsep_indexedcolumnsvalue非 unique index key-value pair:value: rowid
key: tableprefix_indexprefixsep_indexedcolumnsvalue_rowid傳統資料提速方法包括:mpp和smpvalue: null
scheme非同步變更
謂詞下推
使用者的 sql 請求會直接或者通過 load balancer 傳送到 tidb-server,tidb-server 會解析 mysql protocol packet,獲取請求內容,然後做語法解析、查詢計畫制定和優化、執行查詢計畫獲取和處理資料。資料全部儲存在 tikv 集群中,所以在這個過程中 tidb-server 需要和 tikv-server 互動,獲取資料。最後 tidb-server 需要將查詢結果返回給使用者。
tikv集群架構示意圖:
事務層:事務模型的靈感來自google的percolator。 它主要是乙個優化的兩階段提交協議。 此模型依靠時間戳分配器為每個事務分配單調遞增時間戳,因此可以檢測衝突。 稍後會詳細說明。
tikv 記住兩點:
這是乙個巨大的 map,也就是儲存的是 key-value pair
這個 map 中的 key-value pair 按照 key 的二進位制順序有序,也就是我們可以 seek 到某乙個 key 的位置,然後不斷的呼叫 next 方法以遞增的順序獲取比這個 key 大的 key-value
raft 協議(後面會專門寫)
rocksdb 引擎
region概念的引入(模擬redis的slots),一種是按照 key 做 hash,根據 hash 值選擇對應的儲存節點;另一種是分 range,某一段連續的 key 都儲存在乙個儲存節點上。tikv選擇第二種。
mvcc 併發多版本控制,lock-free 概念, data gc(覆蓋的方法)
收集每個節點的狀態、每個 raft group 的資訊、業務訪問操作的統計等;其次需要設定一些策略,pd 根據這些資訊以及排程的策略,制定出盡量滿足前面所述需求的排程計畫;最後需要一些基本的操作,來完成排程計畫。
Android App整體架構
本文是對我在知乎乙個回答的整理,其中的內容大多是對我平時的閱讀和實踐的總結,希望對android的開發者有所幫助。但畢竟是個人的一些思考,難免有疏漏,也歡迎對本文的內容提出建議。模型層 model 中的整體 量是最大的,一般由大量的package組成,針對這部分需要做的就是在程式設計的過程中,做好模...
spring 整體架構
1.core container 核心容器 core 包含spring框架的核心工具類 beans 包含訪問配置檔案 建立和管理bean 以及進行ioc di 相關操作的所有類 context 整合beans為spring框架提供大量的擴充套件 expression language 提供表示式語言...
索引整體架構
lucene將索引文件的過程設計成兩個階段,寫入記憶體階段和寫入硬碟階段。在寫入記憶體階段,lucene通過indexchain把document分解並把相關資訊儲存到記憶體中,等到滿足flush條件 記憶體容量或者文件個數積累到臨界值 就通過indexchain把記憶體中的資料寫入硬碟。index...