《轉(zhuǎn)》TiKV & TiDB相關(guān)筆記

github <tidb-in-action>

一、TiKV存儲(chǔ)

簡(jiǎn)述

  • 通過(guò)單機(jī)的 RocksDB供鸠,TiKV 可以將數(shù)據(jù)快速地存儲(chǔ)在磁盤(pán)上杖玲;通過(guò) Raft,將數(shù)據(jù)復(fù)制到多臺(tái)機(jī)器上侥袜,以防單機(jī)失效骇窍。數(shù)據(jù)的寫(xiě)入是通過(guò) Raft 這一層的接口寫(xiě)入雌团,而不是直接寫(xiě) RocksDB旗唁。通過(guò)實(shí)現(xiàn) Raft,TiKV 變成了一個(gè)分布式的 Key-Value 存儲(chǔ)身腻,少數(shù)幾臺(tái)機(jī)器宕機(jī)也能通過(guò)原生的 Raft 協(xié)議自動(dòng)把副本補(bǔ)全雄坪,繼續(xù)讓業(yè)務(wù)無(wú)感知的對(duì)外服務(wù)厘熟。

Region

將整個(gè) Key-Value 空間分成很多段,每一段是一系列連續(xù)的 Key维哈,將每一段叫做一個(gè) Region绳姨,并且會(huì)盡量保持每個(gè) Region 中保存的數(shù)據(jù)不超過(guò)一定的大小,目前在 TiKV 中默認(rèn)是 96MB阔挠。每一個(gè) Region 都可以用 [StartKey飘庄,EndKey) 這樣一個(gè)左閉右開(kāi)區(qū)間來(lái)描述。

  1. 以 Region 為單位购撼,將數(shù)據(jù)分散在集群中所有的節(jié)點(diǎn)上跪削,并且盡量保證每個(gè)節(jié)點(diǎn)上服務(wù)的 Region 數(shù)量差不多
  2. 以 Region 為單位做 Raft(數(shù)據(jù)) 的復(fù)制和成員管理:一個(gè) Region 的多個(gè) Replica 會(huì)保存在不同的節(jié)點(diǎn)上,構(gòu)成一個(gè) Raft Group迂求。其中一個(gè) Replica 會(huì)作為這個(gè) Group 的 Leader碾盐,其他的 Replica 作為 Follower。所有的讀和寫(xiě)都是通過(guò) Leader 進(jìn)行揩局,(寫(xiě))再由 Leader 復(fù)制給 Follower毫玖。

MVCC(多版本并發(fā)控制)

TiKV 的 MVCC 實(shí)現(xiàn)是通過(guò)在 Key 后面添加版本號(hào)來(lái)實(shí)現(xiàn)×瓒ⅲ可以直接通過(guò) RocksDB 的 API: SeekPrefix(Key-Version)付枫,定位到第一個(gè)大于等于這個(gè) Key_Version 的位置。

分布式 ACID 事務(wù)

TiKV 的事務(wù)采用的是 Google 在 BigTable 中使用的事務(wù)模型:Percolator
能保證要么全部成功十气,要么全部失敗,不會(huì)出現(xiàn)的中間狀態(tài)和臟數(shù)據(jù)春霍。

二砸西、TiDB如何使用TiKV

問(wèn)題:如何存儲(chǔ)數(shù)據(jù)?哪些作為key址儒,哪些作為value芹枷?
對(duì)于一個(gè) Table 來(lái)說(shuō),需要存儲(chǔ)的數(shù)據(jù)包括三部分:

  1. 表中每一行的數(shù)據(jù)莲趣,以下簡(jiǎn)稱(chēng)表數(shù)據(jù)
  2. 表中所有索引的數(shù)據(jù)鸳慈,以下簡(jiǎn)稱(chēng)索引數(shù)據(jù)
  3. 表的元信息
    對(duì)于表中每一行的數(shù)據(jù),既可以選擇行存也可以選擇列存喧伞,兩者各有優(yōu)缺點(diǎn)走芋,適用不同場(chǎng)景绩郎。
    TiDB 的首要目標(biāo)是 OLTP 業(yè)務(wù),要滿(mǎn)足這類(lèi)業(yè)務(wù)的需求翁逞,數(shù)據(jù)庫(kù)需要支持快速的針對(duì)單行或者某些行的增肋杖、刪、改挖函、查等操作状植,所以 TiKV 的行存是比較合適該場(chǎng)景的。
    從 TiDB 3.1 開(kāi)始(包括 TiDB 4.0)怨喘,為了能夠滿(mǎn)足用戶(hù)復(fù)雜的實(shí)時(shí)分析場(chǎng)景(OLAP津畸?),TiDB 提供了一個(gè)叫做** TiFlash 的列存引擎**必怜,它提供了列式的存儲(chǔ)模式和快速的分析能力肉拓。列存的映射關(guān)系比較簡(jiǎn)單,這里暫且不表棚赔。

