FoundationDB 學(xué)習(xí) - 事務(wù)流程

不久之前蜀涨,F(xiàn)oundationDB (后面用 fdb 簡化) 重新開源侍瑟,對于大家來說,這真的是一個非常好的消息莱预。我也在第一時間下載了 fdb 的源碼柠掂,開始研究,一方面是看我們能在什么方面能夠借鑒锁施,另一方面也是需要給一些朋友回答陪踩,TiKV 到底跟 fdb 有什么不一樣這樣的問題。

關(guān)于 fdb 的研究悉抵,自己預(yù)計會有幾篇肩狂,但也不確定,這次是第一篇姥饰,來聊聊我最關(guān)注的一個問題 - fdb 是如何實現(xiàn)分布式事務(wù)的傻谁。

關(guān)鍵組件

在開始介紹之前,要先說說 fdb 的關(guān)鍵組件列粪。

Coordinators

所有的 clients 和 servers 都是通過 cluster file 來連接到 fdb cluster审磁,而這個 cluster file 就包含的是 coordinators 的 IP:PORT 列表。所有的 clients 和 servers 都會使用 coordinators 連接到 cluster controller岂座。

Cluster Controller

Cluster controller 是通過選舉產(chǎn)生的(fdb 貌似使用的是 Paxos态蒂,這個后面會詳細研究一下)。Cluster Controller 就是控制整個集群的费什,它是所有進程的入口钾恢,會監(jiān)控進程是否掛掉,告訴某個進程相關(guān)的 role鸳址,以及在所有進程之間傳遞系統(tǒng)的信息瘩蚪。Clients 也通過 cluster controller 來實時的同步最新的 proxies。

Master

Master 主要是用來協(xié)調(diào)寫子系統(tǒng)的稿黍,一個寫子系統(tǒng)包括 master疹瘦,proxies,resolvers 和 transaction logs巡球。Proxy言沐,resolver 和 transaction log 是一個整體單元,如果任意一個失敗了辕漂,那么我們就會重新找一個來將他們?nèi)刻鎿Q呢灶。Master 會給 proxies 分配 commit versions,對數(shù)據(jù)進行分布钉嘹,以及全局的流速控制。

Proxies

Proxies 會提供 read versions鲸阻,提交事務(wù)以及跟蹤 storage servers 的 key ranges跋涣。如果要提供一個 read version缨睡,一個 proxy 會問其他所有的 proxies 當(dāng)前最大的 committed version,并且同步的檢查 transaction logs 并沒有被停止陈辱。Master 流速控制可能會減緩提供 read versions 的頻率奖年。

對于一次事務(wù)提交,當(dāng)只有下面操作全部完成沛贪,才能認為成功:

  1. 從 master 得到一個 commit version
  2. 使用 resolvers 來確定當(dāng)前事務(wù)并沒有跟之前已經(jīng)提交的事務(wù)沖突
  3. 讓 transaction 持久化到 transaction logs

所有以 xff 開頭的 key 是系統(tǒng)保留前綴陋守,用來存放系統(tǒng)的元信息。任何對這段 key range 的修改都會 通過 resolvers 同步到所有的 proxies利赋。元信息包括數(shù)據(jù)的 key ranges 以及哪些 storage servers 有這些 range水评,其實也就是數(shù)據(jù)的路由表了。Proxies 也給 clients 提供相關(guān)的信息媚送,讓 clients 進行緩存中燥,如果緩存缺失,就從 proxies 重新更新塘偎。

Transaction Logs

Transaction logs 會按照 version 的順序接受 proxy 發(fā)過來的提交疗涉,并會使用 append only 的方式將修改的提交持久化到硬盤。在數(shù)據(jù)被寫入到磁盤的時候吟秩,也會通知 storage servers 有相關(guān)的修改操作咱扣,讓 storage servers 去獲取并且 apply 到 storage servers 里面。

Resolvers

Resolvers 用來確定不同事務(wù)的沖突涵防。當(dāng)一個事務(wù)的 read version闹伪,讀取了一個 key,在 commit 之前武学,另一個事務(wù)寫入了新的值祭往,這時候就會有沖突。 Resovler 會在內(nèi)存里面保存 5s 的所有寫入提交火窒,用來判斷沖突硼补,這也就是意味著,fdb 的事務(wù)執(zhí)行時間不能超過 5s熏矿。

Storage Servers

Storage servers 就是存放數(shù)據(jù)的地方已骇,fdb 會將數(shù)據(jù)按照 range 切分,存儲到不同的 storage servers 上面票编。Storage servers 會在內(nèi)存里面保存最近 5s 的修改(Versioned data)褪储,如果一個 client 的 read version 超過了 5s,那就會過期出錯了慧域。Storage server 有 ssd 和 memory 兩種鲤竹,ssd 其實用的是 sqlite3。

流程

