[焦容]
和彩云業(yè)務(wù)是中國移動(dòng)的云存儲(chǔ)類業(yè)務(wù),用戶可以將個(gè)人數(shù)字資產(chǎn)存儲(chǔ)在和彩云,上傳下載速度較快,不限速;且利用https 等進(jìn)行傳輸,安全性較好。如何提升和彩云架構(gòu)的高可靠性和健壯性是非常重要的課題,將直接影響業(yè)務(wù)的體驗(yàn)。
和彩云在2019 年前一直采用1+1 架構(gòu),即一個(gè)用戶節(jié)點(diǎn)與一個(gè)存儲(chǔ)節(jié)點(diǎn)支撐業(yè)務(wù)運(yùn)行,用戶節(jié)點(diǎn)與存儲(chǔ)節(jié)點(diǎn)均設(shè)置在廣州。用戶節(jié)點(diǎn)負(fù)責(zé)用戶登錄、元數(shù)據(jù)管理、流程實(shí)現(xiàn)等,是和彩云架構(gòu)的主要節(jié)點(diǎn);存儲(chǔ)節(jié)點(diǎn)負(fù)責(zé)用戶上傳下載、在線與離線轉(zhuǎn)碼、人臉聚類等,關(guān)系到用戶上傳下載體驗(yàn),也是重要的節(jié)點(diǎn)。
1+1 架構(gòu)有如下缺陷。
(1)單點(diǎn)故障
用戶節(jié)點(diǎn)與存儲(chǔ)節(jié)點(diǎn)均存在單點(diǎn)故障。如果用戶節(jié)點(diǎn)發(fā)生故障,將導(dǎo)致和彩云用戶無法登錄,查詢用戶資產(chǎn)、上傳下載等業(yè)務(wù)流程更無法運(yùn)行,也就是說業(yè)務(wù)完全不可用,發(fā)生業(yè)務(wù)全阻現(xiàn)象;如果存儲(chǔ)節(jié)點(diǎn)發(fā)生故障,雖然用戶能登錄、查詢用戶資產(chǎn),但無法使用上傳下載、在線播放等核心業(yè)務(wù),屬于嚴(yán)重故障。
(2)容量無法持續(xù)擴(kuò)容
受限于機(jī)房機(jī)柜的數(shù)量、數(shù)據(jù)庫的容量等制約因素,單個(gè)用戶節(jié)點(diǎn)的容量上限為6 000 萬APP 月活,很難向上突破,這將大大制約和彩云業(yè)務(wù)的發(fā)展。
如何避免業(yè)務(wù)全阻或上傳下載等核心業(yè)務(wù)不可用,擴(kuò)充用戶節(jié)點(diǎn)容量,本文設(shè)計(jì)了一套和彩云多節(jié)點(diǎn)方案,并成功實(shí)現(xiàn)。
和彩云2018 年前的架構(gòu)如圖1 所示。為1+1 架構(gòu),1個(gè)用戶節(jié)點(diǎn)加1 個(gè)存儲(chǔ)節(jié)點(diǎn)。
圖1 單節(jié)點(diǎn)架構(gòu)
下面說明用戶上傳文件的流程。
(1)用戶上傳文件操作前,去用戶節(jié)點(diǎn)進(jìn)行用戶登錄鑒權(quán),并查看用戶空間是否有空余空間;如果條件滿足用戶節(jié)點(diǎn)將用戶調(diào)度到存儲(chǔ)節(jié)點(diǎn),進(jìn)行上傳文件操作。
(2)上傳文件完成后存儲(chǔ)節(jié)點(diǎn)記錄該用戶上傳的文件ID、文件大小、存儲(chǔ)在哪個(gè)存儲(chǔ)節(jié)點(diǎn)、MD5 等信息。
(3)向用戶節(jié)點(diǎn)發(fā)信令,告知用戶節(jié)點(diǎn)該文件上傳成功,用戶節(jié)點(diǎn)記錄文件ID、文件名稱、文件上傳時(shí)間等信息。
從以上流程可以看出,因用戶節(jié)點(diǎn)與存儲(chǔ)節(jié)點(diǎn)都只有一個(gè),任何一個(gè)節(jié)點(diǎn)出現(xiàn)故障,都將導(dǎo)致用戶無法正常上傳下載,上傳下載是和彩云業(yè)務(wù)的核心流程。就是第一章所說的單點(diǎn)故障。另外也存在前面提到的容量無法持續(xù)擴(kuò)容的缺陷。
2018 年6 月成功上線了呼和浩特存儲(chǔ)節(jié)點(diǎn),首次實(shí)現(xiàn)了多存儲(chǔ)節(jié)點(diǎn)架構(gòu),形成了1+2 架構(gòu),如圖2 所示。
圖2 多存儲(chǔ)節(jié)點(diǎn)架構(gòu)
多存儲(chǔ)節(jié)點(diǎn)方案的關(guān)鍵技術(shù)如下。
3.1.1 重構(gòu)上傳下載流程
3.1.1.1 路由選擇
本方案重構(gòu)了和彩云上傳下載流程,用戶節(jié)點(diǎn)存儲(chǔ)了一張路由表,將31 個(gè)省的地市區(qū)號(hào)按照距離遠(yuǎn)近分別歸屬到廣州和呼和浩特存儲(chǔ)節(jié)點(diǎn),然后按路由表將用戶路由到相應(yīng)的存儲(chǔ)節(jié)點(diǎn)進(jìn)行上傳下載操作。從和彩云系統(tǒng)導(dǎo)出的部分路由表如表1 所示。例如將河北用戶路由到呼和浩特存儲(chǔ)節(jié)點(diǎn)進(jìn)行上傳下載操作,而不是路由到廣州存儲(chǔ)節(jié)點(diǎn)。
表1 存儲(chǔ)節(jié)點(diǎn)路由表
3.1.1.2 異構(gòu)存儲(chǔ)的支持
將用戶路由到某存儲(chǔ)節(jié)點(diǎn)后,支持該存儲(chǔ)節(jié)點(diǎn)內(nèi)部有不同類型的存儲(chǔ),也支持不同廠商的存儲(chǔ)。比如廣州存儲(chǔ)節(jié)點(diǎn)同時(shí)支持文件存儲(chǔ)與對(duì)象存儲(chǔ),也同時(shí)支持阿里、騰訊、中國移動(dòng)云能力中心的文件存儲(chǔ),也同時(shí)支持阿里與中國移動(dòng)云能力中心的對(duì)象存儲(chǔ)。異構(gòu)存儲(chǔ)集群選擇的算法是:
(1)計(jì)算存儲(chǔ)空閑率
某存儲(chǔ)節(jié)點(diǎn)有多個(gè)不同類型不同廠商的存儲(chǔ)集群,某個(gè)集群的空閑率的算法是:currentFreeRatio=(100-cloudStorage.getUsedRatio())*cloudStorage.getWeight()*MANUFACTURERWEIGHT。
公式中各參數(shù)的含義如下。
currentFreeRatio:集群的空閑率。
cloudStorage.getUsedRatio():該存儲(chǔ)集群的使用率,比如該集群為5P,使用了4P,則使用率為80%。
cloudStorage.getWeight():指該集群的權(quán)重,跟集群存儲(chǔ)容量大小、使用的是對(duì)象存儲(chǔ)還是文件存儲(chǔ)有關(guān),由和彩云運(yùn)營商配置。
MANUFACTURERWEIGHT:指廠商的權(quán)重,根據(jù)不同廠商的存儲(chǔ)性能情況分配不同的權(quán)重。
(2)創(chuàng)建hash 環(huán)
某個(gè)存儲(chǔ)節(jié)點(diǎn)有多個(gè)集群,根據(jù)集群的空閑率(currentFreeRatio)創(chuàng)建hash 環(huán)。例如圖3 的存儲(chǔ)節(jié)點(diǎn)有4個(gè)集群,創(chuàng)建的hash環(huán)有4個(gè)域(range)。currentFreeRatio值越大,則該集群的域值越大,在hash 環(huán)占的弧長越大,文件被隨機(jī)分配到某個(gè)域的概率則越高。
圖3 存儲(chǔ)節(jié)點(diǎn)hash 環(huán)
3.1.1.3 上傳下載流程
多存儲(chǔ)節(jié)點(diǎn)架構(gòu)下用戶上傳下載文件的過程是,在用戶進(jìn)行文件上傳操作時(shí),向用戶節(jié)點(diǎn)獲取用戶歸屬哪個(gè)存儲(chǔ)節(jié)點(diǎn)的信息,然后用戶節(jié)點(diǎn)調(diào)度用戶到歸屬存儲(chǔ)節(jié)點(diǎn)進(jìn)行上傳操作,實(shí)現(xiàn)用戶存儲(chǔ)訪問就近接入,用戶的文件下載操作原理類似。用戶上傳下載文件的數(shù)據(jù)與信令流如圖4 所示。
圖4 用戶上傳下載文件數(shù)據(jù)與信令流
3.1.1.4 用戶體驗(yàn)分析
呼和浩特存儲(chǔ)節(jié)點(diǎn)上線后,相比單存儲(chǔ)節(jié)點(diǎn)架構(gòu)北方用戶上傳速度提升了1 倍,達(dá)到1.2 Mbit/s,下載速度提升了70%,達(dá)到2.4 Mbit/s。如圖5 所示。
圖5 呼和浩特存儲(chǔ)節(jié)點(diǎn)上線前后速度對(duì)比
3.1.2 設(shè)置容災(zāi)機(jī)制
和彩云系統(tǒng)用戶歸屬哪個(gè)存儲(chǔ)節(jié)點(diǎn)的路由表是可配置的,如果某個(gè)存儲(chǔ)節(jié)點(diǎn)出現(xiàn)故障,可以臨時(shí)修改路由表,將該存儲(chǔ)節(jié)點(diǎn)對(duì)應(yīng)的所有地區(qū)區(qū)號(hào)配置到另一個(gè)存儲(chǔ)節(jié)點(diǎn)。這樣用戶可以繼續(xù)正常上傳下載。例如如果廣州存儲(chǔ)節(jié)點(diǎn)出現(xiàn)故障,10 分鐘內(nèi)可以修改路由表并生效,南方用戶臨時(shí)歸屬呼和浩特存儲(chǔ)節(jié)點(diǎn),從而保障南方用戶正常使用業(yè)務(wù)。廣州存儲(chǔ)節(jié)點(diǎn)與呼和浩特存儲(chǔ)節(jié)點(diǎn)互為容災(zāi)。
2021 年12 月和彩云上線了呼和浩特用戶節(jié)點(diǎn),2022年3月上線了東莞存儲(chǔ)節(jié)點(diǎn),形成了2+3架構(gòu),如圖6所示。
圖6 多用戶節(jié)點(diǎn)+多存儲(chǔ)節(jié)點(diǎn)架構(gòu)
多用戶節(jié)點(diǎn)架構(gòu)的關(guān)鍵技術(shù)如下。
3.2.1 用戶調(diào)度
將單用戶節(jié)點(diǎn)改為雙用戶節(jié)點(diǎn)后,用戶訪問和彩云系統(tǒng)時(shí),需要先確定用戶訪問哪個(gè)用戶節(jié)點(diǎn),我們新建了一個(gè)調(diào)度節(jié)點(diǎn)解決該問題。將和彩云域名對(duì)應(yīng)調(diào)度節(jié)點(diǎn)的IP地址配置在DNS 中,調(diào)度節(jié)點(diǎn)還保存了一張表,記錄廣州用戶節(jié)點(diǎn)與呼和浩特用戶節(jié)點(diǎn)分別對(duì)應(yīng)的地區(qū)區(qū)號(hào),原則上廣州用戶節(jié)點(diǎn)管理南方用戶,呼和浩特用戶節(jié)點(diǎn)管理北方用戶。用戶訪問和彩云系統(tǒng)時(shí),可以根據(jù)該表查詢到該用戶歸屬哪個(gè)用戶節(jié)點(diǎn),然后調(diào)度節(jié)點(diǎn)將該用戶路由到相應(yīng)的用戶節(jié)點(diǎn)。
廣州用戶節(jié)點(diǎn)與呼和浩特用戶節(jié)點(diǎn)根據(jù)地區(qū)區(qū)號(hào)進(jìn)行靈活配置。
3.2.2 數(shù)據(jù)資產(chǎn)的割接
在2021 年12 月前,所有用戶的文件信息都存儲(chǔ)在廣州用戶節(jié)點(diǎn)。12 月將內(nèi)蒙烏海60 萬用戶割接到了呼和浩特用戶節(jié)點(diǎn)。割接當(dāng)晚12 點(diǎn)和彩云系統(tǒng)暫停對(duì)外服務(wù),從廣州用戶節(jié)點(diǎn)的200 億條數(shù)據(jù)記錄中篩選出烏海用戶的用戶信息、上傳文件信息等數(shù)據(jù),然后用SQL 語句寫的批量復(fù)制工具將烏海的數(shù)據(jù)復(fù)制到呼和浩特用戶節(jié)點(diǎn),再將烏海用戶路由到呼和浩特用戶節(jié)點(diǎn),進(jìn)行業(yè)務(wù)測(cè)試驗(yàn)證。測(cè)試通過且烏海用戶業(yè)務(wù)運(yùn)行正常后才能將存在于廣州用戶節(jié)點(diǎn)的烏海用戶數(shù)據(jù)刪除。
3.2.3 文件跨站點(diǎn)轉(zhuǎn)存
外鏈?zhǔn)呛筒试莆募窒淼囊环N形式,某用戶生成了URL 外鏈,其他用戶可以通過訪問鏈接,查看或者轉(zhuǎn)存該文件至自己的和彩云空間。跨用戶節(jié)點(diǎn)轉(zhuǎn)存外鏈文件時(shí),需要把文件元數(shù)據(jù)(文件名、文件ID、文件目錄樹型結(jié)構(gòu)等)從一個(gè)用戶節(jié)點(diǎn)批量復(fù)制到另外一個(gè)用戶節(jié)點(diǎn),但物理文件共用一份。
如上所述,為確定用戶歸屬,引入了調(diào)度節(jié)點(diǎn),調(diào)度節(jié)點(diǎn)功能相對(duì)簡單,且為12 臺(tái)服務(wù)器組成的一個(gè)集群,本身具備較強(qiáng)的容災(zāi)能力,但依然存在單點(diǎn)故障,因此如何解決調(diào)度節(jié)點(diǎn)的單點(diǎn)故障,是下一步需要解決的問題。
廣州用戶節(jié)點(diǎn)出故障后,雖然呼和浩特用戶依然可以正常使用業(yè)務(wù),但南方用戶將無法使用業(yè)務(wù),如何做到廣州用戶節(jié)點(diǎn)與呼和浩特用戶節(jié)點(diǎn)雙活,一個(gè)節(jié)點(diǎn)出故障后,將無縫切換到另一個(gè)節(jié)點(diǎn),是另外一個(gè)需要解決的有較高難度的問題。