分庫分表
分庫分表場景之IO瓶頸
- 由于磁盤讀IO非常慢,而且熱點數(shù)據(jù)多悴能,緩存內(nèi)存放不下這么多數(shù)據(jù)揣钦,那么就會導(dǎo)致產(chǎn)生對同一個文件產(chǎn)生多次IO讀取。解決方案 => 分庫和垂直分表
- 網(wǎng)絡(luò)IO瓶頸搜骡,請求的數(shù)據(jù)太多,網(wǎng)絡(luò)帶寬不夠 => 分庫
分庫分表場景之CPU瓶頸
- 單表數(shù)據(jù)量太大佑女,導(dǎo)致查詢行數(shù)過多记靡,SQL效率低下 => 水平分表
水平分表與分庫(拆分行數(shù))
以字段為依據(jù),按照一定策略(hash团驱、range等)摸吠,將一個表中的數(shù)據(jù)拆分到多個表中(將一個表中的數(shù)據(jù)拆分到多個庫中)。
比如user_id / 20(分表數(shù)) %12(總庫數(shù)求余) = 1則放第一個庫嚎花,且user_id % 20(分表數(shù))=3 表示數(shù)據(jù)應(yīng)該放在第一個庫且第4(3 + 1)個表寸痢;這是數(shù)據(jù)比較均衡的處理辦法
垂直(拆分字段)
以表為依據(jù),按照業(yè)務(wù)歸屬不同紊选,將不同的表拆分到不同的庫中
分區(qū)
mysql自帶的道逗,把數(shù)據(jù)文件分為多個文件以減少對同一個文件磁盤IO阻塞,減少一個文件的大小
分庫分表的問題產(chǎn)生
- join問題:代碼層面進行優(yōu)化
- 查詢字段非分表字段(例如按照user_id分表献烦,但查詢字段是order_id):使用中間表滓窍,中間表加入索引,并加緩存巩那,一定要注意擊穿問題
- 分布式事務(wù)問題:使用外部XA事務(wù)進行處理吏夯,MySQL數(shù)據(jù)庫外部XA可以用在分布式數(shù)據(jù)庫代理層,實現(xiàn)對MySQL數(shù)據(jù)庫的分布式事務(wù)支持即横,例如開源的代理工具:網(wǎng)易的DDB噪生,淘寶的TDDL等等。
讀寫分離
表建立主從復(fù)制(mysql自帶工具即可)东囚,實現(xiàn)主寫跺嗽,從讀的模式。
主服務(wù)器會開啟多個線程用于同步binlog舔庶,子服務(wù)器會開啟一個IO線程和一個sql線程抛蚁,IO線程會主動找到主服務(wù)器的服務(wù)線程進行請求返回最新的binlog日志信息,然后子服務(wù)器再進行更新數(shù)據(jù)庫信息放入relay log(中繼日志)惕橙,子服務(wù)器的sql線程會定時讀取中繼日志數(shù)據(jù)更新數(shù)據(jù)瞧甩。
Mysql的高可用高并發(fā)架構(gòu)
mysql高可用集群架構(gòu).png
MHA:Master HA 一個保證mysql高可用的架構(gòu)軟件,保證在master宕機時能主動切換到slave弥鹦。