分库分表介绍
一、背景
讀寫分離是為了擴(kuò)展數(shù)據(jù)庫(kù)的讀能力,分庫(kù)分表則是為了擴(kuò)展數(shù)據(jù)庫(kù)的寫能力。
一旦業(yè)務(wù)表中數(shù)據(jù)太大(對(duì)于mysql,單表數(shù)據(jù)一般不超過(guò)3000w,單庫(kù)不超過(guò)300G),無(wú)論是任何CRUD操作,所耗費(fèi)資源和性能都極大。這個(gè)時(shí)候一般就需要
分庫(kù)分表,將海量數(shù)據(jù)分配給N個(gè)子表維護(hù)。
二、分庫(kù)分表優(yōu)點(diǎn)
分庫(kù)優(yōu)點(diǎn):降低單臺(tái)機(jī)器的負(fù)載壓力
分表優(yōu)點(diǎn):提高數(shù)據(jù)操作的效率
三、分庫(kù)分表的挑戰(zhàn)
主要體現(xiàn)在四個(gè)方面:基本的數(shù)據(jù)增、刪、改操作,分布式ID生成,分布式事務(wù),動(dòng)態(tài)擴(kuò)容。
3.1 對(duì)于研發(fā)人員,即使分庫(kù)分表,我們?nèi)匀幌M軌蛳駟伪砟菢尤ゲ僮鲾?shù)據(jù)庫(kù)。
例如我們希望插入四條用戶記錄:
insert into user(id,name) values (1,”tianshouzhi”),(2,”huhuamin”), (3,”wanghanao”),(4,”luyang”)而在分庫(kù)分表之后,這樣的sql已經(jīng)無(wú)法執(zhí)行。只有將sql轉(zhuǎn)化為如下形式才可以執(zhí)行:
insert into user_1(id,name) values (1,”tianshouzhi”) insert into user_2(id,name) values (2,”huhuamin”) insert into user_3(id,name) values (3,”wanghanao”) insert into user_0(id,name) values (4,”luyang”)
3.2 分布式ID
在分庫(kù)分表后,我們不能再使用mysql的自增主鍵。因?yàn)樵诓迦胗涗浀臅r(shí)候,不同的庫(kù)生成的記錄的自增id可能會(huì)出現(xiàn)沖突。因此需要有一個(gè)全局的id生成器。
3.3 分布式事務(wù)
例如上面的批量插入記錄到四個(gè)不同的庫(kù),如何保證要么同時(shí)成功,要么同時(shí)失敗。關(guān)于分布式事務(wù),mysql支持XA事務(wù),但是效率較低。柔性事務(wù)是目前比較主流的方案,柔性事務(wù)包括:最大努力通知型、可靠消息最終一致性方案以及TCC兩階段提交。
3.4 動(dòng)態(tài)擴(kuò)容
動(dòng)態(tài)擴(kuò)容指的是增加分庫(kù)分表的數(shù)量。
例如原來(lái)的user表拆分到2個(gè)庫(kù)的四張表上。現(xiàn)在我們希望將分庫(kù)的數(shù)量變?yōu)?個(gè),分表的數(shù)量變?yōu)?個(gè)。這種情況下一般要伴隨著數(shù)據(jù)遷移。例如在4張表的情況下,id為7的記錄,7%4=3,因此這條記錄位于user_3這張表上。但是現(xiàn)在分表的數(shù)量變?yōu)榱?個(gè),而7%8=7,而user_7這張表上根本就沒(méi)有id=7的這條記錄,因此如果不進(jìn)行數(shù)據(jù)遷移的話,就會(huì)出現(xiàn)記錄找不到的情況。
?
轉(zhuǎn)載于:https://www.cnblogs.com/zhangjwcode/p/9517965.html
總結(jié)
- 上一篇: 跟一个傻逼程序员合作是什么感受?
- 下一篇: 计算机中整数加法满足结合律吗