雙主架構圖
雙主架構實現原理
當從庫IO線程接受到主庫傳遞來的二進制日志(Binlog)並將之保存為從庫的中繼日志(relay log),然后從庫SQL線程將中繼日志(relay log)的事件重做到從庫上,實現主從數據同步。
如果SQL線程發現該事件的server_id與當前從庫的server_id相同,則會丟棄該事件,因此如果兩台MySQL如何互為主從,不會導致相同的事件被重復執行。
雙主架構設計目標
在一套MySQL復制群集中,通過雙主或多主架構,解決一主多從架構的單點故障,減少主從切換的故障處理時間,增加MySQL群集的高可用性。
雙主架構實現方案
1、主備模式,兩台MySQL互為主從,其中一台作為主節點對外提供服務,另外一台作為備機節點(standby),當提供服務的主節點發生故障后,將服務請求快速切換到備用節點,原主節點故障恢復后轉換為備用節點(standby)。
2、主主模式,兩台MySQL互為主從,且兩台MySQL均作為主節點對外提供服務,當其中一台MySQL發生故障后,將指向該故障節點的請求快速切換到另外一台MySQL,原來指向非故障節點的請求不受影響。
在主主模式下,兩個主庫都提供讀寫服務,如果應用通過兩個主庫操作相同數據,則會發生沖突導致數據覆蓋(使用語句模式復制)或復制異常(使用行模式復制),因此需要對讀寫服務進行控制:
1、基於自主主鍵控制,通過設置自增屬性auto_increment_offset和auto_increment_increment來控制每個主節點生產不同的自增值,並根據不同自增值訪問不同主節點。
2、基於庫級別或表級別控制,如應用APP1訪問節點node1上的DB1庫,而應用APP2訪問節點node2上的DB2庫,兩個主節點間不會操作相同表的數據,因此不會存在事務沖突。
為保證應用程序使用相同數據庫連接配置而不受故障切換影響,常用方案有:
1、VIP,通過vrrpd或keepalived將VIP動態綁定到新主節點
2、域名,通過切換域名將域名指向新主節點
3、代理,通過更新代理中存放的路由信息來指向新主節點。
雙主架構優點
1、主主模式能將讀寫請求分攤到兩個主節點,有效提升服務器使用率。
2、主節點發生故障后,能快速進行主從切換。
3、當故障節點恢復后,故障節點能通過復制進行數據恢復(應用其他節點數據)和數據同步(將未同步數據發生給其他節點)。
雙主架構缺點
1、當主節點上MySQL實例發生故障后,可能會存在部分數據(Binlog)未同步到另外的主節點,導致數據丟失(直到故障節點恢復)。
2、主主模式下,很容易因數據訪問控制不當導致數據沖突。
3、為提高系統高可用性,雙主架構會被擴展成雙主多從結構,同樣存在主節點發生故障后多個從庫選主和恢復復制的問題。
MMM架構
在雙主架構下,MySQL本身並沒有自動故障切換能力,Google開源項目MySQL-MMM(Master-Master Replication Manager for MySQL)能夠用來監控MySQL主主復制並實現自動故障轉移。
在使用after_sync的半同步復制的雙主架構下,能有效確保兩個主庫的BINLOG同步,再配合MMM工具實現自動故障轉移,確保群集高可用。