F1是Google開發的分布式關系型數據庫,主要服務於Google的廣告系統。Google的廣告系統以前使用MySQL,廣告系統的用戶經常需要使用復雜的query和join操作,這就需要設計shard規則時格外注意,盡量將相關數據shard到同一台MySQL上。擴容時對數據reshard時也需要盡量保證這一點,廣告系統擴容比較艱難。在可用性方面老的廣告系統做的也不夠,尤其是整個數據中心掛掉的情況,部分服務將不可用或者丟數據。對於廣告系統來說,短暫的宕機服務不可用將帶來重大的損失。為了解決擴容/高可用的問題,Google研發了F1,一個基於Spanner(看這里)的跨數據中心的分布式關系型數據庫,支持ACID,支持全局索引。2012年初已上線。
F1的幾個特性
高可用
可以說,幾乎都是Spanner搞定的,Spanner通過原子鍾和GPS接收器實現的TrueTime API搞定了跨數據中心時鍾誤差問題,進而搞定了分布式事務的時序問題,從而搞定了對外部的一致性。多個副本的一致通過Paxos搞定。
全局索引
基於Spanner提供的分布式讀寫事務(嚴格的兩階段鎖+兩階段提交),F1實現了全局索引。索引表和數據表實際上是兩張表,這兩張表一般來說存在不同的Spanner機器上,兩張表的一致性通過Spanner的分布式讀寫事務解決。在這里,同一個事務中涉及的全局索引不宜過多,因為每多一個全局索引,相當於多一個兩階段提交中的participant,對於分布式事務來說,participant越多,性能越差,並且事務成功的概率越小。
級聯Schema
思想和MegaStore類似,表和表之間有層次關系。將相關表中的相關數據存儲在一台機器上。比如對於廣告系統來說,就是將一個廣告客戶以及他的compaign等存儲在一起,廣告客戶作為一張表,compaign作為另外一張表,廣告客戶表中每行代表一個廣告客戶,廣告客戶表叫做root表,compaign表叫做子表,廣告客戶表中的每行叫做root記錄,compaign表中行叫做子記錄,那么同一個廣告客戶下所有的compaign和這個廣告客戶都存儲在同一台Spanner機器上。這樣做的好處就是一個操作就可以取到所有的相關數據,join很快,不用跨機。
三種事務
- 快照讀。 直接利用Spanner提供的快照讀事務
- 悲觀事務。 直接利用Spanner提供的讀寫事務,加兩階段鎖
- 樂觀事務。 基於Spanner的悲觀事務實現的。這樣的事務分為兩個階段,第一個階段是讀階段,持續時間不限,不加任何鎖,第二個階段是寫階段,即commit事務階段。基本思想是在讀階段將訪問的所有行的最后一次修改時間保存在F1客戶端,寫階段將所有的時間發到F1,F1開啟一個Spanner的讀寫事務,這個讀寫事務會重新讀取這些行的最后一次修改時間進行check,如果已經變了,說明檢測到了寫寫沖突,事務abort。
F1默認使用樂觀事務,主要考慮了如下幾個方面:
- 由於讀階段不加鎖,能容忍一些客戶端的誤用導致的錯誤
- 同樣,讀階段不加鎖,適合F1中一些需要和終端交互的場景。
- 對於一些出錯場景,可以直接在F1 Server進行重試,不需要F1 Client參與。
- 由於所有的狀態都在F1 Client端維護的,故某個F1 Server掛掉后,這個請求可以發給其他的F1 Server繼續處理。
當然,這會帶來兩個問題:
- 對於不存在的行,沒有最后一次修改時間,那么在其他讀事務執行期間,同一條語句執行多次返回的行數可能不一樣,這種情況在repeatable read這種隔離級別下是不允許的,這個問題典型的解決方案是gap鎖,即范圍鎖,在F1中,這個鎖可以是root表中root記錄的一列,這個列代表一把gap鎖,只有拿到這把鎖,才能往child表中某個范圍插入行。
- 對同一行高並發修改性能低。顯然,樂觀協議不適合這種場景。
部署
Google將廣告系統使用的F1和Spanner集群部署在美國的5個數據中心,東海岸兩個,西海岸兩個,中間一個。相當於每份數據5個副本,其中東海岸一個數據中心被作為leader數據中心。在spanner的paxos實現中,5個副本中有一個leader副本,所有的對這個副本的讀寫事務都經過它,這個leader副本一般就存在leader數據中心中。由於paxos協議的運行只需要majority響應即可,那么一次paxos操作的延時基本取決於東海岸的leader數據中心和東海岸另外一個數據中心,和中間那個數據中心之間的延時。從這里也可以看出,對於寫比較多的F1 Client來說,F1 Client和F1 Server都部署在leader數據中心性能最好。在這個配置下,F1用戶的commit延時大概在50ms到150ms之間。讀延時大約5~10ms。
參考資料
F1: A Distributed SQL Database That Scales