數(shù)據(jù)庫軟件架構(gòu)設(shè)計(jì)拾遺

轉(zhuǎn)自:https://www.w3cschool.cn/architectroad/architectroad-database-architecture-design.html

一、基本概念


概念一“單庫”

單庫

概念二“分片”

分片

分片解決的是“數(shù)據(jù)量太大”的問題再菊,也就是通常說的“水平切分”爪喘。

一旦引入分片,勢(shì)必有“數(shù)據(jù)路由”的概念纠拔,哪個(gè)數(shù)據(jù)訪問哪個(gè)庫秉剑。

路由規(guī)則通常有3種方法:

(1)范圍:range

優(yōu)點(diǎn):簡(jiǎn)單,容易擴(kuò)展

缺點(diǎn):各庫壓力不均(新號(hào)段更活躍)

(2)哈希:hash

優(yōu)點(diǎn):簡(jiǎn)單稠诲,數(shù)據(jù)均衡侦鹏,負(fù)載均勻

缺點(diǎn):遷移麻煩(2庫擴(kuò)3庫數(shù)據(jù)要遷移)

(3)路由服務(wù):router-config-server

優(yōu)點(diǎn):靈活性強(qiáng),業(yè)務(wù)與路由算法解耦

缺點(diǎn):每次訪問數(shù)據(jù)庫前多一次查詢

大部分互聯(lián)網(wǎng)公司采用的方案二:哈希分庫臀叙,哈希路由

概念三“分組”

分組

分組解決“可用性”問題略水,分組通常通過主從復(fù)制的方式實(shí)現(xiàn)。

互聯(lián)網(wǎng)公司數(shù)據(jù)庫實(shí)際軟件架構(gòu)是:又分片匹耕,又分組(如下圖)

實(shí)際應(yīng)用:分組+分片

二聚请、數(shù)據(jù)庫架構(gòu)設(shè)計(jì)思路


數(shù)據(jù)庫軟件架構(gòu)師平時(shí)設(shè)計(jì)些什么東西呢?至少要考慮以下四點(diǎn):

(1)如何保證數(shù)據(jù)可用性

(2)如何提高數(shù)據(jù)庫讀性能(大部分應(yīng)用讀多寫少,讀會(huì)先成為瓶頸)

(3)如何保證一致性

(4)如何提高擴(kuò)展性

2.1如何保證數(shù)據(jù)的可用性驶赏?

解決可用性問題的思路是=>冗余

如何保證站點(diǎn)的可用性炸卑?復(fù)制站點(diǎn),冗余站點(diǎn)

如何保證服務(wù)的可用性煤傍?復(fù)制服務(wù)盖文,冗余服務(wù)

如何保證數(shù)據(jù)的可用性?復(fù)制數(shù)據(jù)蚯姆,冗余數(shù)據(jù)

數(shù)據(jù)的冗余五续,會(huì)帶來一個(gè)副作用=>引發(fā)一致性問題(先不說一致性問題,先說可用性)

如何保證數(shù)據(jù)庫“讀”高可用龄恋?

冗余讀庫

“讀”高可用

冗余讀庫帶來的副作用疙驾?讀寫有延時(shí),可能不一致

上面這個(gè)圖是很多互聯(lián)網(wǎng)公司mysql的架構(gòu)郭毕,寫仍然是單點(diǎn)它碎,不能保證寫高可用。

如何保證數(shù)據(jù)庫“寫”高可用显押?

冗余寫庫

“寫”高可用

采用雙主互備的方式扳肛,可以冗余寫庫

帶來的副作用?雙寫同步乘碑,數(shù)據(jù)可能沖突(例如“自增id”同步?jīng)_突),如何解決同步?jīng)_突挖息,有兩種常見解決方案:

(1)兩個(gè)寫庫使用不同的初始值,相同的步長(zhǎng)來增加id:1寫庫的id為0,2,4,6...兽肤;2寫庫的id為1,3,5,7…

(2)不使用數(shù)據(jù)的id套腹,業(yè)務(wù)層自己生成唯一的id,保證數(shù)據(jù)不沖突

58同城沒有使用上述兩種架構(gòu)來做讀寫的“高可用”轿衔,58同城采用的是“雙主當(dāng)主從用”的方式:


雙主方式

