自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

DB分庫(kù)分表(1):拆分實(shí)施策略和示例演示

數(shù)據(jù)庫(kù)
對(duì)數(shù)據(jù)庫(kù)進(jìn)行分庫(kù)分表(Sharding化)前,需要開(kāi)發(fā)人員充分了解系統(tǒng)業(yè)務(wù)邏輯和數(shù)據(jù)庫(kù)schema.一個(gè)好的建議是繪制一張數(shù)據(jù)庫(kù)ER圖或領(lǐng)域模型圖,以這類圖為基礎(chǔ)劃分shard,直觀易行,可以確保開(kāi)發(fā)人員始終保持清醒思路。對(duì)于是選擇數(shù)據(jù)庫(kù)ER圖還是領(lǐng)域模型圖要根據(jù)項(xiàng)目自身情況進(jìn)行選擇。

***部分:實(shí)施策略

 

 

圖1.數(shù)據(jù)庫(kù)分庫(kù)分表(sharding)實(shí)施策略圖解

1.準(zhǔn)備階段

對(duì)數(shù)據(jù)庫(kù)進(jìn)行分庫(kù)分表(Sharding化)前,需要開(kāi)發(fā)人員充分了解系統(tǒng)業(yè)務(wù)邏輯和數(shù)據(jù)庫(kù)schema.一個(gè)好的建議是繪制一張數(shù)據(jù)庫(kù)ER圖或領(lǐng)域模型圖,以這類圖為基礎(chǔ)劃分shard,直觀易行,可以確保開(kāi)發(fā)人員始終保持清醒思路。對(duì)于是選擇數(shù)據(jù)庫(kù)ER圖還是領(lǐng)域模型圖要根據(jù)項(xiàng)目自身情況進(jìn)行選擇。如果項(xiàng)目使用數(shù)據(jù)驅(qū)動(dòng)的開(kāi)發(fā)方式,團(tuán)隊(duì)以數(shù)據(jù)庫(kù)ER圖作為業(yè)務(wù)交流的基礎(chǔ),則自然會(huì)選擇數(shù)據(jù)庫(kù)ER圖,如果項(xiàng)目使用的是領(lǐng)域驅(qū)動(dòng)的開(kāi)發(fā)方式,并通過(guò)OR-Mapping構(gòu)建了一個(gè)良好的領(lǐng)域模型,那么領(lǐng)域模型圖無(wú)疑是***的選擇。就我個(gè)人來(lái)說(shuō),更加傾向使用領(lǐng)域模型圖,因?yàn)檫M(jìn)行切分時(shí)更多的是以業(yè)務(wù)為依據(jù)進(jìn)行分析判斷,領(lǐng)域模型無(wú)疑更加清晰和直觀。

2.分析階段

1).垂直切分

垂直切分的依據(jù)原則是:將業(yè)務(wù)緊密,表間關(guān)聯(lián)密切的表劃分在一起,例如同一模塊的表。結(jié)合已經(jīng)準(zhǔn)備好的數(shù)據(jù)庫(kù)ER圖或領(lǐng)域模型圖,仿照活動(dòng)圖中的泳道概念,一個(gè)泳道代表一個(gè)shard,把所有表格劃分到不同的泳道中。下面的分析示例會(huì)展示這種做法。當(dāng)然,你也可以在打印出的ER圖或模型圖上直接用鉛筆圈,一切取決于你自己的喜好。

2). 水平切分

垂直切分后,需要對(duì)shard內(nèi)表格的數(shù)據(jù)量和增速進(jìn)一步分析,以確定是否需要進(jìn)行水平切分。

2.1若劃分到一起的表格數(shù)據(jù)增長(zhǎng)緩慢,在產(chǎn)品上線后可遇見(jiàn)的足夠長(zhǎng)的時(shí)期內(nèi)均可以由單一數(shù)據(jù)庫(kù)承載,則不需要進(jìn)行水平切分,所有表格駐留同一shard,所有表間關(guān)聯(lián)關(guān)系會(huì)得到***限度的保留,同時(shí)保證了書(shū)寫(xiě)SQL的自由度,不易受join、group by、order by等子句限制。

