国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
一步步帶你了解分布式數(shù)據(jù)庫(kù)的架構(gòu)演變之路!

MyCat 是一個(gè)數(shù)據(jù)庫(kù)分庫(kù)分表中間件,使用 MyCat 可以非常方便地實(shí)現(xiàn)數(shù)據(jù)庫(kù)的分庫(kù)分表查詢,并且減少項(xiàng)目中的業(yè)務(wù)代碼。今天我們將通過(guò)數(shù)據(jù)庫(kù)架構(gòu)發(fā)展的演變來(lái)介紹 MyCat 的誕生背景,以及 MyCat 在其中扮演的角色,從而使得大家對(duì) MyCat 的誕生及其作用有深入的理解。

1單數(shù)據(jù)庫(kù)架構(gòu)

一個(gè)項(xiàng)目在初期的時(shí)候,為了盡可能快地驗(yàn)證市場(chǎng),其對(duì)業(yè)務(wù)系統(tǒng)的最大要求是快速實(shí)現(xiàn)。在這個(gè)階段,代碼開發(fā)人員為了能快速實(shí)現(xiàn)業(yè)務(wù)系統(tǒng),一般都是將所有層級(jí)(MVC)的業(yè)務(wù)代碼都寫在同一個(gè)項(xiàng)目中,所有的業(yè)務(wù)數(shù)據(jù)都存放在同一個(gè)數(shù)據(jù)庫(kù)中。此時(shí),項(xiàng)目的整體架構(gòu)圖如下所示:

單數(shù)據(jù)庫(kù)架構(gòu)

從上圖可以看到,我們?cè)谝粋€(gè)項(xiàng)目中集中了注冊(cè)、登陸、購(gòu)物三個(gè)模塊的業(yè)務(wù)代碼,并且這三個(gè)業(yè)務(wù)模塊都讀取同一個(gè)業(yè)務(wù)數(shù)據(jù)庫(kù)。

但隨著項(xiàng)目的不斷推進(jìn),用戶量不斷增長(zhǎng),單臺(tái)應(yīng)用服務(wù)器已經(jīng)無(wú)法承受如此巨大的流量了。此時(shí)常見(jiàn)的做法是把項(xiàng)目進(jìn)行分布式部署,分散單臺(tái)服務(wù)器的流量,從而可以暫時(shí)緩解用戶增長(zhǎng)帶來(lái)的應(yīng)用服務(wù)器壓力。此時(shí)的項(xiàng)目架構(gòu)圖如下所示:

分布式部署-單數(shù)據(jù)庫(kù)架構(gòu)

但隨著我們部署的應(yīng)用服務(wù)器越來(lái)越多,后端的單臺(tái)數(shù)據(jù)庫(kù)服務(wù)器已經(jīng)無(wú)法承受如此巨大的流量了。為了盡快緩解用戶訪問(wèn)壓力,我們一般是在應(yīng)用服務(wù)器與數(shù)據(jù)庫(kù)服務(wù)器中間加多一個(gè)緩存層,通過(guò)緩存可以抵消掉一部分的數(shù)據(jù)庫(kù)查詢操作。此時(shí)的項(xiàng)目架構(gòu)圖如下所示:

分布式部署-緩存-單數(shù)據(jù)庫(kù)架構(gòu)

但是增加數(shù)據(jù)庫(kù)緩存層只能緩解數(shù)據(jù)庫(kù)訪問(wèn)壓力,攔截部分?jǐn)?shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求。隨著用戶訪問(wèn)量的進(jìn)一步增長(zhǎng),數(shù)據(jù)庫(kù)訪問(wèn)的瓶頸還是會(huì)進(jìn)一步凸顯。這個(gè)時(shí)候,我們不得不對(duì)數(shù)據(jù)層的架構(gòu)進(jìn)行改造。

2主從數(shù)據(jù)庫(kù)架構(gòu)

這個(gè)時(shí)候常用的解決方案就是將原本單臺(tái)數(shù)據(jù)庫(kù)服務(wù)器變成主從模式的數(shù)據(jù)庫(kù)服務(wù)器,即一臺(tái)數(shù)據(jù)庫(kù)作為主庫(kù)支持寫入數(shù)據(jù),一臺(tái)數(shù)據(jù)庫(kù)作為讀庫(kù)支持查詢數(shù)據(jù)。此時(shí)項(xiàng)目的架構(gòu)圖如下所示:

主從數(shù)據(jù)庫(kù)架構(gòu)