上面大概介紹了 fdb 的關(guān)鍵組件昔榴,這里就先來說說事務(wù)辛藻。Clients 會先用一個 read version 讀取所有的數(shù)據(jù)碘橘,然后在本地修改,最后再將所有的修改一起提交到 proxies吱肌,這其實也就是一個樂觀事務(wù)模型痘拆。具體流程如下:

  1. 開始事務(wù)

    • Clients 從 proxy 獲取一個 read version
    • Proxy 會批量接受 clients 的請求,如果超過了限流控制氮墨,額外的請求會排隊
    • Proxy 問其它的 proxies 當(dāng)前最大的 commit version
    • Proxy 返回最大的 commit version 作為 read version
  2. 讀流程

    • Client 根據(jù) read version 以及需要訪問的數(shù)據(jù)的 key 或者 key range 找到對應(yīng)的 storage servers纺蛆。Storage server 接受到之后,如果發(fā)現(xiàn) version 太老规揪,結(jié)果返回錯誤桥氏。如果發(fā)現(xiàn)數(shù)據(jù)還不存在,就等或者超時粒褒。
    • Storage server 會根據(jù) read version 找對應(yīng)的數(shù)據(jù)识颊,并返回給 client。
  3. 提交事務(wù)

    • Client 將修改奕坟,read version 以及 read ranges 和 write ranges 提交給 proxy
    • Proxy 仍然是批量的接受請求
    • Proxy 將 range 切分并且發(fā)到不同的 resolvers祥款,如果 resolver 判斷有沖突,結(jié)束事務(wù)
    • Proxy 通過 master 得到最近的 commit version
    • Proxy 將修改的數(shù)據(jù)按照實際的數(shù)據(jù)分布切分月杉,加上 tag刃跛,推送到 transaction log servers
    • Transaction log servers 回復(fù) proxy 說 log 已經(jīng)落盤
    • Proxy 給 client 返回事務(wù)提交成功

可以看到,整個流程還是很簡單的苛萎,這里還需要注意幾個后臺流程桨昙。一個是 storage server 從 transaction logs 讀取數(shù)據(jù):

  1. 根據(jù)提供的 version 和 tag 從 transaction logs 拿數(shù)據(jù)
  2. 將數(shù)據(jù)讀入到 storage server 的 Versioned data
  3. 將數(shù)據(jù)寫入 storage engine

另一個就是 version 的更新,proxies 會定期的生成一個空的 commit request 來增加 commit version腌歉,這樣 transaction logs 和 storage servers 的 version 都能增加蛙酪,就能處理一個集群如果沒有任何寫入,后面新的讀取也能按照 version 讀到對應(yīng)的版本翘盖,不會無限制的等待桂塞。如果我的 read version 比當(dāng)前 storage server 的最大 version 要大,其實并不能保證讀到正確的數(shù)據(jù)馍驯。為啥會做這個阁危,主要是 fdb 用的時間戳來當(dāng)?shù)?version。

小結(jié)

上面僅僅是對 fdb 事務(wù)流程的簡單介紹汰瘫,幾個 concern 的點:

  1. Proxy 會跟其他的 proxies 交互問最大的 commit version狂打,如果 proxy 多了會不會有性能問題?
  2. Resolver 如果 range 太多會不會也有性能問題混弥?

可以看到趴乡,fdb 在 resolver 那邊其實就是將事務(wù)排隊了,所以雖然外面看起來是樂觀事務(wù),但對于沖突嚴重的情況浙宜,性能也比較不錯官辽。之前我一直以為 resovler 會是個單點蛹磺,但后面知道 resolver 也是可以 scale 的粟瞬。而且 fdb 自己也說做了很多的優(yōu)化,保證了整個的性能萤捆。

后面我會詳盡的搗鼓折騰下 FoundationDB裙品,做下 benchmark,也正在將它集成到我們的 YCSB 里面俗或,畢竟對我來說市怎,至少 fdb 那套 deterministic 理念是可以借鑒學(xué)習(xí)的。如果你對我們相關(guān)的 TiKV 工作感興趣辛慰,歡迎聯(lián)系我 tl@pingcap.com区匠。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市帅腌,隨后出現(xiàn)的幾起案子驰弄,更是在濱河造成了極大的恐慌,老刑警劉巖速客,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戚篙,死亡現(xiàn)場離奇詭異,居然都是意外死亡溺职,警方通過查閱死者的電腦和手機岔擂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浪耘,“玉大人乱灵,你說我怎么就攤上這事∑叱澹” “怎么了痛倚?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長癞埠。 經(jīng)常有香客問我状原,道長,這世上最難降的妖魔是什么苗踪? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任颠区,我火速辦了婚禮,結(jié)果婚禮上通铲,老公的妹妹穿的比我還像新娘毕莱。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布朋截。 她就那樣靜靜地躺著蛹稍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪部服。 梳的紋絲不亂的頭發(fā)上唆姐,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天,我揣著相機與錄音廓八,去河邊找鬼奉芦。 笑死,一個胖子當(dāng)著我的面吹牛剧蹂,可吹牛的內(nèi)容都是我干的声功。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼宠叼,長吁一口氣:“原來是場噩夢啊……” “哼先巴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起冒冬,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤伸蚯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后窄驹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朝卒,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年乐埠,在試婚紗的時候發(fā)現(xiàn)自己被綠了抗斤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡丈咐,死狀恐怖瑞眼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情棵逊,我是刑警寧澤伤疙,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站辆影,受9級特大地震影響徒像,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛙讥,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一锯蛀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧次慢,春花似錦旁涤、人聲如沸翔曲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞳遍。三九已至,卻和暖如春菌羽,著一層夾襖步出監(jiān)牢的瞬間掠械,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工算凿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留份蝴,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓氓轰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親浸卦。 傳聞我的和親對象是個殘疾皇子署鸡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

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