京東資深架構(gòu)師張成遠(yuǎn):京東分布式數(shù)據(jù)庫是如何煉成的?
原創(chuàng)作為國內(nèi)***梯隊(duì)的電商企業(yè),京東擁有億萬用戶,每天要應(yīng)對(duì)數(shù)以千百萬計(jì)的訪問需求,在其架構(gòu)和管理方面有何妙招來對(duì)數(shù)據(jù)加以支撐呢?在會(huì)上,51TO記者采訪了京東資深架構(gòu)師張成遠(yuǎn)。
張成遠(yuǎn),《Mariadb原理與實(shí)現(xiàn)》作者,開源項(xiàng)目speedy作者。目前就職于京東數(shù)據(jù)庫系統(tǒng)研發(fā)團(tuán)隊(duì),負(fù)責(zé)京東分布式數(shù)據(jù)庫系統(tǒng)架構(gòu)與研發(fā)工作,主導(dǎo)了京東分布式數(shù)據(jù)庫系統(tǒng)在公司的落地及大規(guī)模推廣。擅長高性能服務(wù)器開發(fā),擅長分布式數(shù)據(jù)庫/存儲(chǔ)/緩存等大規(guī)模分布式系統(tǒng)架構(gòu)。
分布式數(shù)據(jù)庫的技術(shù)核心
京東每天面對(duì)海量的數(shù)據(jù)處理采用的是分布式數(shù)據(jù)庫的系統(tǒng),其核心技術(shù)及思路又是怎樣的呢?
張成遠(yuǎn)表示,京東分布式數(shù)據(jù)庫的關(guān)鍵是引入中間件的方式來提供對(duì)數(shù)據(jù)的拆分,解決了業(yè)務(wù)上單機(jī)扛不住數(shù)據(jù)量的問題。對(duì)于業(yè)務(wù)來說,在單機(jī)扛不住的情況下還要自己去關(guān)注數(shù)據(jù),這樣它的負(fù)擔(dān)會(huì)非常重,所以京東采用了分布式數(shù)據(jù)庫的方案,讓業(yè)務(wù)可以比較方便的使用。京東會(huì)進(jìn)入MySQL的協(xié)議,提供代理的方式,把整個(gè)集群管理好,業(yè)務(wù)接入時(shí)只需要用原生的MySQL客戶端來使用就可以,所以對(duì)于業(yè)務(wù)的使用負(fù)擔(dān)會(huì)非常的輕。同時(shí)京東也有非常完善的監(jiān)控,所以能夠保證業(yè)務(wù)接入以后系統(tǒng)的穩(wěn)定和可靠。
數(shù)據(jù)庫的設(shè)計(jì)架構(gòu)
京東對(duì)容量非常的重視。在前期設(shè)計(jì)過程中,需要針對(duì)業(yè)務(wù)進(jìn)行未來一到兩年甚至兩到三年的容量預(yù)估,來進(jìn)行合理的資源配置。以及考慮到未來擴(kuò)容的需求,京東可以實(shí)現(xiàn)在業(yè)務(wù)增長的情況下自動(dòng)化擴(kuò)容。
京東在發(fā)展過程中,早期的一些業(yè)務(wù)可能放在Oracle里面,也有一些數(shù)據(jù)量較小的業(yè)務(wù)是放在MySQL里面。簡(jiǎn)單說,因?yàn)閱螜C(jī)的數(shù)據(jù)量放不下,如果采用分布式數(shù)據(jù)庫我們能夠把它的數(shù)據(jù)進(jìn)行拆分,相當(dāng)于可以獲取到一個(gè)容量比原來大很多的數(shù)據(jù)庫。
分布式數(shù)據(jù)庫可以存放所有的關(guān)系型存儲(chǔ)數(shù)據(jù),并且還可以支撐京東非常多的核心系統(tǒng)。例如訂單、商品、物流還有財(cái)務(wù)等等。
數(shù)據(jù)的可靠性
但是在這個(gè)過程中,數(shù)據(jù)的可靠性又是如何保障的呢?
張成遠(yuǎn)表示數(shù)據(jù)的可靠性有兩點(diǎn),一是服務(wù)本身是高可用的,二是數(shù)據(jù)本身是高可靠的。
比如說MySQL層面,我們通過主層,分布式數(shù)據(jù)庫中間件層面,因?yàn)槲覀儽旧硎菬o狀態(tài)的,所以可以部署多份,來解決高可用的問題。關(guān)于數(shù)據(jù)本身高可靠的問題,我們會(huì)對(duì)數(shù)據(jù)庫里面的數(shù)據(jù)定期進(jìn)行備份,所以哪怕有誤操作或者其他任何問題,都可以完整的恢復(fù)回來。
分布式事物的難點(diǎn)
在實(shí)現(xiàn)整個(gè)分布式數(shù)據(jù)庫的系統(tǒng)的過程中也不可避免面臨一些困難,比如分布式節(jié)點(diǎn)相關(guān),京東團(tuán)隊(duì)又是如何解決的呢?分布式事物相關(guān)最難的問題在于事物的原子性很難保證,一個(gè)訪問可能涉及多個(gè)節(jié)點(diǎn),并且每個(gè)節(jié)點(diǎn)可能都有問題。尤其是基于MySQL層面做分布式數(shù)據(jù)庫,因?yàn)槊總€(gè)節(jié)點(diǎn)事物的ID不一樣,但如果基于存儲(chǔ)的不是MySQL而是其他層面,相對(duì)來說會(huì)有類似兩階段提交的協(xié)議可以參考,從而解決問題。
很多人會(huì)關(guān)心到分布式數(shù)據(jù)庫能否保證數(shù)據(jù)的一致性,張成遠(yuǎn)認(rèn)為這不是一致性的問題,而是關(guān)系到的分布式事物的原子性的問題。從本質(zhì)上說如果事物涉及到多個(gè)節(jié)點(diǎn),并且節(jié)點(diǎn)異常,為滿足業(yè)務(wù)的需求會(huì)引入相關(guān)系統(tǒng),可以把丟失的東西補(bǔ)回來。還有一種方法,就是在使用上和業(yè)務(wù)溝通,將相關(guān)的事務(wù)進(jìn)行拆解。拆分后,每次的訪問之落在一個(gè)分部或者節(jié)點(diǎn)上,如此一來可以保證每次的訪問要么成功要么失敗,可以很巧妙的從另一個(gè)方式繞過這個(gè)問題,用來保證原子性。
采訪***
國內(nèi)不乏綜合型電商平臺(tái),而京東卻是中國***的自營式電商企業(yè),是中國***個(gè)成功赴美上市的大型綜合性電商平臺(tái),同時(shí)與騰訊、百度等中國互聯(lián)網(wǎng)巨頭共同躋身全球前十大互聯(lián)網(wǎng)公司排行榜,京東的成功與其有著優(yōu)秀的數(shù)據(jù)庫管理是密不可分的。