談?wù)?etcd 架構(gòu)與設(shè)計(jì)

etcd 有非常多的用戶,全球有上萬(wàn)公司在用。但目前并沒有文章在講 etcd 的架構(gòu)。一方面,業(yè)界中懂 etcd 的人都太忙了;另一方面,學(xué)術(shù)圈一般不會(huì)涉足這種應(yīng)用。作者身處 CoreOS 雖地位卑微,但好在臉皮厚敢于胡說。這里寫寫自己對(duì) etcd 架構(gòu)疏淺的理解。盡己之力為這個(gè)領(lǐng)域貢獻(xiàn)的同時(shí)望批評(píng)指教。

Chubby, Paxos Made Live

Google 公布出來(lái)的 Paxos 系統(tǒng)就有兩套:Chubby [OSDI 06], Paxos Made Live [PODC 07]. 讀這兩篇 paper 的感覺就像我這村娃第一次進(jìn)廣州看到天上有輛直升機(jī),那叫一個(gè)興奮啊,從來(lái)沒見過這樣的高科技。

為什么要講 Google 的系統(tǒng)呢?一方面,因?yàn)樗麄兊脑O(shè)計(jì)直接影響了 etcd 的設(shè)計(jì),paper 里的大家自讀即可,不再累述;另一方面,通過對(duì)比,etcd 某些設(shè)計(jì)上的權(quán)衡會(huì)更顯然。

storage layer

Chubby 的 storage layer 是典型的 database 架構(gòu):on-disk data + in-mem table + index files。因?yàn)榇蠹蚁胍龅氖?replicated database。事實(shí)上這么做能利用起 database storage layer 的知識(shí)框架,這套理論歷經(jīng)千錘百煉,能夠處理大規(guī)模的數(shù)據(jù),還在不斷發(fā)展。

Chubby 底層用的是 BDB,古董就不討論了。后來(lái)出現(xiàn)的 Spanner 用了 LevelDB,現(xiàn)在開源的 Cockroach DB 和 TiKV 都用 RocksDB (LDB 一變種)。而 etcd 則用了 LMDB。這是因?yàn)榍罢叩膶憯?shù)據(jù)量大,但是會(huì)犧牲讀 throughput。而 etcd 需要更大的讀 throughput,對(duì)寫要求可以降低。其次,etcd 只需要維護(hù)一層的 file,可以假定 key space 不會(huì)超過 memory size.

然而即便如此,etcd 的寫 performance 還是令人嘆為觀止:https://coreos.com/blog/performance-of-etcd.html

API

Chubby 的 90% use case 是存小數(shù)據(jù) (<1KB) 和做 KeepAlive (lock service)。但是 Chubby API 太過于 file system oriented 了。這是因?yàn)?Chubby 是 Google 的 internal system, 一方面要滿足應(yīng)用層的需求,另一方面 fit in Google infra landscape。

etcd 的 API 則更為多樣化:

  • Raft (consensus) 層被其他開源項(xiàng)目 TiKV, Cockroach DB, Dgraph 給重用了。
  • KeepAlive 是綁定在 client-agnostic 的 Lease 抽象層上而不是 client-specific 的 Session 上。
  • Watch 可以得到連續(xù)性的事件。
  • 類似于 Kafka, 能通過 index 重新得到原來(lái)的消息。
  • 提供 Range query。
  • 提供 Transaction API。
  • 默認(rèn)提供了 causal consistency guarantee。用戶可選 serializability guarantee。

可以看出,etcd API 更偏底層。這是因?yàn)?etcd 作為開源項(xiàng)目,要滿足更廣泛的 use cases,所以需要在更底層找到共同的抽象。

其實(shí) API 并沒有好壞之分,這里一個(gè)重要的經(jīng)驗(yàn)就是系統(tǒng)設(shè)計(jì)切忌照貓畫虎。Chubby 最牛逼的地方在于他的 consensus 層和 database storage 層。假設(shè)不得其精髓,只顧膚淺實(shí)現(xiàn)其 API,這就是算法上的只顧每步最優(yōu)無(wú)法全局最優(yōu)。千萬(wàn)不要走捷徑,走崎嶇的路是一種沉淀!

值得一提的是 Transaction API。在 Paxos Made Live 里面提到了一個(gè)叫 MultiOp primitive。前人深邃的思想,在白紙黑字間,略顯枯燥無(wú)味。以為就要淹沒在歷史的河流里,十多年后這個(gè)想法卻在 etcd 里面用現(xiàn)代的方式重新展現(xiàn)出來(lái),在這個(gè)世界被許許多多的用戶使用著,受惠于大大小小的項(xiàng)目。我每次想到這個(gè)就情不自禁地興奮起來(lái)。這TM才是藝術(shù)!我恨不得開間博物館給保存起來(lái)。

寫在最后

etcd 目前主要用作:

  • replicated database: causal consistency, serializability
  • message queue
  • health checking

通過分享架構(gòu),希望能幫助人們更好的使用 etcd,和開發(fā)新的用法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容