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