2.1 索引

索引數(shù)據(jù)帝簇,TiDB 同時(shí)支持主鍵和二級(jí)索引(包括唯一索引和非唯一索引)。在 OLTP 場(chǎng)景下靠益,好的索引能夠極大的提升 SQL 查詢(xún)的性能丧肴,降低集群的整體負(fù)載。

  1. 對(duì)于 Insert 語(yǔ)句胧后,既需要將表數(shù)據(jù)寫(xiě)入 KV 存儲(chǔ)芋浮,也需要構(gòu)造和存儲(chǔ)對(duì)應(yīng)的索引數(shù)據(jù)。
  2. 對(duì)于 Update 語(yǔ)句壳快,需要在更新表數(shù)據(jù)的同時(shí)纸巷,也更新對(duì)應(yīng)的索引數(shù)據(jù)(如果有必要的話(huà))。
  3. 對(duì)于 Delete 語(yǔ)句眶痰,需要在刪除表數(shù)據(jù)的同時(shí)瘤旨,也刪除對(duì)應(yīng)的索引數(shù)據(jù)(如果有必要的話(huà))。
  4. 對(duì)于 Select 語(yǔ)句竖伯,情況會(huì)復(fù)雜一些存哲。用戶(hù)希望數(shù)據(jù)庫(kù)提供快速讀取一行數(shù)據(jù)的能力,所以每行表數(shù)據(jù)最好有一個(gè)唯一 ID (顯示或隱式的 ID)方便快速讀取七婴。其次用戶(hù)也可能會(huì)連續(xù)地讀取多行數(shù)據(jù)祟偷,比如 select * from user。最后還有通過(guò)索引讀取數(shù)據(jù)的需求打厘,對(duì)索引的使用可能是基于唯一索引或者主鍵的等值查詢(xún)(業(yè)界常說(shuō)的“點(diǎn)查”)或者是范圍查詢(xún)修肠。
    當(dāng)然,在有了 TiFlash 以后户盯,全表掃更適合在 TiFlash 上進(jìn)行嵌施,因?yàn)榱惺酱鎯?chǔ)的優(yōu)勢(shì)饲化,這種場(chǎng)景中它能提供更快的讀取性能。

2.1.1 行數(shù)據(jù)的key設(shè)計(jì)

TiDB會(huì)為全集群生成唯一表ID艰管,為表內(nèi)數(shù)據(jù)生成唯一的行ID(有整型主鍵則是主鍵作為行ID)滓侍,則數(shù)據(jù)如下:

Key:   tablePrefix{TableID}_recordPrefixSep{RowID}
Value: [col1, col2, col3, col4]

2.1.2 索引數(shù)據(jù)的 Key-Value 映射關(guān)系

TiDB 為表中每個(gè)索引分配了一個(gè)索引 ID,其中:
對(duì)于需要滿(mǎn)足唯一性約束的主鍵或者唯一索引牲芋,按照如下規(guī)則編碼成 (Key, Value) 鍵值對(duì):

Key:   tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue
Value: RowID

對(duì)于不需要滿(mǎn)足唯一性約束的普通二級(jí)索引撩笆,按照如下規(guī)則編碼成 (Key, Value) 鍵值對(duì):

Key:   tablePrefix{TableID}_indexPrefixSep{IndexID}_indexedColumnsValue_{RowID}
Value: null

2.2 元數(shù)據(jù)

另外存儲(chǔ)于某個(gè)key中,將元信息編碼后存儲(chǔ)

2.3 SQL 層簡(jiǎn)介

TiDB 的 SQL層缸浦,即tidb-server夕冲,負(fù)責(zé)將 SQL 翻譯成 KV 操作,轉(zhuǎn)發(fā)給共享的分布式 KV 存儲(chǔ)層 TiKV裂逐,并組裝返回結(jié)果歹鱼,最終返回查詢(xún)結(jié)果。
舉例:select count(*) from user where name='test'卜高,像這樣一句語(yǔ)句弥姻,如果將數(shù)據(jù)返回到tiDB進(jìn)行過(guò)濾、計(jì)數(shù)會(huì)浪費(fèi)網(wǎng)絡(luò)IO和無(wú)意義計(jì)算掺涛⊥ザ兀可以將這類(lèi)操作下放到tiKV,粗略描述如下圖:

image

實(shí)際流程較復(fù)雜:

image

用戶(hù)的 SQL 請(qǐng)求會(huì)直接或者通過(guò)Load Balancer發(fā)送到 tidb-server薪缆,tidb-server 會(huì)解析MySQL Protocol Packet秧廉,獲取請(qǐng)求內(nèi)容,然后做語(yǔ)法解析拣帽、查詢(xún)計(jì)劃制定和優(yōu)化疼电、執(zhí)行查詢(xún)計(jì)劃獲取和處理數(shù)據(jù)。數(shù)據(jù)全部存儲(chǔ)在 TiKV 集群中减拭,所以在這個(gè)過(guò)程中 tidb-server 需要和 TiKV 交互蔽豺,獲取數(shù)據(jù)。最后 tidb-server 需要將查詢(xún)結(jié)果返回給用戶(hù)拧粪。

三修陡、關(guān)于調(diào)度

在這兩個(gè)組件的后面,還有一個(gè)叫做 PD(Placement Driver)的組件既们,雖然不直接和業(yè)務(wù)接觸濒析,但是這個(gè)組件是整個(gè)集群的核心正什,負(fù)責(zé)全局元信息的存儲(chǔ)以及 TiKV 集群負(fù)載均衡調(diào)度啥纸。

3.1 為什么要進(jìn)行調(diào)度

image

整個(gè)系統(tǒng)是在動(dòng)態(tài)變化,Region 分裂婴氮、節(jié)點(diǎn)加入斯棒、節(jié)點(diǎn)失效盾致、訪(fǎng)問(wèn)熱點(diǎn)變化等情況會(huì)不斷發(fā)生,整個(gè)調(diào)度系統(tǒng)也需要在動(dòng)態(tài)中不斷向最優(yōu)狀態(tài)前進(jìn)荣暮,因此我們需要一個(gè)中心節(jié)點(diǎn)庭惜,來(lái)對(duì)系統(tǒng)的整體狀況進(jìn)行把控和調(diào)整,所以有了 PD 這個(gè)模塊穗酥。

3.2 調(diào)度的需求整理

作為一個(gè)分布式高可用存儲(chǔ)系統(tǒng)护赊,必須滿(mǎn)足:副本數(shù)量不能多也不能少、副本需要分布在不同的機(jī)器上砾跃、新加節(jié)點(diǎn)后可以將其他節(jié)點(diǎn)上的副本遷移過(guò)來(lái)骏啰、節(jié)點(diǎn)下線(xiàn)后需要將數(shù)據(jù)遷移走。
作為一個(gè)良好的分布式系統(tǒng)抽高,需要優(yōu)化:維持整個(gè)集群的 Leader 分布均勻判耕、維持每個(gè)節(jié)點(diǎn)的儲(chǔ)存容量均勻、維持訪(fǎng)問(wèn)熱點(diǎn)分布均勻控制 Balance 的速度翘骂,避免影響在線(xiàn)服務(wù)壁熄;管理節(jié)點(diǎn)狀態(tài),包括手動(dòng)上線(xiàn)/下線(xiàn)節(jié)點(diǎn)碳竟,以及自動(dòng)下線(xiàn)失效節(jié)點(diǎn)草丧。
上述調(diào)度需求看似復(fù)雜,但是整理下來(lái)最終落地的無(wú)非是下面三件事:

  • 增加一個(gè) Replica
  • 刪除一個(gè) Replica
  • 將 Leader 角色在一個(gè) Raft Group 的不同 Replica 之間 transfer瞭亮。
    剛好 Raft 協(xié)議能夠滿(mǎn)足這三種需求方仿,通過(guò) AddReplica、RemoveReplica统翩、TransferLeader 這三個(gè)命令仙蚜,可以支撐上述三種基本操作。