仍是雙主沉迹,但只有一個(gè)主提供服務(wù)(讀+寫),另一個(gè)主是“shadow-master”害驹,只用來保證高可用鞭呕,平時(shí)不提供服務(wù)。

master掛了宛官,shadow-master頂上(vip漂移葫松,對(duì)業(yè)務(wù)層透明,不需要人工介入)

這種方式的好處

1)讀寫沒有延時(shí)

2)讀寫高可用

不足

1)不能通過加從庫的方式擴(kuò)展讀性能

2)資源利用率為50%底洗,一臺(tái)冗余主沒有提供服務(wù)

那如何提高讀性能呢腋么?進(jìn)入第二個(gè)話題,如何提供讀性能亥揖。

2.2如何擴(kuò)展讀性能珊擂?

提高讀性能的方式大致有三種圣勒,第一種是建立索引。這種方式不展開摧扇,要提到的一點(diǎn)是圣贸,不同的庫可以建立不同的索引。

建立索引

寫庫不建立索引扛稽;

線上讀庫建立線上訪問索引吁峻,例如uid;

線下讀庫建立線下訪問索引在张,例如time用含;

第二種擴(kuò)充讀性能的方式是,增加從庫帮匾,這種方法大家用的比較多啄骇,但是,存在兩個(gè)缺點(diǎn):

(1)從庫越多辟狈,同步越慢

(2)同步越慢肠缔,數(shù)據(jù)不一致窗口越大(不一致后面說,還是先說讀性能的提高)

58同城沒有采用這種方法提高數(shù)據(jù)庫讀性能(沒有從庫)哼转,采用的是增加緩存。常見的緩存架構(gòu)如下:

常見玩法:緩存+數(shù)據(jù)

上游是業(yè)務(wù)應(yīng)用槽华,下游是主庫壹蔓,從庫(讀寫分離),緩存猫态。

58同城的玩法是:服務(wù)+數(shù)據(jù)庫+緩存一套

58玩法:服務(wù)+緩存+數(shù)據(jù)

業(yè)務(wù)層不直接面向db和cache佣蓉,服務(wù)層屏蔽了底層db、cache的復(fù)雜性亲雪。為什么要引入服務(wù)層勇凭,今天不展開,58采用了“服務(wù)+數(shù)據(jù)庫+緩存一套”的方式提供數(shù)據(jù)訪問义辕,用cache提高讀性能虾标。

不管采用主從的方式擴(kuò)展讀性能,還是緩存的方式擴(kuò)展讀性能灌砖,數(shù)據(jù)都要復(fù)制多份(主+從璧函,db+cache),一定會(huì)引發(fā)一致性問題基显。

2.3如何保證一致性蘸吓?

主從數(shù)據(jù)庫的一致性,通常有兩種解決方案:

(1)中間件

中間件

如果某一個(gè)key有寫操作撩幽,在不一致時(shí)間窗口內(nèi)库继,中間件會(huì)將這個(gè)key的讀操作也路由到主庫上。

這個(gè)方案的缺點(diǎn)是,數(shù)據(jù)庫中間件的門檻較高(百度宪萄,騰訊艺谆,阿里,360等一些公司有雨膨,當(dāng)然58也有)

(2)強(qiáng)制讀主

雙主方式

58的“雙主當(dāng)主從用”的架構(gòu)擂涛,不存在主從不一致的問題。

第二類不一致聊记,是db與緩存間的不一致


常見玩法:緩存+數(shù)據(jù)

常見的緩存架構(gòu)如上撒妈,此時(shí)寫操作的順序是

(1)淘汰cache

(2)寫數(shù)據(jù)庫

讀操作的順序是

(1)讀cache,如果cache hit則返回

(2)如果cache miss排监,則讀從庫

(3)讀從庫后狰右,將數(shù)據(jù)放回cache

在一些異常時(shí)序情況下,有可能從【從庫讀到舊數(shù)據(jù)(同步還沒有完成)舆床,舊數(shù)據(jù)入cache后】棋蚌,數(shù)據(jù)會(huì)長(zhǎng)期不一致。

解決辦法是“緩存雙淘汰”挨队,寫操作時(shí)序升級(jí)為:

(1)淘汰cache

(2)寫數(shù)據(jù)庫

