Tedis:基於 TiKV 構建的 NoSQL 資料庫
作者介紹
陳東明,餓了麼北京技術中心架構組負責人,負責餓了麼的產品線架構設計以及餓了麼基礎架構研發工作。曾任百度架構師,負責百度即時通訊產品的架構設計。具有豐富的大規模系統構 建和基礎架構的研發經驗,善於複雜業務需求下的大並發、分散式系統設計和持續優化。個人微信公眾號 dongming_cdm。
Tedis (https://github.com/eleme/tedis)是基於開源 TiKV 的兼容 Redis 協議的強一致性的 NoSQL 資料庫開源項目。本文介紹一下 Tedis 開源項目的架構設計和特性,以及架構背後的一些思考(包括為何選擇 TiKV 和 Redis 協議)。
先來討論為什麼基於 TiKV 構建我們自己的 NoSQL 資料庫。
首先簡述一下 TiKV[1],TiKV 是 TiDB 的一個子項目,TiDB 是一個分散式的關係型資料庫 [2],TiKV 是 TiDB 的存儲層。TiKV 本身是可獨立於 TiDB 的單獨項目。它是一個強一致、可水平擴展的、高可用的分散式 Key-Value 存儲系統。
選擇 TiKV 的第一個原因是 TiKV 是一個強一致的系統。在我的另外一篇文章中(發表在 InfoQ, 參看 https://www.infoq.cn/article/rhzs0KI2G*Y2r9PMdeNv),我闡述了一個觀點:NoSQL 資料庫應該具有一致性,並且通過多副本技術達到實際的高可用,也就是說 NoSQL 資料庫應該是一個「實際上的 CA」 (effectively CA)系統。但是在這篇文章中我並沒有明確說明 NoSQL 該具有的一致性是哪種一致性。實際上,我所說的一致性其實就是一種強一致性 [3],或者更準確的說是線性一致性 [4]。TiKV 正是具有這種線性一致性。TiKV 中的每個數據都會保存 3 個副本,在只有一個副本的節點宕機或者出現網路分區的情況下,另外 2 個副本仍然能夠對外提供服務。理論上來講,同時出現 2 個以上副本同時壞掉的可能性很小,也就是理論上可以達到非常高的可用性。通過 TiKV 滾動升級等運維輔助,如果在實際的生產中,有良好的運維,可以達到實際上非常高的可用性。也就是稱為一個「實際上的 CA」(effectively CA)系統。
TiKV 通過 Raft [5] 協議實現了線性一致性和高可用 2 個特性。Raft 是一種分散式共識協議,通過 Raft 協議,數據可以被認為是原子的寫入到 3 個副本上。共識協議的一個特點就是要寫入大多數,才會認為寫入成功,3 個副本的大多數就是 2 個,也就是在只有一個副本宕機或者網路分區的情況下,仍然可以成功寫入,並且提供讀服務。
選擇 TiKV 的第二個原因是 TiKV 的架構可擴展和生態。在 TiDB 中 TiKV 是獨立的一層,形成了一個很好的可擴展架構,實際上可以在 TiKV 上擴展出很多不同的資料庫出來。TiDB 層本身就是這種架構上的一個擴展。這種架構類似於 Google 公司的第一代的 Spanner 系統 [6],Spanner 系統本身也是一個強一致性的、高可用的分散式 Key-Value 系統。在 Spanner 的基礎之上,Google 構建了 F1 系統 [7],實現了 SQL 協議。2017 年,Google 升級了 Spanner 到第二代 [8],讓 Spanner 本身就具有了 SQL 能力。雖然一代 Spanner+F1 是這樣的架構,但它仍然是一種非常優秀的架構。我們的 Tedis 項目,也是構建在這一可擴展架構上的一個項目,依託於 TiKV 提供的底層能力,向上構建了不同於 SQL 協議的 Redis 協議。我相信 TiKV 的這種可擴展架構,未來可以成為一種生態,還可以在上面「?出」其他的類型的資料庫,比如說 Mango 協議、圖協議。這些資料庫都具有與底層 TiKV 相同的線性一致性和高可用性,區別只在於對外的介面協議不同。目前這種生態已初?端倪,Titan 這個開源項目,與我們的 Tedis 項目非常類似,他們的開源步伐先於我們,目前做的也非常不錯。我相信,我們肯定不是這個生態中的最後一個。