偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

憑什么,給了你 DB,你卻擴(kuò)不了容?

開發(fā)
好不容易找運(yùn)維申請了兩臺機(jī)器,讓DBA部署了幾個(gè)實(shí)例,想把一些業(yè)務(wù)庫拆分出來,卻發(fā)現(xiàn)拆不出來,擴(kuò)不了容,尷尬!

隨著業(yè)務(wù)越來越復(fù)雜,數(shù)據(jù)量越來越大,并發(fā)量越來越大,數(shù)據(jù)庫的性能越來越低。好不容易找運(yùn)維申請了兩臺機(jī)器,讓DBA部署了幾個(gè)實(shí)例,想把一些業(yè)務(wù)庫拆分出來,卻發(fā)現(xiàn)拆不出來,擴(kuò)不了容,尷尬!

因?yàn)閿?shù)據(jù)庫強(qiáng)關(guān)聯(lián)在一起,無法通過增加數(shù)據(jù)庫實(shí)例擴(kuò)容,就是一個(gè)耦合的典型案例。

場景還原

有一個(gè)公共用戶數(shù)據(jù)庫DB_USER,里面table_user存放了通用的用戶數(shù)據(jù):

table_user (uid, name, passwd, …)

在數(shù)據(jù)量比較小,并發(fā)量比較小,業(yè)務(wù)還沒有這么復(fù)雜的時(shí)候,為了提高資源利用率(程序員才沒有考慮什么資源利用率,更多的是圖方便),業(yè)務(wù)A把用戶個(gè)性化的數(shù)據(jù)也放在這個(gè)庫里:

table_A(uid, A業(yè)務(wù)的個(gè)性化屬性)

業(yè)務(wù)A有一個(gè)需求,即要展現(xiàn)用戶公共屬性,又要展現(xiàn)業(yè)務(wù)A個(gè)性化屬性,程序員經(jīng)常這么實(shí)現(xiàn)的:

select * from table_user, table_A

      where table_user.uid = table_A.uid

      and table_user.uid = $uid

初期關(guān)聯(lián)查詢沒有任何問題,單條記錄訪問,命中索引,一次查詢所有數(shù)據(jù),簡單高效。

如何產(chǎn)生各業(yè)務(wù)數(shù)據(jù)耦合?

通過join實(shí)現(xiàn)業(yè)務(wù),導(dǎo)致通用表table_user和業(yè)務(wù)表table_A必須存在于一個(gè)數(shù)據(jù)庫實(shí)例里。

如果業(yè)務(wù)B也這么做,業(yè)務(wù)C也這么做,會導(dǎo)致公用業(yè)務(wù),業(yè)務(wù)A,業(yè)務(wù)B,業(yè)務(wù)C都必須存在于一個(gè)數(shù)據(jù)庫實(shí)例里。

會產(chǎn)生什么潛在問題呢?

假如A業(yè)務(wù)線上線了一個(gè)新功能,不小心進(jìn)行了全表掃描,導(dǎo)致數(shù)據(jù)庫CPU100%,數(shù)據(jù)庫實(shí)例性能下降,由于實(shí)例共用,通用業(yè)務(wù),業(yè)務(wù)B和業(yè)務(wù)C都會受影響。

即某個(gè)業(yè)務(wù)線的數(shù)據(jù)庫性能急劇下降導(dǎo)致所有業(yè)務(wù)都受影響,這種耦合,歷史總是驚人的相似:

  • 業(yè)務(wù)B的大boss在群里首先發(fā)飆:“技術(shù)都干啥了,怎么系統(tǒng)掛了”;
  • 業(yè)務(wù)B的rd一臉無辜:“業(yè)務(wù)A上線了,所以我們掛了”;

額,然而,這個(gè)理由,好像在大boss那解釋不通…

  • 業(yè)務(wù)B的大boss:“趕緊加幾臺機(jī)器,拆分開”;
  • 業(yè)務(wù)B的rd一臉無奈:“加機(jī)器加實(shí)例也擴(kuò)容不了”;
  • 業(yè)務(wù)B的大boss對業(yè)務(wù)2的rd吼道“還想甩鍋,拖出去祭天”;
  • ...