2.2 若劃分到一起的表格數(shù)據(jù)量巨大,增速迅猛,需要進(jìn)一步進(jìn)行水平分割。進(jìn)一步的水平分割就這樣進(jìn)行:

2.2.1.結(jié)合業(yè)務(wù)邏輯和表間關(guān)系,將當(dāng)前shard劃分成多個(gè)更小的shard,通常情況下,這些更小的shard每一個(gè)都只包含一個(gè)主表(將以該表ID進(jìn)行散列的表)和多個(gè)與其關(guān)聯(lián)或間接關(guān)聯(lián)的次表。這種一個(gè)shard一張主表多張次表的狀況是水平切分的必然結(jié)果。這樣切分下來(lái),shard數(shù)量就會(huì)迅速增多。如果每一個(gè)shard代表一個(gè)獨(dú)立的數(shù)據(jù)庫(kù),那么管理和維護(hù)數(shù)據(jù)庫(kù)將會(huì)非常麻煩,而且這些小shard往往只有兩三張表,為此而建立一個(gè)新庫(kù),利用率并不高,因此,在水平切分完成后可再進(jìn)行一次“反向的Merge”,即:將業(yè)務(wù)上相近,并且具有相近數(shù)據(jù)增長(zhǎng)速率(主表數(shù)據(jù)量在同一數(shù)量級(jí)上)的兩個(gè)或多個(gè)shard放到同一個(gè)數(shù)據(jù)庫(kù)上,在邏輯上它們依然是獨(dú)立的shard,有各自的主表,并依據(jù)各自主表的ID進(jìn)行散列,不同的只是它們的散列取模(即節(jié)點(diǎn)數(shù)量)必需是一致的。這樣,每個(gè)數(shù)據(jù)庫(kù)結(jié)點(diǎn)上的表格數(shù)量就相對(duì)平均了。

2.2.2. 所有表格均劃分到合適的shard之后,所有跨越shard的表間關(guān)聯(lián)都必須打斷,在書(shū)寫(xiě)sql時(shí),跨shard的join、group by、order by都將被禁止,需要在應(yīng)用程序?qū)用鎱f(xié)調(diào)解決這些問(wèn)題。

特別想提一點(diǎn):經(jīng)水平切分后,shard的粒度往往要比只做垂直切割的粒度要小,原單一垂直shard會(huì)被細(xì)分為一到多個(gè)以一個(gè)主表為中心關(guān)聯(lián)或間接關(guān)聯(lián)多個(gè)次表的shard,此時(shí)的shard粒度與領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中的“聚合”概念不謀而合,甚至可以說(shuō)是完全一致,每個(gè)shard的主表正是一個(gè)聚合中的聚合根!

3.實(shí)施階段

如果項(xiàng)目在開(kāi)發(fā)伊始就決定進(jìn)行分庫(kù)分表,則嚴(yán)格按照分析設(shè)計(jì)方案推進(jìn)即可。如果是在中期架構(gòu)演進(jìn)中實(shí)施,除搭建實(shí)現(xiàn)sharding邏輯的基礎(chǔ)設(shè)施外(關(guān)于該話題會(huì)在下篇文章中進(jìn)行闡述),還需要對(duì)原有SQL逐一過(guò)濾分析,修改那些因?yàn)閟harding而受到影響的sql.

第二部分:示例演示

本文選擇一個(gè)人盡皆知的應(yīng)用:jpetstore來(lái)演示如何進(jìn)行分庫(kù)分表(sharding)在分析階段的工作。由于一些個(gè)人原因,演示使用的jpetstore來(lái)自原ibatis官方的一個(gè)Demo版本,SVN地址為:http://mybatis.googlecode.com/svn/tags/java_release_2.3.4-726/jpetstore-5。關(guān)于jpetstore的業(yè)務(wù)邏輯這里不再介紹,這是一個(gè)非常簡(jiǎn)單的電商系統(tǒng)原型,其領(lǐng)域模型如下圖:

 

 

