分庫分表介紹:
分庫分表的目的是為了系統(tǒng)高并發(fā)、高可用。分庫和年發(fā)表是兩回事,兩個概念,都是為了防止數(shù)據(jù)庫服務(wù)因為同一時間內(nèi)訪問量過大導(dǎo)致宕機(jī)而設(shè)計的一種應(yīng)對策略。
一、為什么要分庫:
參考:
https://www.cnblogs.com/yanggb/p/11214339.html
一般經(jīng)驗來說,單庫支持的最大并發(fā)量到2000,最好的運行是1000。如果更高的并發(fā)量需求,就需要考慮擴(kuò)容,將一個庫的數(shù)據(jù)拆分到多個庫中,訪問的時候根據(jù)一定條件訪問單庫,緩解單庫的性能壓力。
二、為什么要分表:
分表也是考慮到性能,單表數(shù)據(jù)量太大的時候sql的執(zhí)行性能就降低。分表就是按照一定的策略將單表的數(shù)據(jù)拆分到多表中,查詢也按照一定的策略去查詢,這樣查詢的數(shù)據(jù)范圍就縮小了,比如按照用戶id來分表,通過id確定哪個表,把表的數(shù)據(jù)量控制在一定范圍內(nèi),提升sql語句執(zhí)行性能。
選型介紹:
參考:
https://www.it610.com/article/1281542839301324800.htm
https://blog.csdn.net/xuheng8600/article/details/80336094
一、三個問題:
1.事務(wù)一致性:比如更新10張表,最后一張失敗,怎樣保證事務(wù)
2.字典表問題:字典表維護(hù)一個庫影響效率,多個庫存儲出現(xiàn)事務(wù)一致性、冗余問題
3.分頁查詢問題:如果使用mycat,進(jìn)行分頁的時候會面臨數(shù)據(jù)量大的問題
二、中間件對比:
中間件 |
說明 |
備注 |
Atlas |
不能實現(xiàn)分布式分表,所有的子表必須在同一臺DB的同一個database里且所有的子表必須事先建好,Atlas沒有自動建表的功能。 |
|
Cobar |
必須將拆分后的表分別放入不同的庫來實現(xiàn)分布式。 |
擴(kuò)展性的問題放棄 |
TDDL |
阿里,功能強(qiáng)大,過于復(fù)雜,部分開源。需要評估使用情況,防止過剩。 |
阿里系 |
Mycat |
國內(nèi)開源,從入門到放 |
名氣大,已經(jīng)到頭了 |
heisenberg |
百度開源,相對簡單,易于管理。 |
現(xiàn)在不維護(hù)了 |
Oceanus |
功能強(qiáng)大,開源,簡化開發(fā)和配置成功。但產(chǎn)品還不成熟。 |
|
vitess |
google產(chǎn)品,集群基于ZooKeeper管理,通過RPC方式進(jìn)行數(shù)據(jù)處理,可支撐高流量,它還添加了一個連接池,具有基于行的高速緩存,重寫SQL查詢,更安全 |
|
OneProxy |
中國廠商產(chǎn)品,穩(wěn)定性待確認(rèn)。 |
|
Sharding-JDBC |
當(dāng)當(dāng)最新開源,jdbc層面操作 |
靠譜 |
sharding-jdbc這種client層的有點在于不用部署,運維成本就比較低。同時不需要代理層二次轉(zhuǎn)發(fā)請求,性能高。缺點是:遇到升級的話,各個系統(tǒng)都重新升級版本再發(fā)布,因為各個系統(tǒng)都需要耦合sharding-jdbc依賴。
mycat這種proxy方案缺點在于需要部署,因此運維成本增加。但是優(yōu)點是各個項目是解耦的,升級的話就是處理中間件就行。
三、概念介紹:
概念 |
介紹 |
總結(jié) |
水平拆分 |
水平拆分的意思,就是把一個表的數(shù)據(jù)拆分到多個庫的多個表里面去。這里面的每個庫的表結(jié)構(gòu)都是一樣的,只不過是表中存放的數(shù)據(jù)不一樣,每個庫表的數(shù)據(jù)匯總起來就是全部數(shù)據(jù)。水平拆分的意義在于將數(shù)據(jù)均勻地存放在各個庫表里,依靠多個庫來杠更高的并發(fā),而且還能借助多個庫的存儲容量來進(jìn)行擴(kuò)容 |
表結(jié)構(gòu)一樣、擴(kuò)容、高并發(fā) |
垂直拆分 |
垂直拆分的意思,就是把一個有很多字段的表給拆分成多個表或者多個庫上面去,每個庫表的結(jié)構(gòu)都不一樣,每個庫表都包含部分字段。一般來說,會將較少的訪問頻率很高的字段放到一個表里面去,然后將較多的訪問頻率很低的字段放到另外一個表里面去。因為數(shù)據(jù)庫是有緩存的,你訪問頻率高的行字段越少,就可以在緩存里面緩存更多的行,性能也就越好。這個一般在表層面做的較多一些。 |
拆分字段、利用緩存提升性能 |
四、兩種方案:
方案 |
優(yōu)點 |
缺點 |
按照range區(qū)分 |
比較常用的是按照時間劃分,擴(kuò)容簡單,下個月自動寫入庫 |
熱點數(shù)據(jù)會請求到同一個表,起不到高并發(fā) |
按照hash分發(fā) |
按照字段hash值均勻分布,平均分配每個庫表的數(shù)據(jù)量和請求壓力 |
擴(kuò)容麻煩,數(shù)據(jù)遷移需要重新計算hash值并重新分配 |