唉,加了幾臺機(jī)器,加了幾個(gè)實(shí)例,然而并沒有什么卵用,都耦合在一個(gè)實(shí)例里,完全擴(kuò)不了容。

那,如何解除公共數(shù)據(jù)庫與業(yè)務(wù)數(shù)據(jù)庫的耦合?

第一步:公共數(shù)據(jù)訪問下沉服務(wù)化。

還是上面的例子,當(dāng)公共的user數(shù)據(jù)訪問服務(wù)化之后,依據(jù)服務(wù)化的原則:

  • 業(yè)務(wù)層只能通過服務(wù)RPC接口訪問數(shù)據(jù);
  • 底層user庫屬于user服務(wù)私有;
  • 任何上游不允許跨過服務(wù)訪問底層的user庫;

第二步:垂直拆分,個(gè)性化數(shù)據(jù)訪問上浮

原來業(yè)務(wù)方:

  • 通過join一次性獲取通用的數(shù)據(jù)和個(gè)性化的業(yè)務(wù)數(shù)據(jù)數(shù)據(jù);

服務(wù)化+垂直拆分后,變成兩次訪問:

  • 一次取得業(yè)務(wù)數(shù)據(jù)(業(yè)務(wù)可以直接調(diào)用自己的數(shù)據(jù)庫,也可以自己做業(yè)務(wù)服務(wù)調(diào)用RPC接口);
  • 一次取得共性數(shù)據(jù)(調(diào)用通用的RPC接口);

兩種方式相比:

  • 之前的方式其實(shí)業(yè)務(wù)代碼可能會更簡單一些,因?yàn)樗菍⑦@個(gè)業(yè)務(wù)邏輯放在了SQL語句中,但是導(dǎo)致數(shù)據(jù)庫耦合在了一起;
  • 后面這種方式就是業(yè)務(wù)的代碼會更復(fù)雜,會變成多次訪問,將原來在SQL中進(jìn)行的邏輯計(jì)算變成業(yè)務(wù)代碼中的邏輯計(jì)算,但是數(shù)據(jù)庫解耦了;

業(yè)務(wù)復(fù)雜,數(shù)據(jù)量大,并發(fā)老大,對擴(kuò)展性要求更高的架構(gòu),一定是后者。

此時(shí)各業(yè)務(wù)有自己的庫,公共有公共的庫:

  • 早期:可以放在一個(gè)數(shù)據(jù)庫實(shí)例里;
  • 后期:可以很容易地通過新增數(shù)據(jù)庫實(shí)例,把user庫或者業(yè)務(wù)A/B/C的庫拆分出來,實(shí)現(xiàn)增加機(jī)器增加實(shí)例就實(shí)現(xiàn)擴(kuò)容;

個(gè)性業(yè)務(wù)數(shù)據(jù)訪問垂直拆分,共性數(shù)據(jù)訪問服務(wù)化下沉,只是一個(gè)很小的優(yōu)化點(diǎn),但對于數(shù)據(jù)庫解耦卻是非常的有效。

知其然,知其所以然。

思路比結(jié)論更重要。

責(zé)任編輯:趙寧寧 來源: 架構(gòu)師之路
相關(guān)推薦

2017-12-01 06:02:14

耦合數(shù)據(jù)庫CA

2017-04-17 11:50:13

51CTO 學(xué)院

2021-11-12 05:59:23

容災(zāi)備份5G

2023-11-06 18:33:19

分庫分表數(shù)據(jù)庫

2024-01-30 18:07:22

Linux命令行工具

2024-03-15 09:06:48

HTTPSCA私鑰

2012-02-23 15:02:20

架構(gòu)師介紹

2019-08-08 17:25:20

裁員計(jì)劃程序員

2017-12-26 11:37:32

云原生CNCF容器

2013-10-10 15:41:38

綠色數(shù)據(jù)中心數(shù)據(jù)中心

2021-04-06 15:38:01

手機(jī)國產(chǎn)蘋果

2009-09-04 05:34:57

KVM性能紅帽KVM

2017-02-07 09:37:46

2024-04-07 00:00:03

2017-03-21 15:16:57

IBM

2017-04-26 16:03:20

2013-01-22 11:15:40

GitHub

2023-01-05 23:18:06

CPU線程

2013-07-10 13:25:14

程序員開發(fā)

2023-06-24 23:11:07

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號