MySQL:互聯(lián)網(wǎng)公司常用分庫分表方案匯總!
點(diǎn)擊關(guān)注上方“杰哥的IT之旅”,

一、數(shù)據(jù)庫瓶頸
1、IO瓶頸
2、CPU瓶頸
二、分庫分表
1、水平分庫

每個(gè)庫的結(jié)構(gòu)都一樣; 每個(gè)庫的數(shù)據(jù)都不一樣,沒有交集; 所有庫的并集是全量數(shù)據(jù);
2、水平分表

每個(gè)表的結(jié)構(gòu)都一樣; 每個(gè)表的數(shù)據(jù)都不一樣,沒有交集; 所有表的并集是全量數(shù)據(jù);
3、垂直分庫

每個(gè)庫的結(jié)構(gòu)都不一樣; 每個(gè)庫的數(shù)據(jù)也不一樣,沒有交集; 所有庫的并集是全量數(shù)據(jù);
4、垂直分表

每個(gè)表的結(jié)構(gòu)都不一樣; 每個(gè)表的數(shù)據(jù)也不一樣,一般來說,每個(gè)表的字段至少有一列交集,一般是主鍵,用于關(guān)聯(lián)數(shù)據(jù); 所有表的并集是全量數(shù)據(jù);
三、分庫分表工具
sharding-sphere:jar,前身是sharding-jdbc; TDDL:jar,Taobao Distribute Data Layer; Mycat:中間件。
注:工具的利弊,請自行調(diào)研,官網(wǎng)和社區(qū)優(yōu)先。
四、分庫分表步驟
1、非partition key的查詢問題


注:寫入時(shí),基因法生成user_id,如圖。關(guān)于xbit基因,例如要分8張表,23=8,故x取3,即3bit基因。根據(jù)user_id查詢時(shí)可直接取模路由到對應(yīng)的分庫或分表。 根據(jù)user_name查詢時(shí),先通過user_name_code生成函數(shù)生成user_name_code再對其取模路由到對應(yīng)的分庫或分表。id生成常用snowflake算法。


注:按照order_id或buyer_id查詢時(shí)路由到db_o_buyer庫中,按照seller_id查詢時(shí)路由到db_o_seller庫中。感覺有點(diǎn)本末倒置!有其他好的辦法嗎?改變技術(shù)棧呢?


2、非partition key跨庫跨表分頁查詢問題
注:用NoSQL法解決(ES等)。
3、擴(kuò)容問題

注:擴(kuò)容是成倍的。

第一步:(同步雙寫)修改應(yīng)用配置和代碼,加上雙寫,部署; 第二步:(同步雙寫)將老庫中的老數(shù)據(jù)復(fù)制到新庫中; 第三步:(同步雙寫)以老庫為準(zhǔn)校對新庫中的老數(shù)據(jù); 第四步:(同步雙寫)修改應(yīng)用配置和代碼,去掉雙寫,部署;
注:雙寫是通用方案。
六、分庫分表總結(jié)
分庫分表,首先得知道瓶頸在哪里,然后才能合理地拆分(分庫還是分表?水平還是垂直?分幾個(gè)?)。且不可為了分庫分表而拆分。 選key很重要,既要考慮到拆分均勻,也要考慮到非partition key的查詢。 只要能滿足需求,拆分規(guī)則越簡單越好。
七、分庫分表示例
示例GitHub地址:https://github.com/littlecharacter4s/study-sharding
本文由“壹伴編輯器”提供技術(shù)支持
- End - 本公眾號全部博文已整理成一個(gè)目錄,請?jiān)诠娞柡笈_回復(fù)「 m」獲??!推薦閱讀: 1、學(xué)生黨學(xué)編程,有這個(gè)開源項(xiàng)目就夠了!
2、太贊了!程序員應(yīng)該訪問的最佳網(wǎng)站都在這里了!
3、再見,Navicat!
4、一款基于 Python 語言的 Linux 資源監(jiān)視器!
5、900 多道 LeetCode 題解,這個(gè) GitHub 項(xiàng)目值得 Star!
6、SSH 只能用于遠(yuǎn)程 Linux 主機(jī)?那說明你見識太小了!好文和朋友一起看~
評論
圖片
表情
