溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL數(shù)據(jù)庫(kù)中怎么實(shí)現(xiàn)多主復(fù)制

發(fā)布時(shí)間:2021-08-07 16:26:55 來(lái)源:億速云 閱讀:151 作者:Leah 欄目:數(shù)據(jù)庫(kù)

這篇文章給大家介紹MySQL數(shù)據(jù)庫(kù)中怎么實(shí)現(xiàn)多主復(fù)制,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

MySQL 管理每個(gè)復(fù)制通道,都是通過(guò)一個(gè)Master_info類(sql/rpl_mi.h中定義),start_slave/change_master /stop_slave/show_slave/end_slave這些函數(shù)都需要傳入一個(gè)Master_info指針,這就給我們改造多Master提 供了很大的便利,基本只需要為每個(gè)復(fù)制通道傳入相應(yīng)的Master_info即可。
  除了找到函數(shù)入口,還需要讓語(yǔ)法支持多主,否則CHANGE MASTER TO語(yǔ)句并不能支持多主。我修改了sql_yacc.yy,支持如下語(yǔ)法:
  CHANGE MASTER ‘通道標(biāo)識(shí)’ TO,START SLAVE ‘通道標(biāo)識(shí)’,STOP SLAVE ‘通道標(biāo)識(shí)’,SHOW SLAVE ‘通道標(biāo)識(shí)’ STATUS。
  這樣就可以支持多Master的語(yǔ)法了。
   另一個(gè)問(wèn)題是怎么保存多個(gè)通道的信息,默認(rèn)單通道的情況下,用master.info存Master的信息,用relay-log.info存復(fù)制應(yīng)用 的情況。所以存儲(chǔ)文件的名稱也要修改,我的方式是,master.info和relay-log.info在末尾加上通道標(biāo)識(shí)后綴,例如名為”plx”的 通道,會(huì)存成master.info.plx和relay-log.info.plx。Relay Log因?yàn)橛行蛄?,所以增加?通道標(biāo)識(shí)”在序列前。
   還有一個(gè)問(wèn)題就是,操作命令都是用通道標(biāo)識(shí)來(lái)確定一個(gè)通道,那么肯定需要持久化正在用的通道名稱,以及建立通道后可以用通道名獲取相應(yīng)的 Master_info。于是我新建了一個(gè)MASTER_INFO_INDEX類(在sql/rpl_mi.h),里面包含一個(gè)通道標(biāo)識(shí)和 Master_info指針的對(duì)應(yīng)HASH表,以及持久化需要的IO_CACHE,通過(guò)master.info.index這個(gè)文件來(lái)存已有的通道標(biāo)識(shí)。
  命名實(shí)例如下:

雙擊代碼全選
1 2 3 4 5 6 7 8 9 10 11-rw-rw—- 1 mysql mysql 10 Feb 13 20:40 master.info.index-rw-rw—- 1 mysql mysql 76 Feb 14 17:27 master.info.plx1 -rw-rw—- 1 mysql mysql 71 Feb 14 17:27 master.info.plx2 -rw-rw—- 1 mysql mysql 90 Feb 14 17:25 relay-log.info.plx1 -rw-rw—- 1 mysql mysql 90 Feb 14 17:27 relay-log.info.plx2 -rw-rw—- 1 mysql mysql 160 Feb 14 10:16 mysql-relay-bin-plx1.000011 -rw-rw—- 1 mysql mysql 83765425 Feb 14 17:27 mysql-relay-bin-plx1.000012 -rw-rw—- 1 mysql mysql 106 Feb 14 10:16 mysql-relay-bin-plx1.index-rw-rw—- 1 mysql mysql 160 Feb 14 10:16 mysql-relay-bin-plx2.000014 -rw-rw—- 1 mysql mysql 83455792 Feb 14 17:27 mysql-relay-bin-plx2.000015 -rw-rw—- 1 mysql mysql 106 Feb 14 10:16 mysql-relay-bin-plx2.index

  下載Patch在此:http://bugs.mysql.com/file.php?id=18020

  有了多Master以后我們可以做什么呢?下面給兩個(gè)應(yīng)用場(chǎng)景。
   第一個(gè)是一備多的備份。因?yàn)槲覀儾捎玫姆謳?kù)策略,使我們一個(gè)集群會(huì)有很多個(gè)實(shí)例,每個(gè)實(shí)例里面有幾個(gè)Schema,但是肯定不會(huì)重復(fù)。例如第一個(gè)實(shí)例是 1~3號(hào)Schema。第二個(gè)實(shí)例就是4~6號(hào)Schema,所以binlog應(yīng)用到一起并不會(huì)沖突數(shù)據(jù)。這是我們測(cè)試的在線備份方案。
  

   第二個(gè)是跨機(jī)房的HA。為了容災(zāi)或者加速,很多公司都采用在不同機(jī)房部署數(shù)據(jù)庫(kù)的方式,所以就涉及到數(shù)據(jù)同步。為了保證每個(gè)機(jī)房產(chǎn)生的數(shù)據(jù)不沖突,一般 來(lái)說(shuō)我們采用的是auto_increment_increment,auto_increment_offset這兩個(gè)參數(shù),可以控制步進(jìn)。例如雙 MAster,我們會(huì)配置主庫(kù)是奇數(shù)序列的ID,備庫(kù)是偶數(shù)序列的ID,這樣切換時(shí)就算有少量binlog還未應(yīng)用,也不會(huì)導(dǎo)致數(shù)據(jù)沖突。跨機(jī)房以后,例 如兩個(gè)機(jī)房都有雙Master,兩個(gè)機(jī)房之間數(shù)據(jù)又需要同步,以前需要借助第三方腳本或者程序,有了多Master,按如下方式搭建,設(shè)置步進(jìn)為4,就可 以保證每個(gè)機(jī)房有雙MAster HA,機(jī)房之間數(shù)據(jù)又可以同步。
  

  已知缺陷:
  1. 我還沒(méi)做reset slave ‘通道標(biāo)識(shí)’命令,就是復(fù)制通道還不能重置,只能CHANGE MASTER來(lái)改,不是做不了,因?yàn)闀簳r(shí)我們沒(méi)這個(gè)需求,等穩(wěn)定了再考慮這個(gè)細(xì)節(jié)。
   2. 數(shù)據(jù)沖突沒(méi)有檢測(cè)。這個(gè)是無(wú)法解決的,我只是簡(jiǎn)單的調(diào)用了啟動(dòng)Slave的函數(shù)來(lái)啟動(dòng)多個(gè)復(fù)制線程,binlog取到本地應(yīng)用,有數(shù)據(jù)沖突是不能事先檢測(cè) 的,執(zhí)行到了才會(huì)報(bào)出來(lái),可以設(shè)置skip-slave-error,對(duì)全局有效。其他復(fù)制相關(guān)的也是全局有效。

關(guān)于MySQL數(shù)據(jù)庫(kù)中怎么實(shí)現(xiàn)多主復(fù)制就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI