服務(wù)高可用數(shù)據(jù)高可靠 京東共享型云數(shù)據(jù)庫淺談
作者:郭理靖
云數(shù)據(jù)庫服務(wù)是云平臺(tái)不可或缺的重要組成部分,它承載著用戶重要關(guān)系型數(shù)據(jù)落地,數(shù)據(jù)分拆,無縫擴(kuò)容等重要功能,而RDS(Relation Database Service)服務(wù)本身各家都有不同的實(shí)現(xiàn),本文嘗試分析京東共享型的云數(shù)據(jù)庫的一些特點(diǎn),架構(gòu)及技術(shù)實(shí)現(xiàn)相關(guān)的內(nèi)容。
云數(shù)據(jù)庫服務(wù)是云平臺(tái)不可或缺的重要組成部分,它承載著用戶重要關(guān)系型數(shù)據(jù)落地,數(shù)據(jù)分拆,無縫擴(kuò)容等重要功能,而RDS(Relation Database Service)服務(wù)本身各家都有不同的實(shí)現(xiàn),本文嘗試分析京東共享型的云數(shù)據(jù)庫的一些特點(diǎn),架構(gòu)及技術(shù)實(shí)現(xiàn)相關(guān)的內(nèi)容。
通常RDS服務(wù)提供商對(duì)每個(gè)用戶的數(shù)據(jù)庫申請(qǐng)會(huì)為其單獨(dú)分配一臺(tái)數(shù)據(jù)庫實(shí)例,通常這個(gè)實(shí)例也是單獨(dú)建立在一臺(tái)或者多臺(tái)虛擬機(jī)上的,這種服務(wù)提供方式可以提供相對(duì)高性能的解決方案,但是存在一個(gè)問題,如果為每個(gè)用戶的實(shí)例背后都是一個(gè)或者多個(gè)虛擬機(jī)的話,必然會(huì)導(dǎo)致總體成本的提高,而這種成本上的增加通常也不是必要的,因?yàn)榇蠖鄶?shù)中小型的業(yè)務(wù)是完全可以跑在同一個(gè)數(shù)據(jù)庫實(shí)例里的。這樣也就可以幫助那些中小開發(fā)者們大大的節(jié)省了成本問題,最終做到一個(gè)月幾塊錢的創(chuàng)業(yè)成本。另外也會(huì)存在一部分業(yè)務(wù)數(shù)據(jù)量和訪問量都比較大,不適合同其他用戶一起跑在同一個(gè)數(shù)據(jù)庫實(shí)例里,這部分用戶就比較合適獨(dú)立一個(gè)數(shù)據(jù)庫的實(shí)例。京東云數(shù)據(jù)庫考慮到了這兩種不同的需求,所以單獨(dú)開發(fā)了共享型云數(shù)據(jù)庫平臺(tái),獨(dú)享型數(shù)據(jù)庫平臺(tái)兩套系統(tǒng),同時(shí)又支持無縫地從一個(gè)平臺(tái)遷移到另一個(gè)平臺(tái)上。
共享型云數(shù)據(jù)庫最大的特點(diǎn)就是低成本,同時(shí)又不會(huì)犧牲數(shù)據(jù)庫的可用性和可靠性,即使很多個(gè)用戶共享同一個(gè)數(shù)據(jù)庫實(shí)例,每個(gè)用戶也都是有自己單獨(dú)獨(dú)立的備份,主從互備等支持。 這種方案的幾個(gè)技術(shù)上的關(guān)鍵點(diǎn)在于如何做到用戶資源的有效隔離,數(shù)據(jù)庫的平滑擴(kuò)容升級(jí)等。
京東共享型云數(shù)據(jù)庫架構(gòu)
1.Shared RDS API對(duì)外提供create/delete/describe等管理共享型數(shù)據(jù)庫的接口
2.對(duì)于創(chuàng)建數(shù)據(jù)庫Shared RDS API會(huì)根據(jù)DB資源池負(fù)載信息選擇一個(gè)適合的實(shí)例為用戶創(chuàng)建數(shù)據(jù)庫,并更新集群路由到JManager
3.JManager管理整個(gè)集群路由信息,收到的任何路由變更同步到JProxy路由節(jié)點(diǎn)
4.JProxy路由節(jié)點(diǎn)對(duì)外提供透明的MySQL代理服務(wù),根據(jù)路由信息將用戶請(qǐng)求發(fā)送到用戶所在的數(shù)據(jù)庫實(shí)例上
5.每個(gè)數(shù)據(jù)庫實(shí)例根據(jù)資源使用情況超過指定閾值,會(huì)由JTransfer模塊將數(shù)據(jù)遷移到空閑的實(shí)例上
6.Cron模塊定時(shí)通過RDS API動(dòng)態(tài)為資源池增加空閑資源
此外,京東共享型的云數(shù)據(jù)庫做到了以下關(guān)鍵技術(shù)實(shí)現(xiàn):
1. 租戶隔離。多個(gè)租戶共享同一數(shù)據(jù)庫實(shí)例必然需要一個(gè)有效的隔離方案,防止一個(gè)用戶的慢查詢請(qǐng)求或惡意請(qǐng)求影響其他用戶訪問。這里的隔離實(shí)現(xiàn)方式是通過JProxy層對(duì)用戶所有的訪問進(jìn)行了攔截,并根據(jù)用戶訪問的數(shù)據(jù)表索引信息等,對(duì)用戶執(zhí)行該請(qǐng)求所需資源進(jìn)行預(yù)判,并攔截掉惡意的請(qǐng)求及影響其他用戶的請(qǐng)求。同時(shí)為了精確控制每個(gè)用戶的資源使用,整個(gè)系統(tǒng)針對(duì)用戶使用的連接數(shù),內(nèi)存占用容量,磁盤空間使用情況,帶寬流量等都做了有效的記錄和監(jiān)控并根據(jù)用戶的配額進(jìn)行控制。
2. 集群路由信息高一致性保障。整體集群采用經(jīng)典的弱中心化集群結(jié)構(gòu),在滿足集群高性能的基礎(chǔ)上同時(shí)具備足夠的可控性,JManager管理整個(gè)集群路由信息,并通過多個(gè)Slave避免單點(diǎn)故障,當(dāng)路由變更時(shí),JManager首先同步路由變更信息給自己的Slave,然后才會(huì)同步所有的JProxy,避免路由變更時(shí)JManager掛掉導(dǎo)致路由不一致。
3. 高可用保障。整體集群所有節(jié)點(diǎn)無單點(diǎn),用戶的數(shù)據(jù)庫會(huì)通過zookeeper做主從的高可用,如果用戶主庫掛掉,會(huì)自動(dòng)切換至從庫,并重新綁定floating ip到從庫,不會(huì)影響對(duì)用戶的服務(wù)
4. 用戶數(shù)據(jù)庫無縫升級(jí)擴(kuò)容。當(dāng)用戶的數(shù)據(jù)庫數(shù)據(jù)增長超過指定配額時(shí),用戶可以選擇升級(jí)數(shù)據(jù)庫,系統(tǒng)會(huì)自動(dòng)根據(jù)資源池使用情況將用戶數(shù)據(jù)庫遷移到比較空閑的實(shí)例上,遷移過程中并不會(huì)影響用戶的服務(wù)。通過定時(shí)自動(dòng)為用戶數(shù)據(jù)庫做快照的方式,結(jié)合數(shù)據(jù)庫binlog同步工具,來幫助用戶實(shí)現(xiàn)增量備份,遷移的工作也是依賴于以上這些工具完成的。
共享型云數(shù)據(jù)庫是為降低開發(fā)者成本而生,同時(shí)提供服務(wù)高可用和數(shù)據(jù)高可靠的保障,這和京東云擎的服務(wù)對(duì)象是一致的。共享型云數(shù)據(jù)庫實(shí)現(xiàn)關(guān)鍵技術(shù)在于資源隔離,訪問控制及數(shù)據(jù)庫無縫擴(kuò)容升級(jí)等工作。對(duì)于創(chuàng)業(yè)初期數(shù)據(jù)量和訪問量都不大的業(yè)務(wù)開發(fā)者來說,共享型云數(shù)據(jù)庫是一個(gè)非常不錯(cuò)的選擇。
責(zé)任編輯:張玉
來源:
京東云平臺(tái)開發(fā)者服務(wù)部研發(fā)總監(jiān)