(3)在經(jīng)驗(yàn)“主從同步延時(shí)窗口時(shí)間”后谷暮,再次發(fā)起一個(gè)異步淘汰cache的請(qǐng)求

這樣,即使有臟數(shù)據(jù)如cache盛垦,一個(gè)小的時(shí)間窗口之后湿弦,臟數(shù)據(jù)還是會(huì)被淘汰。帶來的代價(jià)是腾夯,多引入一次讀miss(成本可以忽略)颊埃。

除此之外,58同城的最佳實(shí)踐之一是:建議為所有cache中的item設(shè)置一個(gè)超時(shí)時(shí)間蝶俱。

說完一致性班利,最后一個(gè)話題是擴(kuò)展性。

2.4如何提高數(shù)據(jù)庫的擴(kuò)展性榨呆?

原來用hash的方式路由罗标,分為2個(gè)庫,數(shù)據(jù)量還是太大愕提,要分為3個(gè)庫馒稍,勢(shì)必需要進(jìn)行數(shù)據(jù)遷移,58同城有一個(gè)很帥氣的“數(shù)據(jù)庫秒級(jí)擴(kuò)容”方案浅侨。

如何秒級(jí)擴(kuò)容纽谒?

首先,我們不做2庫變3庫的擴(kuò)容如输,我們做2庫變4庫(庫加倍)的擴(kuò)容(未來4->8->16)

2庫變4庫前

服務(wù)+數(shù)據(jù)庫是一套(省去了緩存)

數(shù)據(jù)庫采用“雙主”的模式鼓黔。

擴(kuò)容步驟:

第一步央勒,將一個(gè)主庫提升

第二步,修改配置澳化,2庫變4庫(原來MOD2崔步,現(xiàn)在配置修改后MOD4)

擴(kuò)容完成

2庫變4庫

原MOD2為偶的部分,現(xiàn)在會(huì)MOD4余0或者2

原MOD2為奇的部分缎谷,現(xiàn)在會(huì)MOD4余1或者3

數(shù)據(jù)不需要遷移井濒,同時(shí),雙主互相同步列林,一遍是余0瑞你,一邊余2,兩邊數(shù)據(jù)同步也不會(huì)沖突希痴,秒級(jí)完成擴(kuò)容者甲!

最后,要做一些收尾工作:

(1)將舊的雙主同步解除

(2)增加新的雙主(雙主是保證可用性的砌创,shadow-master平時(shí)不提供服務(wù))

(3)刪除多余的數(shù)據(jù)(余0的主虏缸,可以將余2的數(shù)據(jù)刪除掉)

2庫變4庫完成

這樣,秒級(jí)別內(nèi)嫩实,我們就完成了2庫變4庫的擴(kuò)展刽辙。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市甲献,隨后出現(xiàn)的幾起案子扫倡,更是在濱河造成了極大的恐慌,老刑警劉巖竟纳,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異疚鲤,居然都是意外死亡锥累,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門集歇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桶略,“玉大人,你說我怎么就攤上這事诲宇〖始撸” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵姑蓝,是天一觀的道長(zhǎng)鹅心。 經(jīng)常有香客問我,道長(zhǎng)纺荧,這世上最難降的妖魔是什么旭愧? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任颅筋,我火速辦了婚禮,結(jié)果婚禮上输枯,老公的妹妹穿的比我還像新娘议泵。我一直安慰自己,他們只是感情好桃熄,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布先口。 她就那樣靜靜地躺著,像睡著了一般瞳收。 火紅的嫁衣襯著肌膚如雪碉京。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天缎讼,我揣著相機(jī)與錄音收夸,去河邊找鬼。 笑死血崭,一個(gè)胖子當(dāng)著我的面吹牛卧惜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播夹纫,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼咽瓷,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了舰讹?” 一聲冷哼從身側(cè)響起茅姜,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎月匣,沒想到半個(gè)月后钻洒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锄开,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年素标,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萍悴。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡头遭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出癣诱,到底是詐尸還是另有隱情计维,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布撕予,位于F島的核電站鲫惶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嗅蔬。R本人自食惡果不足惜剑按,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一疾就、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧艺蝴,春花似錦猬腰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缩擂,卻和暖如春鼠冕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胯盯。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國打工懈费, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人博脑。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓憎乙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親叉趣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泞边,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容