本文是劉奇在SDCC 2015數(shù)據(jù)庫實踐論壇上分享的《HBase分布式事務(wù)與SQL實現(xiàn)》主題內(nèi)容。 目前主流的數(shù)據(jù)庫或者NoSQL要么在CAP里面選擇AP,比較典型的例子是Cassandra,要么選擇CP比如HBase,這兩個是目前用得非常多的NoSQL的實現(xiàn)。我們的價值觀一定認為未來是分布式的,一定是盡量傾向于全部都擁有,大部分情況下取舍都是HA,主流的比較頂級的數(shù)據(jù)庫都會選擇C,分布式系統(tǒng)一定逃不過P,所以A就只能選擇HA。現(xiàn)在主要領(lǐng)域是數(shù)據(jù)庫的開發(fā),完全分布式,主要方向和谷歌的F1方向非常類似。 目前看NewSQL代表未來(Google Spanner、F1、FoundationDB),HBase在國內(nèi)有六個Committer,在目前主流的開源數(shù)據(jù)庫里面幾乎是最強的陣容。大家選型的時候會有一個猶豫,到底應(yīng)該選擇HBase還是選Cassandra。根據(jù)應(yīng)用場景,如果需要一致性,HBase一定是你最好的選擇,我推薦HBase。它始終保持強一致,我們非常喜歡一致性,喪失一致性的時候有些錯誤會特別詭異,很難查。對于Push-down特性的設(shè)計其實比較好,全局上是一個巨大的分布式數(shù)據(jù)庫,但是邏輯上是分成了一個個Region,Region在哪臺機器上是明確的。 比如要統(tǒng)計記錄的條數(shù),假設(shè)數(shù)據(jù)分布在整個系統(tǒng)里面,對數(shù)十億記錄做一個求和操作,就是說不同的機器上都要做一個sum,把條件告訴他要完成哪些任務(wù),他給你任務(wù)你再匯總,這是典型的分布式的 MPP,做加速的時候是非常有效的。 2015年HBaseConf 上面有一句總結(jié): “Nothing is hotter than SQL-on-Hadoop, and now SQL-on- HBase is fast approaching equal hotness status”, 實際上SQL-on-HBase 也是非?;?。因為 Schema Less 沒有約束其實是很嚇人的一件事情,當(dāng)然沒有約束也比較爽,就是后期維護十分痛苦,規(guī)模進一步擴大了之后又需要遷移到 SQL。 現(xiàn)在無論從品質(zhì)還是速度上要求已經(jīng)越來越高,擁有SQL的同時還希望有ACID的東西(OLAP一般不追求一致性)。所以TiDB在設(shè)計時就強調(diào)這樣的特點:始終保持分布式事務(wù)的支持,兼容MySQL協(xié)議。無數(shù)公司在SQL遇到Scale問題的時候很痛苦地做出了選擇,比如遷移到HBase,Cassandra MongoDB已經(jīng)看過太多的公司做這種無比痛苦的事情,現(xiàn)在不用痛苦了,直接遷過來,直接把數(shù)據(jù)導(dǎo)進來就OK了。TiDB最重要的是關(guān)注OLTP,對于互聯(lián)網(wǎng)業(yè)務(wù)來說通常是在毫秒級內(nèi)就需要返回一個結(jié)果。 我們到目前為止開發(fā)了六個月,開源了兩個月。昨天晚上TiDB達到了第一個Alpha的階段,現(xiàn)在可以擁有一個強大的數(shù)據(jù)庫:支持分布式事務(wù),始終保持同步的復(fù)制,強大的按需Scale能力,無阻塞的Schema變更。發(fā)布第一個Alpha版本的時候以前的質(zhì)疑都會淡定下來,因為你可以閱讀每一行代碼,體驗每個功能。選擇這個領(lǐng)域也是非常艱難的決定,實在太Hardcore了,當(dāng)初Google Spanner也做了5年。不過我們是真愛,我們就是技術(shù)狂,就是要解決問題,就是要挑大家最頭痛的問題去解決。好在目前阿里的OceanBase給我們服了顆定心丸,大家也不會質(zhì)疑分布式關(guān)系型數(shù)據(jù)庫是否可行。 TiDB名字由來 為什么叫TiDB?大家起名字的時候特別喜歡用希臘神話里面的人物,但幾乎所有的希臘神話人物的名字都被別的項目使用了,后來我們就找了化學(xué)元素周期表(理工科男與生俱來的特征),化學(xué)元素周期表里找到一個不俗且又能代表我們數(shù)據(jù)庫特性的元素-Ti 。Ti是航空航天及航海里面很重要的設(shè)備都會用到的,特別穩(wěn)定,也比較貴。 TiDB的系統(tǒng)架構(gòu)圖 TiDB怎么支持MySQL這個協(xié)議?這里會有一個協(xié)議解析層,它的作用就是去分析MySQL協(xié)議,轉(zhuǎn)成內(nèi)部可以識別的分發(fā)給自己的SQL Layer。當(dāng)SQL Layer 拿到這個語句之后會把它拆成對應(yīng)的分布式KV操作,所以這里會有一個Transactional KV Storage。接下來是在KV基礎(chǔ)上增加事務(wù)的支持,再往上是普通的KV操作,理論上KV選什么都可以,如果選的是HBase有一個好處,它本身就是分布式,省掉分布式的工作。目前我們在小米的Themis基礎(chǔ)上做了些優(yōu)化和改進,和我們TiDB做了一個很好的結(jié)合。后期我們有一個計劃,準備自己重寫一套底層的分布式KV,把HBase換掉。因為HBase對于Container不友好,加上GC也是讓人比較討厭的問題,壓力比較大的時候GC延遲會加長。 Google Percolator實現(xiàn)方式 HBase上面分布式事務(wù)典型的設(shè)計,先來說一下Goolge Percolator 內(nèi)部實現(xiàn),看架構(gòu)圖: Goolge Percolator內(nèi)部實現(xiàn) 分布式事務(wù)基本設(shè)計是在上面這個 Percolator層,Timestamp Oracle 可以保證嚴格的遞增。Percolator是在KV上的實現(xiàn),它對于SQL的角度考慮比較少,有一個隔離級別的問題,很典型的是Snapshot Isolation, SQL 語句落在KV上的實現(xiàn),如果只有Snapshot Isolation的話隔離級別就太低了。此外,這個模型還有其它的問題。比如,它每秒能分配多少個遞增的Timestamp?Google分享的一個slides的數(shù)據(jù),每秒200萬,小米也開源了自己的實現(xiàn),每秒60萬,我們前一陣也寫了一個每秒400萬,優(yōu)化一下可以達到800萬。因為Timestamp業(yè)務(wù)特別簡單,所以可以做針對性的優(yōu)化,當(dāng)然很少有業(yè)務(wù)能跑到這個級別的事務(wù)。 Yahoo OMID的實現(xiàn) 雅虎的OMID實現(xiàn),架構(gòu)圖如下: 雅虎的OMID實現(xiàn) 除了Timestamp的職能,TSO還維護更多信息用于檢測事務(wù)沖突。TSO是整個Omid系統(tǒng)的單點,如果一個系統(tǒng)只需要一個單點,單點做得越少就能獲得越多的性能,也更容易優(yōu)化。 下圖是它的分布式事務(wù)的執(zhí)行過程: 假設(shè)現(xiàn)在要發(fā)起一個分布式事務(wù),第一個事情是拿Start TS,再去做你的讀寫操作,做讀寫操作的時候會把Key都記下來。Commit的時候要先沖突檢測,這就是TSO 要做的更多的事情,更具體的細節(jié)請參考Omid 的論文或者 <<從零開始寫分布式數(shù)據(jù)庫>>一書。 谷歌的Spanner,細節(jié)非常多,引用的論文有40多篇,很嚇人,有些引用的論文也非常經(jīng)典,很值得一讀。Spanner已經(jīng)不再使用NTP了,需要用一個有信心的靠譜的方式來同步時間。內(nèi)部也說不再用NTP做時間的維護,GPS是非常簡單便宜的方式,GPS是大家使用滴滴打車時用于得到定位信息的。GPS還給了當(dāng)前精確的時鐘信息,有軟件可以把這個檢測出來,可以直接使用它的這個信號來同步時間。使用GPS信號的好處很明顯,隨便在哪個山區(qū)都有GPS信號,但不一定能收到基站的信號,同時它的精度也非常高。 TiDB的技術(shù)選型 再來說說TiDB的一些技術(shù)選型的例子。選擇MySQL協(xié)議后會做一些取舍,有些地方不完全按Google F1去做設(shè)計的。Google F1里做的比較好的是非常經(jīng)典的Non-blocking schema changes。比如現(xiàn)在要加一個索引,如果橫跨數(shù)十臺機器,數(shù)十億條記錄,加索引的速度是非常慢的,那么這個過程必須是不阻塞的,不影響正在運行的業(yè)務(wù)的。因為在建立索引的同時需要修改別的地方,所以要做一個原子的提交,細節(jié)上還要處理事務(wù)沖突的錯誤。F1有并發(fā)的圖,我們剛才提到HBase里通過Push-down可以把一些計算下推到對應(yīng)的節(jié)點上去。但由于F1依賴Spanner,而Spanner會頻繁地做Reblancing,會把數(shù)據(jù)不斷的移動,所以它在上面很難基于range信息一次做最優(yōu)的決策。 SQL如何映射分布式KV? SQL到底是怎么映射到分布式KV上?現(xiàn)在HBase分層分得更加清楚,SQL層不太關(guān)心下面到底用什么,在乎的是接口。映射的過程,假設(shè)User Table里面有個Email,我們存儲的時候是用ID做它的標識,這有很多的好處,比如刪掉再重新添加一樣的,它要生成不同的ID。在數(shù)十億條記錄的情況下刪除一個Table,刪除的過程完全可以由Map-Reduce異步去做。 為什么提供MySQL協(xié)議的支持?如果重新寫一個數(shù)據(jù)庫會遇到一個很大的問題,大家憑什么相信你是對的,數(shù)據(jù)庫需要時間需要測試,好在你接入MySQL協(xié)議,你可以經(jīng)過和MySQL一樣嚴謹?shù)臏y試。但如果是自己完全寫一個,不借用它的協(xié)議,不借用它的語法,沒有測試,大家憑什么相信你是對的?,F(xiàn)在這個時代沒有Communit是很可怕的,閉門造車很容易走偏。TiDB現(xiàn)在可以讓用戶一行代碼都不改,跑WordPress等,還支持很多的ORM,這些ORM可以直接用,用戶的代碼一行不改可以直接遷過來,完全擁有水平擴展的能力,完全擁有分布式事務(wù)的支持。前TiDB在Github上2800+star。 個人簡介: 劉奇,開源分布式數(shù)據(jù)庫TiDB創(chuàng)始人,Codis項目創(chuàng)始人,分布式系統(tǒng)專家。曾任豌豆莢,京東資深系統(tǒng)架構(gòu)師。同時也是知名的Go語言專家和Redis專家?,F(xiàn)從事開源的分布式NewSQL數(shù)據(jù)庫TiDB(受Google F1啟發(fā))的開發(fā)。擅長高并發(fā)、大規(guī)模、分布式數(shù)據(jù)庫系統(tǒng)架構(gòu)設(shè)計,微博(@goroutine)。 |
|
來自: richard_168 > 《待分類》