3.3 信息收集

  • 每個(gè) TiKV 節(jié)點(diǎn)(Store)會(huì)定期向 PD 匯報(bào)節(jié)點(diǎn)的整體信息厂汗。
  • 每個(gè) Raft Group 的 Leader 會(huì)定期向 PD 匯報(bào)信息委粉。

3.4 調(diào)度的策略

  • 保障一個(gè) Region 的 Replica 數(shù)量正確:在掉節(jié)點(diǎn)或恢復(fù)節(jié)點(diǎn)時(shí),增刪replica
  • 保障一個(gè) Raft Group 中的多個(gè) Replica 不在同一個(gè)位置: 位置包括物理機(jī)器娶桦、單個(gè)機(jī)架贾节、單個(gè)機(jī)房≈云瑁可以給節(jié)點(diǎn)配置 lables栗涂,需要在 Replica 分配的時(shí)候盡量保證不會(huì)有一個(gè) Region 的多個(gè) Replica 所在結(jié)點(diǎn)有相同的位置標(biāo)識(shí)。
  • 副本在 Store 之間的分布均勻分配:維持每個(gè)節(jié)點(diǎn)上面祈争,副本數(shù)量的均衡斤程,會(huì)使得總體的負(fù)載更均衡。
  • Leader 數(shù)量在 Store 之間均勻分配: Raft 協(xié)議要讀取核寫(xiě)入都通過(guò) Leader 進(jìn)行菩混,所以計(jì)算的負(fù)載主要在 Leader 上面忿墅,PD 會(huì)盡可能將 Leader 在節(jié)點(diǎn)間分散開(kāi)扁藕。
  • 訪(fǎng)問(wèn)熱點(diǎn)數(shù)量在 Store 之間均勻分配:每個(gè) Store 以及 Region Leader 在上報(bào)信息時(shí)攜帶了當(dāng)前訪(fǎng)問(wèn)負(fù)載的信息,比如 Key 的讀取/寫(xiě)入速度疚脐。PD 會(huì)檢測(cè)出訪(fǎng)問(wèn)熱點(diǎn)亿柑,且將其在節(jié)點(diǎn)之間分散開(kāi)。
  • 各個(gè) Store 的存儲(chǔ)空間占用大致相等
  • 控制調(diào)度速度棍弄,避免影響在線(xiàn)服務(wù)

3.5 自動(dòng)伸縮

TiDB 借助 TiDB Operator 和 PD 來(lái)實(shí)現(xiàn) Auto-Scale望薄。目前由 TiDB Operator 組件定期獲取 TiDB / TiKV 的 metrics 信息后,通過(guò) API 的方式暴露出期望的 TiDB/TiKV numbers呼畸,然后由 TiDB Operator 定期拉取 PD API 信息后式矫,通過(guò)內(nèi)部的 Auto-scaling 算法對(duì) TidbCluster.Spec.Replicas 進(jìn)行調(diào)整,從而實(shí)現(xiàn)Auto-scaling役耕。

3.6 動(dòng)態(tài)調(diào)度

3.7 根據(jù)負(fù)載動(dòng)態(tài)分裂 ( Load Base Splitting)

3.8 熱點(diǎn)隔離 (Isolate Frequently Access Region)

四采转、TiDB 和 MySQL 的區(qū)別