我們通過(guò)數(shù)據(jù)庫(kù)主從同步實(shí)現(xiàn)了讀寫分離,將所有讀操作都引導(dǎo)到從庫(kù)進(jìn)行,將所有寫操作都引導(dǎo)到主庫(kù)進(jìn)行。

因?yàn)槲覀儗?duì)數(shù)據(jù)庫(kù)層進(jìn)行了改造,規(guī)定所有讀數(shù)據(jù)庫(kù)操作要訪問(wèn)從庫(kù),所有寫數(shù)據(jù)庫(kù)操作要訪問(wèn)主庫(kù),那么我們就必須對(duì)原來(lái)的代碼進(jìn)行改造。

public User selectUser(){
   dataTemplate.selectById(...);
}
public User insertUser(){
   dataTemplate.insert(user);
}

上面是改造前的代碼,無(wú)論是讀操作還是寫操作,我們都使用同一個(gè)數(shù)據(jù)源進(jìn)行操作。但為了適應(yīng)新的數(shù)據(jù)庫(kù)架構(gòu),我們必須在代碼中手動(dòng)判斷應(yīng)該請(qǐng)求哪個(gè)數(shù)據(jù)源。

public User selectUser(){
   readTemplate.selectById(...);
}
public User insertUser(){
   writeTemplate.insert(user);
}

經(jīng)過(guò)修改后的代碼,開發(fā)根據(jù)自身經(jīng)驗(yàn)判斷應(yīng)該選擇哪個(gè)數(shù)據(jù)源進(jìn)行操作。當(dāng)是讀操作的時(shí)候,我們選擇 readTemplate。當(dāng)是寫操作的時(shí)候,我們選擇 writeTemplate。

但作為一個(gè)程序員,我們隱隱約約覺(jué)得識(shí)別應(yīng)該用哪個(gè)數(shù)據(jù)源這個(gè)判斷不應(yīng)該人工判斷,而應(yīng)該自動(dòng)讓代碼去判斷。畢竟這個(gè)判斷的模式很簡(jiǎn)單 —— 如果是 select 那么就用讀的數(shù)據(jù)源,如果是其他那么就用寫的數(shù)據(jù)源。

其實(shí)這個(gè)就是 MyCat 的用途之一,即作為一個(gè)數(shù)據(jù)庫(kù)中間件去解決數(shù)據(jù)源判斷問(wèn)題。如果我們使用 MyCat 作為數(shù)據(jù)庫(kù)中間件,那么我們不需要關(guān)心我應(yīng)該使用哪個(gè)數(shù)據(jù)源。MyCat 幫我們屏蔽了不同數(shù)據(jù)源的差異,對(duì)于我們來(lái)說(shuō)就只有一個(gè)數(shù)據(jù)源,這個(gè)數(shù)據(jù)源能處理寫操作,也能處理讀操作。上面查詢和插入的代碼就可以變成下面這樣:

public User selectUser(){
   dataTemplate.selectById(...);
}
public User insertUser(){
   dataTemplate.insert(user);
}

實(shí)現(xiàn)了主從數(shù)據(jù)庫(kù)架構(gòu),再使用 MyCat,你發(fā)現(xiàn)我們并不需要去修改太多的代碼,只需要將數(shù)據(jù)源改為 MyCat 地址即可。MyCat 自動(dòng)把我們所有的語(yǔ)句發(fā)送給后端的 MySQL 服務(wù)器。

當(dāng)我們使用了主從數(shù)據(jù)庫(kù)架構(gòu)之后,我們會(huì)發(fā)現(xiàn)我們能支撐更多的用戶訪問(wèn)和請(qǐng)求了。但隨著業(yè)務(wù)的進(jìn)一步發(fā)展,其實(shí)可以發(fā)現(xiàn)會(huì)存在一些問(wèn)題:

  • 當(dāng)我們修改了注冊(cè)模塊的時(shí)候,我們需要整個(gè)項(xiàng)目都發(fā)布一次,這樣會(huì)影響到登錄、購(gòu)物模塊的正常使用。

  • 即使每次改動(dòng)的代碼即使很小,我們還是需要發(fā)布整個(gè)項(xiàng)目包,這使得每次發(fā)布的代碼包非常巨大。

  • 隨著業(yè)務(wù)量的不斷增長(zhǎng),我們會(huì)發(fā)現(xiàn)即使實(shí)現(xiàn)了主從的讀寫分離,數(shù)據(jù)庫(kù)的壓力也是非常大,似乎快要承受不了了。

