從單機(jī)到分布式:拆解高并發(fā)數(shù)據(jù)庫(kù)架構(gòu)的六大生死決策
一、數(shù)據(jù)庫(kù)讀寫(xiě)分離
核心原理
- 主從集群搭建:一主一從/一主多從,主機(jī)負(fù)責(zé)讀寫(xiě),從機(jī)只讀。
 - 數(shù)據(jù)同步:主機(jī)通過(guò)復(fù)制同步數(shù)據(jù)到從機(jī),所有節(jié)點(diǎn)存儲(chǔ)全量數(shù)據(jù)。
 - 流量分發(fā):業(yè)務(wù)層將寫(xiě)操作指向主機(jī),讀操作分發(fā)至從機(jī)。
 
適用場(chǎng)景
- 業(yè)務(wù)量持續(xù)增長(zhǎng),且已優(yōu)化索引、引入緩存后仍性能不足。
 
常見(jiàn)問(wèn)題與解法
- 問(wèn)題:寫(xiě)后讀數(shù)據(jù)不一致(如剛寫(xiě)入主機(jī),從機(jī)未同步)。
 - 解法:
 
- 讀寫(xiě)綁定:寫(xiě)后讀強(qiáng)制走主機(jī)(侵入性強(qiáng),易留坑)。
 - 二次讀取:從機(jī)讀失敗后重試主機(jī)(增加主機(jī)壓力)。
 - 業(yè)務(wù)分級(jí):核心業(yè)務(wù)讀寫(xiě)均走主機(jī),非核心業(yè)務(wù)讀寫(xiě)分離(需嚴(yán)格編碼規(guī)范)。
 
實(shí)現(xiàn)方式對(duì)比
方式  | 中間件代理  | 客戶端分庫(kù)  | 
復(fù)雜度  | 高(需獨(dú)立部署、集群管理)  | 低(基于JDBC封裝)  | 
維護(hù)成本  | 高(需高可用設(shè)計(jì))  | 低(無(wú)額外部署)  | 
語(yǔ)言支持  | 跨語(yǔ)言  | 需各語(yǔ)言單獨(dú)實(shí)現(xiàn)  | 
二、數(shù)據(jù)庫(kù)分庫(kù)分表
拆分策略
- 垂直拆分:按列拆分,解決單表字段過(guò)多問(wèn)題(常見(jiàn)于2B場(chǎng)景)。
 - 水平拆分:按行拆分,分散數(shù)據(jù)壓力(常見(jiàn)于2C海量數(shù)據(jù)場(chǎng)景)。
 
拆分時(shí)機(jī)
- B+樹(shù)層數(shù)超過(guò)3層(約2000萬(wàn)數(shù)據(jù))。
 - 單表數(shù)據(jù)占滿Innodb Buffer Pool(如2G數(shù)據(jù))。
 - 數(shù)據(jù)持續(xù)增長(zhǎng)且性能瓶頸明顯。
 
核心問(wèn)題與解法
- Join失效:
 
a.冗余小表(如字典表)。
b.代碼層手動(dòng)Join。
c.字段冗余(如訂單表直接存商品類型)。
- 事務(wù)一致性:
 
- 引入分布式事務(wù)(如2PC、3PC)。
 
- 路由與聚合:
 
- 路由算法(如Hash、范圍分片)。
 - 分片后Count/Order by需中間件或應(yīng)用層聚合。
 
- 擴(kuò)展限制
 
- 數(shù)據(jù)庫(kù)連接數(shù)瓶頸(如MySQL默認(rèn)100連接)。
 - 中間件聚合操作性能受限,需權(quán)衡分片數(shù)量。
 
三、數(shù)據(jù)庫(kù)分布式事務(wù)算法
主流方案對(duì)比
算法  | 2PC(兩階段提交)  | 3PC(三階段提交)  | 
流程  | 1. 準(zhǔn)備階段  | 1. CanCommit  | 
優(yōu)點(diǎn)  | 強(qiáng)一致性,實(shí)現(xiàn)簡(jiǎn)單  | 減少阻塞,降低超時(shí)風(fēng)險(xiǎn)  | 
缺點(diǎn)  | 協(xié)調(diào)者單點(diǎn)故障、同步阻塞  | 存在腦裂風(fēng)險(xiǎn)(部分提交、部分回滾)  | 
XA事務(wù)實(shí)踐
- 外部XA:跨多數(shù)據(jù)庫(kù)實(shí)例,由應(yīng)用代碼協(xié)調(diào)(如PHP示例中的多庫(kù)事務(wù))。
 - 內(nèi)部XA:?jiǎn)螌?shí)例多存儲(chǔ)引擎事務(wù),由Binlog協(xié)調(diào)(如MySQL內(nèi)部機(jī)制)。
 
隨堂測(cè)驗(yàn)
- **?** 讀寫(xiě)分離僅提升讀性能,寫(xiě)仍由主機(jī)處理。
 - **?** 分庫(kù)分表分散寫(xiě)壓力,提升寫(xiě)性能。
 - **?** 中間件可能成性能瓶頸,需謹(jǐn)慎設(shè)計(jì) ? 中間件性能:取決于架構(gòu)設(shè)計(jì)(如集群化),不可一概而論 。
 - **?** 3PC存在腦裂風(fēng)險(xiǎn),不優(yōu)先于2PC ? 3PC與2PC選擇:需權(quán)衡「一致性要求」與「系統(tǒng)可用性」,無(wú)絕對(duì)優(yōu)先級(jí)。
 - **?** 協(xié)調(diào)者可為代碼(外部XA)或獨(dú)立系統(tǒng)(如Binlog)。
 
思考題解析
- 為何傳統(tǒng)數(shù)據(jù)庫(kù)不自帶分庫(kù)分表?
關(guān)系型數(shù)據(jù)庫(kù)(如MySQL)設(shè)計(jì)側(cè)重ACID,分片會(huì)破壞事務(wù)和Join,需業(yè)務(wù)層權(quán)衡;而Redis/MongoDB等為高擴(kuò)展設(shè)計(jì),犧牲部分特性(如強(qiáng)一致性)內(nèi)置Sharding支持。 
站在巨人的肩膀上,架構(gòu)之路更從容!
圖片















 
 
 













 
 
 
 