螞蟻集團(tuán)分布式注冊(cè)中心建設(shè)分享

- 前言 -
這篇文章是基于 SOFA Meetup 合肥站的分享總結(jié),主要針對(duì)于注冊(cè)中心的定位以及功能介紹,通過對(duì)螞蟻?zhàn)?cè)中心發(fā)展史的分析,帶領(lǐng)大家了解,螞蟻的注冊(cè)中心是如何一步一步演變?yōu)楝F(xiàn)在的規(guī)模和特性的。

- 注冊(cè)中心是什么 -

服務(wù)發(fā)現(xiàn)可以有一個(gè)中心化的組件或者說是存儲(chǔ),它承載了所有服務(wù)的地址,同時(shí)提供出來一個(gè)可供查詢和訂閱的能力,服務(wù)的消費(fèi)方可以通過和這個(gè)中心化的存儲(chǔ)交互,獲取服務(wù)提供方的地址列表。 服務(wù)注冊(cè):同樣是上文中中心化的組件,但是,這個(gè)時(shí)候的服務(wù)信息可以有兩種措施:
服務(wù)連接注冊(cè)中心,同時(shí)上報(bào)自身的服務(wù)以及元數(shù)據(jù)(也是今天本文講述的重點(diǎn)) 有一個(gè)集中的控制面(control plane)將用戶定義的服務(wù)和 IP 的映射寫入注冊(cè)中心,例如 AWS 的 CloudMap。

- 調(diào)用流程 -

服務(wù) A,服務(wù) B 通過 SDK 或者 REST 將自身的服務(wù)信息上報(bào)給注冊(cè)中心; 服務(wù) A 需要調(diào)用服務(wù) B 的時(shí)候,就對(duì)注冊(cè)中心發(fā)起請(qǐng)求,拉取和服務(wù) B 相關(guān)的服務(wù) IP 列表以及信息; 在獲取到服務(wù) B 的列表之后,就可以通過自身定義的負(fù)載均衡算法訪問服務(wù) B。

- 心跳 -
服務(wù) B 的一個(gè)節(jié)點(diǎn)斷網(wǎng)或是 hang 住,引發(fā)心跳超時(shí);或是宕機(jī)、斷鏈直接引發(fā)心跳失??; 注冊(cè)中心把問題節(jié)點(diǎn)從自身的存儲(chǔ)中拉出(這里拉出根據(jù)具體實(shí)現(xiàn):有的是直接刪除,有的是標(biāo)記為不健康); 服務(wù) A 收到注冊(cè)中心的通知,獲取到服務(wù) B 最新的列表。


- Dubbo 注冊(cè)中心 -


protocol(協(xié)議類型)比如,zookeeper; host; port。
服務(wù)的生產(chǎn)方通過 Dubbo 客戶端向注冊(cè)中心(Registry)發(fā)起注冊(cè)行為(register); 服務(wù)的消費(fèi)方通過 Dubbo 客戶端訂閱信息(subscribe); 注冊(cè)中心通過通知的方式,下發(fā)服務(wù)列表給服務(wù)消費(fèi)方。


- 注冊(cè)中心的本質(zhì) -
一方面,注冊(cè)中心需要存儲(chǔ)能力去記錄服務(wù)的信息,比如應(yīng)用列表; 另一方面,注冊(cè)中心在實(shí)踐過程中,需要提供必需的運(yùn)維手段,比如關(guān)閉某一服務(wù)流量。


- 螞蟻?zhàn)?cè)中心編年史 -


單點(diǎn)的問題(所有調(diào)用都走 F5 的話,F(xiàn)5 一旦掛了,很多服務(wù)會(huì)不可用); 容量問題(F5 承載的流量太高,本身會(huì)到一個(gè)性能瓶頸)。

單點(diǎn)風(fēng)險(xiǎn)(注冊(cè)中心本身是單機(jī)應(yīng)用); 容量瓶頸(單臺(tái)注冊(cè)中心的連接數(shù)和存儲(chǔ)數(shù)據(jù)的容量是有限的)。
scale-up(淘寶):通過增加機(jī)器的配置,來增強(qiáng)容量以及扛鏈接能力;同時(shí),通過主-備這樣的架構(gòu),來保障可用性; scale-out(螞蟻):通過分片機(jī)制,將數(shù)據(jù)和鏈接均勻分布在多個(gè)節(jié)點(diǎn)上,做到水平拓展;通過分片之后的備份,做到高可用。
Session 節(jié)點(diǎn),專門用來抗鏈接使用,本身無狀態(tài)可以快速擴(kuò)展,單機(jī)對(duì)資源的占用很?。?br> Data 節(jié)點(diǎn),專門用來存儲(chǔ)數(shù)據(jù),通過分片的方式降低單個(gè)節(jié)點(diǎn)的存儲(chǔ)量,控制資源占用。

所有 Data 都是分布式的,Data 之間的服務(wù)發(fā)現(xiàn)需要通過啟動(dòng)時(shí)給定一個(gè)配置文件,這樣就和標(biāo)準(zhǔn)運(yùn)維脫鉤; Data 節(jié)點(diǎn)的上下線需要去及時(shí)修改配置文件,否則集群重啟會(huì)受到影響; 分布式存儲(chǔ)一致性問題,每次迭代發(fā)布,需要鎖定 paas 平臺(tái),防止節(jié)點(diǎn)變動(dòng)帶來的不一致。







- 開源 -



- 共同建設(shè) -
SOFARegistry 是一個(gè)開源項(xiàng)目,也是開源社區(qū) SOFA 重要的一環(huán),我們希望用社區(qū)的力量推動(dòng) SOFARegistry 的前進(jìn),而不是只有螞蟻的工程師去開發(fā)。我們?cè)诮衲暌矄?dòng)了兩個(gè)項(xiàng)目,用于支持更多的開發(fā)者參與進(jìn)來:
Trun-Key Project (開箱即用計(jì)劃):
https://github.com/sofastack/sofa-registry/projects/5
Deep-Dive Project(深入淺出計(jì)劃):
https://github.com/sofastack/sofa-registry/projects/4
計(jì)劃目前還處在初期階段,歡迎大家加入進(jìn)來,可以幫助我們解決一個(gè) issue,或是寫一篇文檔,都可以更好地幫助社區(qū),幫助自己去成長(zhǎng)。

