這應(yīng)該是最詳盡的 MySQL 分庫分表文章了
永別了,91網(wǎng)站!官方:宣布永久關(guān)閉
Java 里的 for (;;) 與 while (true),哪個更快?
還在寫大量 if 來判斷?試試用一個規(guī)則執(zhí)行器來替代它
2、 基本概念
2.1 談數(shù)據(jù)庫分片需要首先確定以下概念
單庫,就是一個庫

分片(sharding),分片解決 擴(kuò)展性問題,屬于水平拆分,引入分片,就引入了數(shù)據(jù)路由和分區(qū)鍵的概念。分表解決的是數(shù)據(jù)量過大的問題,分庫解決的是數(shù)據(jù)庫性能瓶頸的問題。

分組(group),分組解決 可用性問題,分組通常通過主從復(fù)制(replication)的方式實現(xiàn)。(各種可用級別方案單獨介紹)

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

3、 分片
3.1 水平拆分,垂直拆分都是什么?

分區(qū)表?1)若不走分區(qū)鍵很容易出現(xiàn)全表鎖,并發(fā)上來后簡直是災(zāi)難。2)自己分庫分表,自己掌控業(yè)務(wù)場景、訪問模式,可控。mysql分區(qū)表官方介紹是針對myisam做的優(yōu)化,你知道他怎么玩的?分半天還是一個ibdata是不是很尷尬
3.2 為什么分表?
數(shù)據(jù)量閥值。這個單表可承受的數(shù)據(jù)量閥值,需根據(jù)數(shù)據(jù)庫和并發(fā)量的差異,通過實際測試獲得。水平拆分如果能預(yù)估規(guī)模,越早做成本越低。
3.3 為什么分庫?
水平拆分都至少要采用分庫的方式,用于一并解決大數(shù)據(jù)量和高并發(fā)的問題。這也是部分開源的分片數(shù)據(jù)庫中間件只支持分庫的原因。3.4 分布式事務(wù)?
mysql本身?消息補償?2PC?
3.5 小結(jié)
3.6 如何自己實現(xiàn)分庫分表?
dao層,首先 通過分區(qū)鍵算出庫名表名(如shardKey%shardNum 算出來表index如y,然后y/(shardNum/sourceNum)=x,y是表下標(biāo),x是庫下標(biāo))。把source從spring容器中拿出來,把表名當(dāng)參數(shù)傳進(jìn)去,拼成分片后的sql。思路大概是(select … from order where … -> 先拿到db_x的source 然后 select … from order_y where …)
你想這么干?你已經(jīng)成功了。當(dāng)然淘寶和當(dāng)當(dāng)?shù)募軜?gòu)師也是這么干的。
3.7 SO,不需要我們親自動手,其實你需要做的只是按照實際需求挑選而已。

3.8 重點介紹兩個產(chǎn)品,先不說具體配置,只說思想
sharding-jdbc(所處位置,通用數(shù)據(jù)訪問層,部署在客戶端的jar包,用于將用戶的SQL路由到指定的數(shù)據(jù)庫中)
盜一波圖





jproxy
jproxy是什么?

為什么分片都是2的n次方?a % (2^n) 等價于 a & (2^n - 1) 其中一個原因就是位運算 擴(kuò)容?虛擬桶。極限就是一片一庫。
演變過程 cobar->mycat->jproxy
mycat是什么?
其優(yōu)勢具有: 基于阿里開源的Cobar產(chǎn)品而研發(fā),Cobar的穩(wěn)定性、可靠性、優(yōu)秀的架構(gòu)和性能 擁有眾多成熟的使用案例 強(qiáng)大的團(tuán)隊(其參與者都是5年以上資深軟件工程師、架構(gòu)師、DBA等) 開源,創(chuàng)新,持續(xù)更新
盜一波圖

4、 分組
4.1 為什么分組?
可用性問題mysql的ha 網(wǎng)洛上的都是vip漂移實現(xiàn)的











4.2 同步,異步,半同步
異步復(fù)制 (mysql默認(rèn))
Master將事件寫入binlog,但并不知道Slave是否或何時已經(jīng)接收且已處理。當(dāng)Slave準(zhǔn)備好才會向Master請求binlog。缺點:不能保證一些事件都能夠被所有的Slave所接收。
同步復(fù)制
Master提交事務(wù),直到事務(wù)在 所有的Slave都已提交,此時才會返回客戶端,事務(wù)執(zhí)行完畢。缺點:完成一個事務(wù)可能會有很大的延遲。
半同步復(fù)制
半同步復(fù)制工作的機(jī)制處于同步和異步之間,Master的事務(wù)提交阻塞, 只要一個Slave已收到該事務(wù)的事件且已記錄。它不會等待所有的Slave都告知已收到,且它只是接收,并不用等其完全執(zhí)行且提交。
4.3 ha方案
MHA MMM
5、 應(yīng)用案例
5.1 記錄一次mongo遷移mysql的過程(分庫分表使用jproxy)
mongo怎么了?跟分片無關(guān)的部分簡單說。
遷移數(shù)據(jù)庫的一個方案 中心化(統(tǒng)一入口) 雙寫(先同步寫mysql如果發(fā)生異常改異步,盡量避免服務(wù)不可用) 倒庫(jproxy支持通過游標(biāo)形式全量遍歷庫-逐個表操作,可以利用其異步同步數(shù)據(jù)) 數(shù)據(jù)校驗 切庫提供服務(wù)

去mongo+優(yōu)化方案(此處引入了分片的概念)


壓測與性能





去mongo任務(wù)線
5.2 記錄一次異構(gòu)具有復(fù)雜分片規(guī)則數(shù)據(jù)庫的過程
5.2.1 難點
回到本源,緩存+隊列

5.2.2 不跑題,我們就說分片部分,如何接手一個復(fù)雜分片規(guī)則的數(shù)據(jù)庫?
參考案例如何異構(gòu)一個數(shù)十億級別的數(shù)據(jù)庫 有多復(fù)雜? 6000+表,28個庫,4套分片規(guī)則。(解決方案 sharding-jdbc)

掃以下二維碼并回復(fù)“828”即可獲取
評論
圖片
表情
