天天看點

MySQL雙主(主主)架構方案

在企業中,資料庫高可用一直是企業的重中之重,中小企業很多都是使用mysql主從方案,一主多從,讀寫分離等,但是單主存在單點故障,從庫切換成主庫需要作改動。是以,如果是雙主或者多主,就會增加mysql入口,增加高可用。不過多主需要考慮自增長ID問題,這個需要特别設定配置檔案,比如雙主,可以使用奇偶,總之,主之間設定自增長ID互相不沖突就能完美解決自增長ID沖突問題。

主從同步複制原理

在開始之前,我們先來了解主從同步複制原理。

複制分成三步:

1. master将改變記錄到二進制日志(binary log)中(這些記錄叫做二進制日志事件,binary log events);

2. slave将master的binary log events拷貝到它的中繼日志(relay log);

3. slave重做中繼日志中的事件,将改變反映它自己的資料。

下圖描述了這一過程:

MySQL雙主(主主)架構方案

該過程的第一部分就是master記錄二進制日志。在每個事務更新資料完成之前,master在二日志記錄這些改變。MySQL将事務串行的寫入二進制日志,即使事務中的語句都是交叉執行的。在事件寫入二進制日志完成後,master通知存儲引擎送出事務。

下一步就是slave将master的binary log拷貝到它自己的中繼日志。首先,slave開始一個工作線程——I/O線程。I/O線程在master上打開一個普通的連接配接,然後開始binlog dump process。Binlog dump process從master的二進制日志中讀取事件,如果已經跟上master,它會睡眠并等待master産生新的事件。I/O線程将這些事件寫入中繼日志。

SQL slave thread處理該過程的最後一步。SQL線程從中繼日志讀取事件,更新slave的資料,使其與master中的資料一緻。隻要該線程與I/O線程保持一緻,中繼日志通常會位于OS的緩存中,是以中繼日志的開銷很小。

此外,在master中也有一個工作線程:和其它MySQL的連接配接一樣,slave在master中打開一個連接配接也會使得master開始一個線程。

MySQL5.6以前的版本複制過程有一個很重要的限制——複制在slave上是串行化的,也就是說master上的并行更新操作不能在slave上并行操作。 MySQL5.6版本參數slave-parallel-workers=1 表示啟用多線程功能。

MySQL5.6開始,增加了一個新特性,是加入了全局事務 ID (GTID) 來強化資料庫的主備一緻性,故障恢複,以及容錯能力。

官方文檔:http://dev.mysql.com/doc/refman/5.6/en/replication-gtids.html

MySQL雙主(主主)架構方案思路是:

1.兩台mysql都可讀寫,互為主備,預設隻使用一台(masterA)負責資料的寫入,另一台(masterB)備用;

2.masterA是masterB的主庫,masterB又是masterA的主庫,它們互為主從;

3.兩台主庫之間做高可用,可以采用keepalived等方案(使用VIP對外提供服務);

4.所有提供服務的從伺服器與masterB進行主從同步(雙主多從);

5.建議采用高可用政策的時候,masterA或masterB均不因當機恢複後而搶占VIP(非搶占模式);

這樣做可以在一定程度上保證主庫的高可用,在一台主庫down掉之後,可以在極短的時間内切換到另一台主庫上(盡可能減少主庫當機對業務造成的影響),減少了主從同步給線上主庫帶來的壓力;

但是也有幾個不足的地方:

1.masterB可能會一直處于空閑狀态(可以用它當從庫,負責部分查詢);

2.主庫後面提供服務的從庫要等masterB先同步完了資料後才能去masterB上去同步資料,這樣可能會造成一定程度的同步延時;

架構的簡易圖如下:

MySQL雙主(主主)架構方案

主主環境(這裡隻介紹2台主的配置方案):

1.CentOS 6.8 64位 2台:masterA(192.168.10.11),masterB(192.168.10.12)

2.官方Mysql5.6版本

搭建過程:

MySQL雙主(主主)架構方案
MySQL雙主(主主)架構方案
MySQL雙主(主主)架構方案
MySQL雙主(主主)架構方案
MySQL雙主(主主)架構方案
MySQL雙主(主主)架構方案

masterA上:

masterB上:

MySQL雙主(主主)架構方案
MySQL雙主(主主)架構方案

masterB上

MySQL雙主(主主)架構方案
MySQL雙主(主主)架構方案
MySQL雙主(主主)架構方案
MySQL雙主(主主)架構方案

顯示有如下狀态則正常:

#本人是測試環境,可以保證沒資料寫入,否則需要的步驟是:先masterA鎖表-->masterA備份資料-->masterA解鎖表 -->masterB導入資料-->masterB設定主從-->檢視主從

MySQL雙主(主主)架構方案
MySQL雙主(主主)架構方案
MySQL雙主(主主)架構方案
MySQL雙主(主主)架構方案
MySQL雙主(主主)架構方案
MySQL雙主(主主)架構方案

masterA和masterB分别執行如下指令:

MySQL雙主(主主)架構方案
MySQL雙主(主主)架構方案

一種主從報錯折騰了我半天:

Last_IO_Errno: 1236

Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not open log file'

後面修改主從同步相關 參數,确認原因是my.cnf增加了如下參數:

log-bin = mysql-bin

relay-log = mysql-bin

MySQL雙主(主主)架構方案

從正常主主同步時的二進制日志檔案顯示,有2套二進制日志。是以推斷上面2個參數導緻不能産生2套二進制檔案,故導緻二進制檔案錯亂和丢失。