TiDB 作為開(kāi)源 NewSQL 數(shù)據(jù)庫(kù)的典型代表之一,同樣支持 SQL瞬痘,支持事務(wù) ACID 特性故慈。
在通訊協(xié)議上,TiDB 選擇與 MySQL 完全兼容框全,并盡可能兼容 MySQL 的語(yǔ)法察绷。
因此,基于 MySQL 數(shù)據(jù)庫(kù)開(kāi)發(fā)的系統(tǒng)津辩,大多數(shù)可以平滑遷移至 TiDB,而幾乎不用修改代碼喘沿。對(duì)用戶(hù)來(lái)說(shuō),遷移成本極低蚜印,過(guò)渡自然。
但仍有少量不兼容窄赋。

作者:陀氏
鏈接:http://www.reibang.com/p/1141be233bb2
來(lái)源:簡(jiǎn)書(shū)
著作權(quán)歸作者所有哟冬。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處忆绰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市翰灾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖预侯,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異峰锁,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)虹蒋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)峭竣,“玉大人,你說(shuō)我怎么就攤上這事皆撩≌芤” “怎么了扛吞?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵荆责,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我盲泛,道長(zhǎng)键耕,這世上最難降的妖魔是什么寺滚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任玛迄,我火速辦了婚禮,結(jié)果婚禮上蓖议,老公的妹妹穿的比我還像新娘讥蟆。我一直安慰自己,他們只是感情好瘸彤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般愕宋。 火紅的嫁衣襯著肌膚如雪玻靡。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,208評(píng)論 1 299
  • 那天中贝,我揣著相機(jī)與錄音,去河邊找鬼邻寿。 笑死绣否,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蒜撮。 我是一名探鬼主播段磨,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼策幼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼浅浮!你這毒婦竟也來(lái)了淮捆?” 一聲冷哼從身側(cè)響起拄显,我...
    開(kāi)封第一講書(shū)人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤舱禽,失蹤者是張志新(化名)和其女友劉穎疾瓮,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡密末,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年物舒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了戏锹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冠胯。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荠察,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悉盆,到底是詐尸還是另有隱情馋吗,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布京髓,位于F島的核電站,受9級(jí)特大地震影響堰怨,放射性物質(zhì)發(fā)生泄漏蛇摸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一赶袄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蒋困,春花似錦、人聲如沸雪标。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至打洼,卻和暖如春逆粹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背僻弹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搔扁,地道東北人爸舒。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓扭勉,卻偏偏與公主長(zhǎng)得像鹊奖,于是被迫代替她去往敵國(guó)和親涂炎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • github <tidb-in-action> 一两蟀、TiKV存儲(chǔ) 簡(jiǎn)述 通過(guò)單機(jī)的 RocksDB震缭,TiKV 可以...
    陀氏閱讀 5,115評(píng)論 0 0
  • 一、分布式數(shù)據(jù)庫(kù)誕生背景 隨著互聯(lián)網(wǎng)的飛速發(fā)展党涕,業(yè)務(wù)量可能在短短的時(shí)間內(nèi)爆發(fā)式地增長(zhǎng)巡社,對(duì)應(yīng)的數(shù)據(jù)量可能快速地從幾百...
    nightwish夜愿閱讀 3,522評(píng)論 0 12
  • 一、TiDB 簡(jiǎn)介 TiDB[https://docs.pingcap.com/zh/tidb/v4.0] 是一款...
    小道蕭兮閱讀 760評(píng)論 0 3
  • 為什么要進(jìn)行調(diào)度 先回憶一下第一篇文章提到的一些信息肥荔,TiKV 集群是 TiDB 數(shù)據(jù)庫(kù)的分布式 KV 存儲(chǔ)引擎绿渣,...
    hiekay閱讀 2,274評(píng)論 0 1
  • 在進(jìn)入正題之前怯晕,先來(lái)思考下跨節(jié)點(diǎn)的數(shù)據(jù)如何實(shí)現(xiàn)同進(jìn)退(ACID),如果對(duì)分布式事務(wù)本身有一定了解可跳過(guò)這里舟茶。如圖:...
    Eshin_Ye閱讀 2,665評(píng)論 0 1