上面說(shuō)的這些問(wèn)題只是實(shí)戰(zhàn)中遇到的一部分問(wèn)題,事實(shí)上遇到的問(wèn)題只會(huì)更多不會(huì)更少,而且隨著業(yè)務(wù)的不斷發(fā)展會(huì)愈加凸顯。

3垂直切分?jǐn)?shù)據(jù)庫(kù)架構(gòu)

此時(shí)為了各個(gè)業(yè)務(wù)模塊不互相影響,我們把應(yīng)用層進(jìn)行垂直拆分,即把注冊(cè)模塊、登陸模塊、購(gòu)物模塊都單獨(dú)作為一個(gè)應(yīng)用系統(tǒng),分別讀寫?yīng)毩⒌臄?shù)據(jù)庫(kù)服務(wù)器。此時(shí),我們的系統(tǒng)架構(gòu)圖如下圖所示:

垂直切分?jǐn)?shù)據(jù)庫(kù)架構(gòu)

實(shí)現(xiàn)了垂直拆分之后,我們可以成功解決上面說(shuō)到的三個(gè)問(wèn)題:業(yè)務(wù)模塊相互影響問(wèn)題、單數(shù)據(jù)庫(kù)壓力問(wèn)題。

但是隨著業(yè)務(wù)的進(jìn)一步擴(kuò)大,我們又增加了許多業(yè)務(wù)模塊:客服模塊、錢包模塊、個(gè)人中心模塊、收藏夾模塊、訂單模塊等。按照我們之前所設(shè)計(jì)的數(shù)據(jù)庫(kù)架構(gòu),我們會(huì)存在許多個(gè)數(shù)據(jù)源,這些數(shù)據(jù)源分散在各個(gè)項(xiàng)目中:

  • 用戶數(shù)據(jù)庫(kù)  192.168.0.1

  • 商品數(shù)據(jù)庫(kù)  192.168.0.2

  • 短信數(shù)據(jù)庫(kù)  192.168.0.3

  • 客服數(shù)據(jù)庫(kù)  192.168.0.4

  • 錢包數(shù)據(jù)庫(kù)  192.168.0.5

  • ……

對(duì)于一個(gè)項(xiàng)目管理者來(lái)說(shuō),這么多的數(shù)據(jù)源分散在不同項(xiàng)目中,怎么統(tǒng)一管理是一個(gè)問(wèn)題。很多時(shí)候我們都很難記住這個(gè)項(xiàng)目連接的是哪個(gè)數(shù)據(jù)庫(kù),那個(gè)項(xiàng)目連接的是哪個(gè)數(shù)據(jù)庫(kù)。

但如果你使用了 MyCat 作為數(shù)據(jù)庫(kù)中間件的話,MyCat 就可以幫你解決這個(gè)問(wèn)題。對(duì)于所有項(xiàng)目來(lái)說(shuō),它們只需要統(tǒng)一連接 MyCat 對(duì)外提供的一個(gè)地址,而 MyCat 則幫這些項(xiàng)目聯(lián)系所有后端的 MySQL 數(shù)據(jù)庫(kù)。對(duì)于前端的項(xiàng)目倆說(shuō),它們只知道 MyCat 這個(gè)數(shù)據(jù)庫(kù)中間件,而不需要去理會(huì)我到底連接哪個(gè)數(shù)據(jù)庫(kù),MyCat 通過(guò)自身配置可以完成這個(gè)任務(wù)。

 

哪個(gè)表的冗余代碼,從而讓開發(fā)人員更專注于業(yè)務(wù)邏輯的開發(fā)。

4水平切分?jǐn)?shù)據(jù)庫(kù)架構(gòu)

當(dāng)數(shù)據(jù)庫(kù)架構(gòu)經(jīng)歷了主從架構(gòu)、垂直拆分架構(gòu)之后,應(yīng)對(duì)一般的業(yè)務(wù)讀寫是沒(méi)有什么問(wèn)題了。但對(duì)于一些核心的業(yè)務(wù)數(shù)據(jù),可能還是會(huì)有瓶頸問(wèn)題,例如用戶模塊。

對(duì)于一些用戶量高達(dá)一個(gè)億的用戶系統(tǒng)來(lái)說(shuō),即使經(jīng)過(guò)主從架構(gòu)、垂直拆分架構(gòu)的優(yōu)化,但其用戶數(shù)據(jù)庫(kù)的單個(gè)表里需要存儲(chǔ)的數(shù)據(jù)還是高達(dá)一個(gè)億的大小。如果我們把所有的數(shù)據(jù)都存放在一個(gè)表里,無(wú)論是注冊(cè)時(shí)的插入數(shù)據(jù),或者是登陸時(shí)的查詢數(shù)據(jù),勢(shì)必會(huì)變得很慢。

