引言
“高可用”是互聯網一個永恒的話題,先避開MySQL不談,為了保證各種服務的高可用有幾種常用的解決方案,
- 服務冗余:把服務部署多份,當某個節點不可用時,切換到其他節點,服務冗余對于無狀態的服務是相對容易的,
- 服務備份:有些服務是無法同時存在多個運行時的,比如說:Nginx的反向代理,一些集群的leader節點,這時可以存在一個備份服務,處于隨時待命狀態,
- 自動切換:服務冗余之后,當某個節點不可用時,要做到快速切換,
總結起來就是 冗余+故障轉移 ,
MySQL高可用
MySQL的高可用也是同樣的思路,首先要有多個MySQL實體提供服務,其次就是當某個實體掛掉時,可以自動切換流量,同時MySQL作為存盤,節點之間資料同步也是一個難題(換句話說,有狀態的服務都面臨這個問題),
一主一備:
MySQL的各種高可用架構,都脫離不了MySQL實體之間的資料同步,因此,我們先介紹下最簡單的一主一備架構下MySQL的資料同步流程,

上圖是主從資料同步的一個示意圖,
- Master節點有Dump行程把binlog中的資料發送到Slave節點,
- Slave節點有IO行程接收資料寫入relay log,
- Slave節點的SQL行程根據relay log寫入資料,
這里還要延伸一點,binlog存在三種形式:Statement、Row、Mixed,
- Statement:就是把每一條SQL記錄到binlog中,
- Row:是把每一行修改的具體資料記錄到binlog中,
- Mixed:MySQL會靈活的區分,需要記錄sql還是具體修改的記錄,
只記錄SQL的話binlog會比較小,但是有些SQL陳述句在主從同步資料的時候,可能會因為選擇不同的索引在資料同步程序中出現資料不一致,記錄Row的話就可以保證主從同步不會存在SQL語意偏差的問題,同時Row型別的日志在做資料恢復的時候也比較容易,但是Row會導致binlog過大,
MySQL主從同步的幾種模式:
- 異步模式:
在這種同步策略下,主庫按照自己的流程處理完資料,會直接回傳結果,不會等待主庫和從庫之間的資料同步, 優點:效率高, 缺點:Master節點掛掉之后,Slave節點會丟失資料, - 全同步模式: 主庫會等待所有從庫都執行完sql陳述句并ACK完成,才回傳成功, 優點:有很好的資料一致性保障, 缺點:會造成資料操作延遲,降低了MySQL的吞吐量,
- 半同步模式:主庫會等待至少有一個從庫把資料寫入relay log并ACK完成,才成功回傳結果, 半同步模式介于異步和全同步之間,
半同步的復制方案是在MySQL5.5開始引入的,普通的半同步復制方案步驟如下圖:
- Master節點寫資料到Binlog,并且執行Sync操作,
- Master發送資料給Slave節點,同時commit主庫的事務,
- 收到ACK后Master節點把資料回傳給客戶端,
這種資料提交模式叫: after_commit

after_commit 模式存在問題: 主庫等待ACK時,事務已經commit,主庫的其他事務可以讀到commit的資料,這個時候如果Master崩潰,slave資料丟失,發生主從切換,會導致出現幻讀, 為了解決這個問題MySQL5.7提出了新的半同步復制模式: after_sync

把主庫的事務提交放到了ACK之后,避免了上述問題, MySQL5.7還引入了 enhanced multi-threaded slave (簡稱MTS)模式, 當slave配置 slave_parallel_workers >0并且
global.slave_parallel_type =‘LOGICAL_CLOCK’,可支持一個schema下,slave_parallel_workers個worker執行緒并發執行relay log中主庫提交的事務,極大地提高了主從復制的效率, MySQL5.7半同步功能可以通過
rpl_semi_sync_master_wait_slave_count 引數配置slave節點ACK的個數,認為主從同步完成,
基于MySQL主從同步資料越來越完善,效率越來越高,也就引出了第一種MySQL的高可用架構: 基于MySQL自身的主從同步方案,常用的一種部署架構是: 用戶通過VIP訪問Master和Slave節點,每個節點采用keepalved探索,配置主從關系,進行資料同步,

基于MHA的高可用架構: 部署一份MHA的Manager節點,在MySQL各個實體部署MHA Node節點,MHA可以實作秒級的故障自動轉移, 當然MySQL節點之間的資料同步還要依賴MySQL自身的資料同步方式,

MGR(MySQL Group Replication)模式: 感覺MySQL官方更看好MGR集群方案,但是目前我還不知道國內有哪一家公司在使用, MGR集群是由所有的MySQL Server共同組成的,每個Server都有完整的副本資料,副本之間基于Row格式的日志和GTID來做副本之前的資料同步,采用Paxos演算法實作資料的一致性保障, MGR架構要比前面講述的半同步和異步同步資料的方式要復雜,具體可以參照 官網

總結
MySQL的高可用架構沒有銀彈,了解其原理,選擇符合自己業務場景的部署架構就可以了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/382843.html
標籤:其他
下一篇:單目運算子a++和++a的區別
