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ā)新的用法。