這時(shí)候,我們就不得不對(duì)這些高數(shù)據(jù)量的核心業(yè)務(wù)表進(jìn)行水平拆分,即將海量的數(shù)據(jù)記錄拆分到多張表中保存。例如我們一開始可能只有一張 User 表,我們將 User 表按照用戶 ID 對(duì) 1000 取余進(jìn)行拆分,那么我們就會(huì)有 1000 張表,分別是 User_000 至 User_999。此時(shí),項(xiàng)目的架構(gòu)圖如下所示:

水平切分?jǐn)?shù)據(jù)庫(kù)架構(gòu)

當(dāng)我們?cè)诖a中查詢用戶數(shù)據(jù)時(shí),我們先根據(jù)用戶 ID 取余判斷其應(yīng)該操作的表,之后再查詢對(duì)應(yīng)的表。例如 UserId 為 90749738 的用戶就應(yīng)該查詢 User_38 表,UserId 為 74847383 的用戶就應(yīng)該查詢 User_83 表。

通過(guò)水平拆分,我們成功解決了海量數(shù)據(jù)核心業(yè)務(wù)表的讀寫瓶頸問(wèn)題。但此時(shí)在代碼層面上有一個(gè)問(wèn)題出現(xiàn)了,那就是我們需要在查詢數(shù)據(jù)庫(kù)之前,根據(jù) UserId 去判斷應(yīng)該查詢哪個(gè)表,這個(gè)操作對(duì)于所有業(yè)務(wù)模塊來(lái)說(shuō)都是高度一致的,應(yīng)該抽離成一個(gè)公用的項(xiàng)目。

與判斷應(yīng)該使用讀數(shù)據(jù)源還是寫數(shù)據(jù)源一致,我們都覺(jué)得這樣機(jī)械的任務(wù)不應(yīng)該丟給程序員做,應(yīng)該讓機(jī)器去做。這其實(shí)就是 MyCat 可以幫我們做的事情:MyCat 通過(guò)配置一系列的分庫(kù)分表規(guī)則,讓 MyCat 幫我們自動(dòng)判斷應(yīng)該查詢哪一個(gè)分表。通過(guò)使用 MyCat 數(shù)據(jù)庫(kù)中間件,我們可以省去在代碼層判斷查詢哪個(gè)表的冗余代碼,從而讓開發(fā)人員更專注于業(yè)務(wù)邏輯的開發(fā)。

5總結(jié)

從單一的數(shù)據(jù)庫(kù)架構(gòu),到主從讀寫分離的數(shù)據(jù)庫(kù)架構(gòu),再到垂直拆分、水平拆分的數(shù)據(jù)庫(kù)架構(gòu)。我們可以看到 MyCat 幫我們解決了讀寫數(shù)據(jù)源判斷、繁雜數(shù)據(jù)源地址、分表判斷這三個(gè)機(jī)械的重復(fù)性的問(wèn)題。

但 MyCat 發(fā)展至今,其功能已經(jīng)遠(yuǎn)遠(yuǎn)超過(guò)上面說(shuō)的這三個(gè)。例如 MyCat 支持主從切換功能,當(dāng)數(shù)據(jù)庫(kù)主庫(kù)發(fā)生網(wǎng)絡(luò)問(wèn)題或其他故障時(shí),MyCat 可以自動(dòng)切換到從庫(kù),從而保證正常讀寫功能的進(jìn)行。MyCat 的定位是一個(gè)數(shù)據(jù)庫(kù)中間件,但凡所有處于應(yīng)用層和數(shù)據(jù)層之間的事情,MyCat 都可以做。

通過(guò)這篇文章,我們了解了 MyCat 的誕生背景以及其最基本的作用。

 

文章出處:https://mp.weixin.qq.com/s/0jsoYTmEKehKNqUCJPmrjg

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
數(shù)據(jù)庫(kù)優(yōu)化的幾個(gè)階段
聊聊圖解分布式架構(gòu)的演進(jìn)
數(shù)據(jù)庫(kù)的垂直切分與水平切分
系統(tǒng)架構(gòu)-性能篇章2(系統(tǒng)拆分1)
從一個(gè)小網(wǎng)站變成了大型網(wǎng)站,網(wǎng)站架構(gòu)上到底發(fā)生了什么變化?
淺談Web網(wǎng)站架構(gòu)演變過(guò)程 – 碼農(nóng)網(wǎng)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服