老生常談:MySQL 高可用架構

◆ 引言

  1. 服務冗餘:把服務部署多份,當某個節點不可用時,切換到其他節點。服務冗餘對於無狀態的服務是相對容易的。

  2. 服務備份:有些服務是無法同時存在多個運行時的,比如說:Nginx 的反向代理,一些集羣的 leader 節點。這時可以存在一個備份服務,處於隨時待命狀態。

  3. 自動切換:服務冗餘之後,當某個節點不可用時,要做到快速切換。

◆ MySQL 高可用

◆ 一主一備:

MySQL 的各種高可用架構,都脫離不了 MySQL 實例之間的數據同步,因此,我們先介紹下最簡單的一主一備架構下 MySQL 的數據同步流程。

上圖是主從數據同步的一個示意圖。

這裏還要延伸一點,binlog 存在三種形式:Statement、Row、Mixed。

只記錄 SQL 的話 binlog 會比較小,但是有些 SQL 語句在主從同步數據的時候,可能會因爲選擇不同的索引在數據同步過程中出現數據不一致。記錄 Row 的話就可以保證主從同步不會存在 SQL 語意偏差的問題,同時 Row 類型的日誌在做數據恢復的時候也比較容易,但是 Row 會導致 binlog 過大。

◆ MySQL 主從同步的幾種模式:

半同步的複製方案是在 MySQL5.5 開始引入的,普通的半同步複製方案步驟如下圖:

這種數據提交模式叫: 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