2016年1月4日,就在Netflix向130個(gè)新國(guó)家進(jìn)行業(yè)務(wù)擴(kuò)展之前,Netflix Billing(計(jì)費(fèi)系統(tǒng))基礎(chǔ)設(shè)施成為100% AWS云原生架構(gòu)。Billing基礎(chǔ)設(shè)施完成了由Netflix數(shù)據(jù)中心向AWS云的遷移。
對(duì)于一家企業(yè)而言,它的計(jì)費(fèi)方案是金融命脈,與此同時(shí),它還是一家公司對(duì)待客戶態(tài)度的可見(jiàn)表現(xiàn)形式。而極好的客戶體驗(yàn)是Netflix的核心價(jià)值之一。考慮到Billing會(huì)直接影響Netflix與會(huì)員的財(cái)務(wù)關(guān)系和自身財(cái)報(bào)這樣的敏感性,此次遷移要盡可能巧妙處理。Netflix的主要目標(biāo)是為其遷移到云定義一個(gè)安全,彈性,細(xì)化的路線,且對(duì)會(huì)員體驗(yàn)無(wú)影響。
我們對(duì)Billing生態(tài)系統(tǒng)從Netflix數(shù)據(jù)中心到AWS云的遷移方案進(jìn)行了深入探討。
Billing架構(gòu)的組成
Billing基礎(chǔ)設(shè)施負(fù)責(zé)管理Netflix會(huì)員的計(jì)費(fèi)狀況。這包括追蹤開(kāi)始/已支付周期,會(huì)員賬戶上的信貸額,管理會(huì)員的支付狀態(tài),發(fā)起費(fèi)用請(qǐng)求以及會(huì)員的支付時(shí)間。除了這些之外,計(jì)費(fèi)數(shù)據(jù)會(huì)導(dǎo)入財(cái)務(wù)系統(tǒng)中用于Netflix的營(yíng)收和納稅申報(bào)。為了實(shí)現(xiàn)上述功能,計(jì)費(fèi)工程包括:
批量作業(yè),為全球用戶群構(gòu)建經(jīng)常性更新訂單,匯總數(shù)據(jù)反饋至總賬(GL)用于所有支付方式包括禮券,讀取并發(fā)布到稅務(wù)引擎的稅務(wù)服務(wù)等日常營(yíng)收。產(chǎn)生的消息事件和流媒體/DVD基于客戶的賬單狀態(tài)保留事件。
Billing API向客戶服務(wù)平臺(tái)和網(wǎng)站提供計(jì)費(fèi)和禮券信息。除此之外,Billing API也是發(fā)起如會(huì)員注冊(cè),變更計(jì)劃,注銷,更新地址,拒付和退款請(qǐng)求等,處理用戶操作流程部分。集成了各種如會(huì)員賬戶服務(wù),支付處理,客戶服務(wù),客戶信息,DVD網(wǎng)站和發(fā)貨服務(wù)。
Billing系統(tǒng)在數(shù)據(jù)中心和云內(nèi)采用云原生系統(tǒng)進(jìn)行了集成。從高層次上來(lái)講,Netflix的預(yù)遷移架構(gòu)可能如下圖被抽取出來(lái):
考慮到代碼和數(shù)據(jù)與Oracle進(jìn)行交互的數(shù)目,Netflix的宗旨之一就是將基于Oracle系統(tǒng)的解決方案分離到一個(gè)基于服務(wù)的架構(gòu)中。Netflix的API其中一些需要跨區(qū)域性和高可用性。因此它們決定將數(shù)據(jù)分離到多個(gè)數(shù)據(jù)存儲(chǔ)庫(kù)。用戶數(shù)據(jù)被遷移到Cassandra數(shù)據(jù)庫(kù)。支付處理集成需要ACID事務(wù)操作.因此所有相關(guān)數(shù)據(jù)都被遷移到MYSQL。以下是Netflix貼出的遷移架構(gòu)表現(xiàn)形式。
挑戰(zhàn)
隨著Netflix著手遷移這項(xiàng)龐大任務(wù),也意味著它要所面臨許多挑戰(zhàn)。
遷移最好不要影響到面向用戶的流量。
為了迅速發(fā)展用戶群,AWS內(nèi)的新架構(gòu)必須要進(jìn)行擴(kuò)展。
自1997年Netflix成立以來(lái),產(chǎn)生了幾十億行數(shù)據(jù),不斷地改變和組成歷史數(shù)據(jù)。Oracle內(nèi)Netflix的大型共享數(shù)據(jù)庫(kù)數(shù)據(jù)分分鐘都在增長(zhǎng)。將這些數(shù)據(jù)遷移到AWS,首先要傳輸并將其實(shí)時(shí)同步到云內(nèi)兩位數(shù)TB的RDBMS。
作為一個(gè)SOX系統(tǒng)這又增加了一層復(fù)雜性,因?yàn)檎麄€(gè)遷移和工具作業(yè)需要遵循Netflix的SOX流程。
Netflix正是向全球擴(kuò)展業(yè)務(wù)的時(shí)候,Billing的遷移絕不能影響為自身遷移和全球發(fā)布忙的焦頭爛額地其它團(tuán)隊(duì)。
方案
Netflix遷移方案是按照簡(jiǎn)單的原則進(jìn)行——幫助Netflix確定前進(jìn)的方向。以下概述了最重要的部分:
挑戰(zhàn)復(fù)雜性與簡(jiǎn)化:雖然簡(jiǎn)單接受復(fù)雜的傳統(tǒng)系統(tǒng)比挑戰(zhàn)它要容易得多,但當(dāng)你“仰望”海量數(shù)據(jù)和代碼的時(shí)候,簡(jiǎn)化就成了關(guān)鍵。Netflix耗費(fèi)了幾天時(shí)間開(kāi)發(fā)并且反復(fù)要求自身進(jìn)行簡(jiǎn)化。
清理代碼:Netflix開(kāi)始將現(xiàn)有代碼清理到更小的有效模塊中,并率先遷移一些重要的相關(guān)方案——將稅務(wù)解決方案遷移到云。
接下來(lái),Netflix不再?gòu)腛racle系統(tǒng)表格中提取會(huì)員計(jì)費(fèi)歷史記錄,而是構(gòu)建了一個(gè)新的應(yīng)用程序捕獲計(jì)費(fèi)事件,只將所需數(shù)據(jù)遷移到新的Cassandra數(shù)據(jù)庫(kù),然后開(kāi)始在云內(nèi)提供全球計(jì)費(fèi)歷史記錄。
Netflix花了大把時(shí)間編寫(xiě)數(shù)據(jù)遷移工具,以便將會(huì)員計(jì)費(fèi)屬性跨Oracle系統(tǒng)內(nèi)表格轉(zhuǎn)換為更簡(jiǎn)單的Cassandra數(shù)據(jù)結(jié)構(gòu)。之后與DVD技術(shù)團(tuán)隊(duì)合作進(jìn)一步簡(jiǎn)化集成,然后清除過(guò)時(shí)的代碼。
清除數(shù)據(jù):Netflix認(rèn)真審查了所有表格,確保遷移所需數(shù)據(jù)。歷史計(jì)費(fèi)數(shù)據(jù)對(duì)法律和客戶服務(wù)團(tuán)隊(duì)很有價(jià)值。Netflix的目標(biāo)是僅將所需數(shù)據(jù)遷移到云。因此需要與受影響的團(tuán)隊(duì)合作找出它們真正需要的歷史數(shù)據(jù)部分。Netflix還確定了另一種數(shù)據(jù)存儲(chǔ)方案來(lái)服務(wù)這些團(tuán)隊(duì)的舊數(shù)據(jù)。之后再開(kāi)始清除無(wú)意義數(shù)據(jù)。
構(gòu)建工具來(lái)實(shí)現(xiàn)彈性與兼容性:Netflix的目標(biāo)是零宕機(jī)遷移應(yīng)用程序。為了實(shí)現(xiàn)這一目標(biāo)而構(gòu)建了代理和重定向工具以便將數(shù)據(jù)傳輸回?cái)?shù)據(jù)中心,幫助Netflix保持?jǐn)?shù)據(jù)中心內(nèi)的應(yīng)用程序不受變化影響,直到Netflix準(zhǔn)備遷移這些數(shù)據(jù)。
Netflix必須要構(gòu)建工具,支持SOX系統(tǒng)與Billing云基礎(chǔ)設(shè)施兼容,并確保應(yīng)對(duì)意料之外的開(kāi)發(fā)者操作和操作審核。
Netflix的云部署工具Spinnaker提高了對(duì)Chronos和大數(shù)據(jù)平臺(tái)捕獲部署信息和通道事件的能力以便審核。Netflix還強(qiáng)化了Cassandra客戶端用于身份驗(yàn)證和審核操作。此外,采用Atlas寫(xiě)入新通知用于監(jiān)控云內(nèi)應(yīng)用程序和數(shù)據(jù)。
在數(shù)據(jù)分析團(tuán)隊(duì)的幫助下,Netflix針對(duì)Oracle內(nèi)的數(shù)據(jù)制作了比較器,根據(jù)國(guó)家和報(bào)告不匹配度來(lái)協(xié)調(diào)Cassandra數(shù)據(jù)庫(kù)里用戶數(shù)據(jù)。為了實(shí)現(xiàn)以上目標(biāo),Netflix頻繁使用其大數(shù)據(jù)平臺(tái)捕獲部署事件,采用sqoop將它的Oracle數(shù)據(jù)庫(kù)和Cassandra集群傳輸?shù)紿ive。Netflix還寫(xiě)入了Hive查詢和MapReduce工作用于所需報(bào)告和儀表盤(pán)。
首先是用有限的新數(shù)據(jù)集進(jìn)行測(cè)試。隨著Netflix向新的國(guó)家進(jìn)軍,雖然提供了一個(gè)利用新數(shù)據(jù)測(cè)試Netflix云基礎(chǔ)設(shè)施的機(jī)會(huì),不會(huì)降低權(quán)重,但仍伴隨著很多挑戰(zhàn)。因此Netflix在云里針對(duì)所有面向用戶功能構(gòu)建了一個(gè)新的計(jì)費(fèi)基礎(chǔ)架構(gòu),集成了數(shù)據(jù)中心應(yīng)用程序來(lái)完成這個(gè)計(jì)費(fèi)流程。一旦新的國(guó)家數(shù)據(jù)在云內(nèi)被成功處理,那么向大型傳統(tǒng)國(guó)家拓展云業(yè)務(wù)也就信心十足了。尤其是在美國(guó),Netflix不僅支持流媒體還有DVD計(jì)費(fèi)。
分離面向用戶的流量避免宕機(jī)或其它遷移影響客戶體驗(yàn):Netflix在準(zhǔn)備將現(xiàn)有會(huì)員數(shù)據(jù)導(dǎo)入Cassandra時(shí),需要停機(jī)來(lái)暫停處理同時(shí)將用戶數(shù)據(jù)從Oracle遷移到Cassandra用于API和云內(nèi)批處理更新。所有的工具都是圍繞按需遷移一個(gè)國(guó)家隧道流量的能力構(gòu)建的。
Netflix致力于電子商務(wù)和會(huì)員服務(wù)將用戶工作流程集成改變?yōu)橐环N異步模式。Netflix構(gòu)建重試能力,重新運(yùn)行失敗處理然后按需重復(fù)此步驟。Netflix增加了積極的客戶狀態(tài)管理確保在處理被中止時(shí),會(huì)員不受影響。
以上,Netflix遷移了數(shù)百萬(wàn)行數(shù)據(jù),且用戶未受到任何明顯的影響。
遷移一個(gè)數(shù)據(jù)庫(kù)需要自身策略規(guī)劃:規(guī)劃數(shù)據(jù)庫(kù)遷移,同時(shí)還要以最終目標(biāo)為準(zhǔn)繩,否則可能會(huì)出錯(cuò)。遷移有很多決策制定,從存儲(chǔ)預(yù)測(cè)到吸收至少一年的數(shù)據(jù)增長(zhǎng)——轉(zhuǎn)化成若干所需實(shí)例,認(rèn)證成本用于產(chǎn)品和測(cè)試環(huán)境,采用RDS服務(wù)對(duì)應(yīng)管理大型EC2實(shí)例,確保數(shù)據(jù)庫(kù)架構(gòu)可解決數(shù)據(jù)的擴(kuò)展性,可用性以及可靠性。構(gòu)建災(zāi)備計(jì)劃,計(jì)劃可能的最低遷移宕機(jī)時(shí)間等等。作為遷移的一部分,Netflix決定從認(rèn)證的Oracle遷移到開(kāi)源MYSQL數(shù)據(jù)庫(kù),運(yùn)行Netflix管理的EC2實(shí)例。
雖然Netflix的訂閱處理采用了Cassandra數(shù)據(jù)庫(kù)數(shù)據(jù),但支付處理器需要RDBMS 的ACID功能進(jìn)行處理費(fèi)用交易。Netflix仍有一個(gè)多TB型數(shù)據(jù)庫(kù)由于TB局限性不適用于AWSRDS。借助Netflix平臺(tái)核心和數(shù)據(jù)庫(kù)工程,在不同區(qū)域內(nèi)利用DRBD復(fù)制和多個(gè)可讀取副本定義了一個(gè)多區(qū)域,可擴(kuò)展架構(gòu)進(jìn)行MYSQL控制。Netflix將所有的ETL處理遷移到副本避免主資源爭(zhēng)用。數(shù)據(jù)庫(kù)云工程針對(duì)MYSQL實(shí)例構(gòu)建了工具和通知,確保監(jiān)控和恢復(fù)需求。
其它大的挑戰(zhàn)是無(wú)宕機(jī)向AWS 內(nèi)MYSQL遷移不斷變化的數(shù)據(jù),經(jīng)過(guò)多種選擇探索,Netflix采用了Oracle GoldenGate進(jìn)行處理,它能伴隨不斷地遞增變化,跨不同數(shù)據(jù)庫(kù)復(fù)制表格。當(dāng)然,這是一個(gè)非常大的數(shù)據(jù)遷移,需要幾個(gè)月時(shí)間并行生產(chǎn)運(yùn)營(yíng)和其它遷移。Netflix進(jìn)行了反復(fù)測(cè)試然后針對(duì)MYSQL發(fā)布固定周期,運(yùn)行應(yīng)用。最后,經(jīng)過(guò)幾周,Netflix開(kāi)始在MYSQL上運(yùn)行測(cè)試數(shù)據(jù)庫(kù),在對(duì)Oracle系統(tǒng)做最終確認(rèn)和發(fā)布生產(chǎn)之前,測(cè)試和解決所有MYSQL代碼分支問(wèn)題。然后對(duì)MYSQL運(yùn)行測(cè)試環(huán)境,不斷構(gòu)建反饋循環(huán)。
1月4日,Netflix正式對(duì)MYSQL遷移處理流程和數(shù)據(jù)ETL。
Netflix的反思
雖然Netflix向云遷移相對(duì)順利,但回想一下,一些事可以做的更好。Netflix低估了自動(dòng)測(cè)試需要,沒(méi)有一個(gè)測(cè)試端對(duì)端流量的好辦法。前期如果在這些方面多花心思,開(kāi)發(fā)速度會(huì)更快。