分库分表介绍
一、背景
讀寫分離是為了擴展數據庫的讀能力,分庫分表則是為了擴展數據庫的寫能力。
一旦業務表中數據太大(對于mysql,單表數據一般不超過3000w,單庫不超過300G),無論是任何CRUD操作,所耗費資源和性能都極大。這個時候一般就需要
分庫分表,將海量數據分配給N個子表維護。
二、分庫分表優點
分庫優點:降低單臺機器的負載壓力
分表優點:提高數據操作的效率
三、分庫分表的挑戰
主要體現在四個方面:基本的數據增、刪、改操作,分布式ID生成,分布式事務,動態擴容。
3.1 對于研發人員,即使分庫分表,我們仍然希望能夠像單表那樣去操作數據庫。
例如我們希望插入四條用戶記錄:
insert into user(id,name) values (1,”tianshouzhi”),(2,”huhuamin”), (3,”wanghanao”),(4,”luyang”)而在分庫分表之后,這樣的sql已經無法執行。只有將sql轉化為如下形式才可以執行:
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
在分庫分表后,我們不能再使用mysql的自增主鍵。因為在插入記錄的時候,不同的庫生成的記錄的自增id可能會出現沖突。因此需要有一個全局的id生成器。
3.3 分布式事務
例如上面的批量插入記錄到四個不同的庫,如何保證要么同時成功,要么同時失敗。關于分布式事務,mysql支持XA事務,但是效率較低。柔性事務是目前比較主流的方案,柔性事務包括:最大努力通知型、可靠消息最終一致性方案以及TCC兩階段提交。
3.4 動態擴容
動態擴容指的是增加分庫分表的數量。
例如原來的user表拆分到2個庫的四張表上。現在我們希望將分庫的數量變為4個,分表的數量變為8個。這種情況下一般要伴隨著數據遷移。例如在4張表的情況下,id為7的記錄,7%4=3,因此這條記錄位于user_3這張表上。但是現在分表的數量變為了8個,而7%8=7,而user_7這張表上根本就沒有id=7的這條記錄,因此如果不進行數據遷移的話,就會出現記錄找不到的情況。
?
轉載于:https://www.cnblogs.com/zhangjwcode/p/9517965.html
總結
- 上一篇: 跟一个傻逼程序员合作是什么感受?
- 下一篇: 计算机中整数加法满足结合律吗