1. 程式人生 > >mysql5.7多源複製

mysql5.7多源複製

在mysql5.7.9版本GA之前我們就已經開始使用他的多源複製功能,來實現資料分析部門的需求,將多個系統的資料匯聚到一臺伺服器上。GA之後用的更加大膽些了。現在貼出來分享下。

需求由資料分析部門提出,DB部來實現,在今年九月份的時候,開始投入使用,關於這種放法,這一過程中踩過的坑,容我一點點道來。
第一階段:實時同步5個業務庫(位於不同伺服器)資料至一臺伺服器。所有線上的複製均使用GTID的形式。建立複製關係是個相對簡單的過程,

1>通過mysqldump分別匯出五個庫的全量資料,當時資料量大概在100G左右。dump語法如下:
./mysqldump -S /data/msyql/mysql3306.sock -p –single-transaction –set-gtid-purged=OFF –master-data=2 -B test>/data/test.sql
其實在開始使用的階段上,沒有使用–master-data=2這個引數,但後來發現,如果不加這個引數是有問題的,會出現丟資料的現象,至於為什麼會丟資料,另外再寫吧。通過以上dump檔案,將會得到一個包含複製起始點的,完整的歷史備份,也許這樣說更加通俗易懂一點,包含複製起始點,越來越佩服自己說話的能力了,複製起始點,其實就是一個set-gtid-purged值,這個值得意思是,事務已經執行到了哪個GTID,但是在dump檔案裡,這個值是被註釋掉的。
2>通過mysql客戶端逐個恢復5個備份檔案,當然最好在這一過程中不要寫binlog進入新的伺服器。
mysql -h -u -p -P (最好在screen中執行,不然ssh客戶端斷了,有點日狗)

3> 建立複製關係
在建立複製關係之前,要向新的伺服器寫入gtid-purged引數,來告訴伺服器,下一步同步binlog資料時,哪些是執行過的,就不需要再複製過來了。
set global gtid-purged=’*********,******,********,******,***********’;大概是這樣的格式,此值由之前5臺伺服器的備份檔案中獲得。逗號隔開就行。
5.7建立多源複製跟5.6基本相同,sql如下:
change master to master_host = ‘10.127.37.20’,master_port=3306,master_user=’repl’,master_password=’****

’,master_auto_position=1 for channel ‘**‘;
其實跟5.6普通的複製建立,只不過是多了一個for channel option,來唯一標識複製鏈路。這樣的語句要執行5次。

然後就是開啟複製,
start slave;

show slave status\G 檢查複製狀態

大概過程就是這樣。當然,新的伺服器的配置檔案,可以仔細斟酌一番,你可以忽略庫裡不想要的表,binlog的引數等等。

第二階段: 業務在不斷擴張,新的業務上線,需要將他們的資料接入離線分析系統,就需要新增複製鏈路,這一過程如下所示:

第三階段:錯誤修復,由於是離線分析庫,可能會做一些與線上不同的mysql庫操作,當然,可以在一開始就將其忽略掉,避免不必要的麻煩。具體遇到的不同的錯誤,可以以後慢慢補充。

第四階段:詭異現象處理,丟失的索引,當然這裡說的丟失的索引,不是另外一篇部落格裡寫的由於limit問題,見這裡,http://blog.csdn.net/sun_ashe/article/details/50390877導致的索引使用不上的情況,而是真正的丟失了。當遇到詭異的情況發生時,先不要想著bug什麼的,可能是忽略了某個細節問題。事情是因為下面的這個工具引起的:
pt-online-schema-change,好像又要說好多東西才能解釋清楚,先添加個連結吧,慢慢說。

第五階段:資料量開始暴漲,從開始匯聚100G到1個T,再到兩個T。這個庫開始變得很重,對,是很重,讓人覺得很重,不得已開始去尋找新的出路,路在前方。