這是有生之年系列的填坑_(:з」∠)_
Nginx的TCP反向代理的聯(lián)動帖:http://blog.itpub.net/29510932/viewspace-1842929/
-------------------------------------------------------------------------------------正文------------------------------------------------------------------------------------
背景:懶癌晚期,整理好發(fā)上來;
環(huán)境:MySQL-5.7.9 x 4,Nging-1.9.7 x 1,五臺虛擬機
總體思路:
四個MySQL實例組成雙主雙從的多源復(fù)制結(jié)構(gòu),Nginx放在前端,對應(yīng)用層屏蔽DB層細(xì)節(jié)
配置簡記:
MySQL的雙主配置和普通的雙主配置沒什么區(qū)別,并且在這次搭建中打開了GTID;
從庫開啟多源復(fù)制需要設(shè)置
--master-info-repository=TABLE --relay-log-info-repository=TABLE
從庫開啟多源復(fù)制用的channel,注意一下語法就好;
Nginx的TCP轉(zhuǎn)發(fā)功能參考另外一篇博客,這次試驗的簡單配置如截圖
驗證:
先是看看復(fù)制的情況,建立一個測試表
隨便插入幾條數(shù)據(jù),看看從庫的status
可以看到從庫的status里面有兩個主庫的GTID信息
提問:為什么指向67的channel會有兩個主庫的GTID信息?
解惑:看一下67的relay-log的信息
看到relay-log同時包含了兩個主庫的事務(wù)信息,原因在于兩個主庫同時開啟了log-slave-updates,所以在relay-log里面包含了兩個主庫的事務(wù);
追問:那么channel_67的relay-log包含兩個主庫的事務(wù),是不是這個67主庫的channel在復(fù)現(xiàn)事務(wù)時,過濾掉了65主庫的日志呢?
解惑:關(guān)掉channel_67的SQL_THREAD之后,在兩個主庫上分別執(zhí)行一下語句,再看看從庫的status
發(fā)現(xiàn)停掉channel_67的SQL_THREAD之后,67的事務(wù)依然被更新了,從對比上來看,是channel_65的SQL_THREAD更新的,
那么同時停掉65和67的SQL_THREAD,看看效果;
基本可以得出一個結(jié)論:channel的SQL_THREAD并沒有過濾掉非master的日志,而是忠實的復(fù)現(xiàn)了每一個記錄在relay-log里面的事務(wù);
追問:既然兩個channel都會執(zhí)行relay-log的所有事務(wù),那么為什么沒有報錯?
解惑/推測:SQL_THREAD在復(fù)現(xiàn)relay-log的時候,會檢查一下已經(jīng)執(zhí)行過的事務(wù),如果是重復(fù)的,則會跳過;
提問:在雙主的MySQL上關(guān)閉log-slave-updates,從庫的同步是否會有問題/不同?
解惑:動手測試,關(guān)閉slave-log-update之后再觀察從庫的relay-log;
可以看到relay-log里面沒有主庫65的事務(wù)信息了,那么再看一下slave status
可以發(fā)現(xiàn),各個channel不再收到另外的主庫的日志,不過已執(zhí)行事務(wù)的GTID信息還是有同步的;
得出的結(jié)論:沒有出現(xiàn)問題,且各個channel都單獨處理各自主庫的事務(wù)信息,為了數(shù)據(jù)流向的清晰和明確,在雙主配置中關(guān)閉slave-log-update比較好;
延伸提問:假設(shè)channel_67的SQL_THREAD停止一段時間,使得67的insert語句沒有復(fù)現(xiàn)(假設(shè)插入值為18),而65的insert全部復(fù)現(xiàn)了(插入值為19和21),
從庫上的AUTO_INCREMENT計數(shù)器是否會出錯?
準(zhǔn)備完環(huán)境以后,處于缺少18的狀態(tài),效果如下圖
relay-log的信息中包含了缺少的事務(wù);
從結(jié)果來看,一切ok
試驗還在進(jìn)行中, Nginx的部分留給下半部分,先欠著..._(:з」∠)_...
-------------------------------------------------------------------------------------待續(xù)------------------------------------------------------------------------------------
PS:在5.6.x版本,開啟GTID必須要開啟log-slave-updates,通過查閱資料,推斷為auto_position所需要,所以需要開啟這個選項,不過在5.7.9已經(jīng)不是必要條件了。