圖2. jpetstore領(lǐng)域模型

由于系統(tǒng)較簡(jiǎn)單,我們很容易從模型上看出,其主要由三個(gè)模塊組成:用戶,產(chǎn)品和訂單。那么垂直切分的方案也就出來(lái)了。接下來(lái)看水平切分,如果我們從一個(gè)實(shí)際的寵物店出發(fā)考慮,可能出現(xiàn)數(shù)據(jù)激增的單表應(yīng)該是Account和Order,因此這兩張表需要進(jìn)行水平切分。對(duì)于Product模塊來(lái)說(shuō),如果是一個(gè)實(shí)際的系統(tǒng),Product和Item的數(shù)量都不會(huì)很大,因此只做垂直切分就足夠了,也就是(Product,Category,Item,Iventory,Supplier)五張表在一個(gè)數(shù)據(jù)庫(kù)結(jié)點(diǎn)上(沒(méi)有水平切分,不會(huì)存在兩個(gè)以上的數(shù)據(jù)庫(kù)結(jié)點(diǎn))。但是作為一個(gè)演示,我們假設(shè)產(chǎn)品模塊也有大量的數(shù)據(jù)需要我們做水平切分,那么分析來(lái)看,這個(gè)模塊要拆分出兩個(gè)shard:一個(gè)是(Product(主),Category),另一個(gè)是(Item(主),Iventory,Supplier),同時(shí),我們認(rèn)為:這兩個(gè)shard在數(shù)據(jù)增速上應(yīng)該是相近的,且在業(yè)務(wù)上也很緊密,那么我們可以把這兩個(gè)shard放在同一個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)上,Item和Product數(shù)據(jù)在散列時(shí)取一樣的模。根據(jù)前文介紹的圖紙繪制方法,我們得到下面這張sharding示意圖:

 

 

圖3. jpetstore sharding示意圖

對(duì)于這張圖再說(shuō)明幾點(diǎn):

1.使用泳道表示物理shard(一個(gè)數(shù)據(jù)庫(kù)結(jié)點(diǎn))

2.若垂直切分出的shard進(jìn)行了進(jìn)一步的水平切分,但公用一個(gè)物理shard的話,則用虛線框住,表示其在邏輯上是一個(gè)獨(dú)立的shard。

3.深色實(shí)體表示主表

4.X表示需要打斷的表間關(guān)聯(lián) 

責(zé)任編輯:龐桂玉 來(lái)源: 數(shù)據(jù)庫(kù)開(kāi)發(fā)
相關(guān)推薦

2017-07-17 14:45:43

數(shù)據(jù)庫(kù)DB分庫(kù)切分策略

2017-07-19 16:25:07

數(shù)據(jù)庫(kù)開(kāi)發(fā)DB分庫(kù)主鍵生成策略

2018-08-14 18:00:14

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

2023-02-24 15:24:14

MySQL數(shù)據(jù)庫(kù)管理分庫(kù)分表

2020-07-30 17:59:34

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

2022-07-11 08:16:47

NewSQL關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)

2021-10-29 07:25:32

分庫(kù)分表技巧

2019-11-12 09:54:20

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

2022-07-08 08:57:36

數(shù)據(jù)優(yōu)化垂直拆分數(shù)據(jù)庫(kù)

2022-12-05 07:51:24

數(shù)據(jù)庫(kù)分庫(kù)分表讀寫(xiě)分離

2022-01-28 08:59:59

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

2021-08-31 20:21:11

VitessMySQL分庫(kù)

2023-08-11 08:59:49

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

2020-11-18 09:39:02

MySQL數(shù)據(jù)庫(kù)SQL

2017-07-21 14:50:15

數(shù)據(jù)庫(kù)DB分庫(kù)事務(wù)處理

2024-07-26 00:16:11

2025-04-01 08:45:00

2020-07-28 09:04:09

NewSQL分庫(kù)分表

2021-01-26 05:37:08

分庫(kù)分表內(nèi)存

2024-07-17 21:02:42

點(diǎn)贊
收藏

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