老生常談:MySQL 高可用架構
◆ 引言
-
服務冗餘:把服務部署多份,當某個節點不可用時,切換到其他節點。服務冗餘對於無狀態的服務是相對容易的。
-
服務備份:有些服務是無法同時存在多個運行時的,比如說:Nginx 的反向代理,一些集羣的 leader 節點。這時可以存在一個備份服務,處於隨時待命狀態。
-
自動切換:服務冗餘之後,當某個節點不可用時,要做到快速切換。
◆ 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://juejin.cn/post/6953789574489309192
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/WdLVLybWCNAu-6Nv8txX9Q