MySQL主從, 高可用架構(gòu)與高性能架構(gòu)
MySQL主從復(fù)制
需求: 以前單個(gè)服務(wù)器提供服務(wù), 若突然壞了, 需要通過歷史備份將數(shù)據(jù)備份至新服務(wù)器, 需要花很長時(shí)間, 損失較大
主從復(fù)制原理,: 基于二進(jìn)制日志(binlog), 記錄所有數(shù)據(jù)的變化 , 只要某個(gè)時(shí)間點(diǎn)主從庫數(shù)據(jù)一致, 后面通過二進(jìn)制日志實(shí)現(xiàn)同步

方框介紹
binlog: 主庫的二進(jìn)制日志, 記錄主庫數(shù)據(jù)變化
master.info: 記錄鏈接主庫的用戶名和密碼 , 從庫當(dāng)前二進(jìn)制日志的數(shù)據(jù)位置
relay-log.info: 上次運(yùn)行過的二進(jìn)制日志的數(shù)據(jù)位置
執(zhí)行過程介紹:
- I/O線程拿到master.info里面存的鏈接主庫的用戶名和密碼與當(dāng)前二進(jìn)制日志的數(shù)據(jù)位置
- I/O線程鏈接主庫并詢問主庫是否有二進(jìn)制日志的更新, 通過master.info里面的數(shù)據(jù)位置與主庫的二進(jìn)制比較
- 主庫通過dump線程讀取二進(jìn)制日志
- 若有更新, 則將新數(shù)據(jù)通過dump線程發(fā)送給I/O線程
- I/O線程將新數(shù)據(jù)寫入TCP/IP緩存
- I/O線程給dump線程返回ack表示收到
- I/O線程將剛拿到的二進(jìn)制文件的最新數(shù)據(jù)更新master.info里面存的數(shù)據(jù)位置, 用于下次再詢問時(shí)的比較依據(jù)
- TCP/IP緩存將數(shù)據(jù)寫入relay-log(中繼日志)
- SQL線程讀取上次執(zhí)行過的二進(jìn)制文件的位置,
- 找到最新的日志文件并執(zhí)行
- 更新relay-log.info
可以通過中間件實(shí)現(xiàn)讀寫分離
中間件應(yīng)該實(shí)現(xiàn)的功能:
- 判斷請求是讀還是寫, 寫的請求發(fā)給主庫, 讀的請求發(fā)給從庫, 實(shí)現(xiàn)讀寫分離
- 監(jiān)控, 若某臺(tái)從庫掛了, 不在給其發(fā)請求
- 讀請求的負(fù)載均衡
高可用架構(gòu)
以上復(fù)制集有一個(gè)缺點(diǎn), 當(dāng)主庫掛了, 主庫里的最新數(shù)據(jù)可能沒有及時(shí)同步到從庫,造成數(shù)據(jù)丟失
比較好的分布式架構(gòu)中間件有MHA , 淘寶基于MHA開發(fā)了TMHA, TDDL
這些中間件可以監(jiān)控, 當(dāng)主庫掛了能實(shí)現(xiàn)以下功能
- 選主: 選數(shù)據(jù)最新的一個(gè)從庫為主庫
- 數(shù)據(jù)補(bǔ)償: 需要將主庫二進(jìn)制日志文件獨(dú)立出來, 單獨(dú)放到一個(gè)數(shù)據(jù)庫
mysql5.7的版本也有一個(gè)架構(gòu)目前還不太成熟
mysql innodb cluster 組成如下:
MGR(實(shí)現(xiàn)多臺(tái)服務(wù)器提供寫的功能)+mysql router(實(shí)現(xiàn)讀寫分離)+mysql shell
mysql的中間件理念來自于MongoDB sharding cluster
高性能架構(gòu)
分片集群
1. 將表分到不同的服務(wù)器
join不同服務(wù)器的兩張表時(shí), 在服務(wù)器之前擋一個(gè)中間件, 將mysql的sql層提到中間件中, 下面的服務(wù)器只需要提供表數(shù)據(jù), join等sql操作由中間件完成
2. 將單表的數(shù)據(jù)行拆到不同庫
比如一張表有90w行數(shù)據(jù), 可以拆到三個(gè)服務(wù)器, 每個(gè)服務(wù)器放30w條
同樣在服務(wù)器前擋一個(gè)中間件, 記錄數(shù)據(jù)庫的分片策略以及各節(jié)點(diǎn)的信息
各個(gè)節(jié)點(diǎn)只負(fù)責(zé)提供數(shù)據(jù)與存數(shù)據(jù)