mysql主主復(fù)制原理及配置方法

Mysql主主復(fù)制原理

主主復(fù)制的原理實(shí)際上是主從復(fù)制的原理柱恤,讓兩臺(tái)服務(wù)器互為主從数初,就實(shí)現(xiàn)了主主復(fù)制。以下介紹主從復(fù)制原理:

主從復(fù)制

如圖:

主從復(fù)制過(guò)程存在三個(gè)線程梗顺,Master端的I/O線程泡孩,Slave的I/O線程與SQL線程。Master端需要開(kāi)啟binlog日志寺谤,Slave端需要開(kāi)啟relaylog仑鸥。

1、Slave端的I/O讀取master.info文件变屁,獲取binlog文件名和位置點(diǎn)眼俊,然后向Master端的I/O線程請(qǐng)求,該binlog文件名和位置點(diǎn)的binlog信息粟关。

(master.info文件在配置主從復(fù)制時(shí)使用change master命令來(lái)指定生成)

2疮胖、Master端的I/O線程會(huì)根據(jù)Slave端的I/O線程請(qǐng)求的信息來(lái)讀取Master的binlog日志信息與及讀取到最新的binlog文件名和位置點(diǎn)一同返回給Slave的I/O線程。

3誊役、Slave端的I/O線程會(huì)把獲取到的binlog日志寫(xiě)入relaylog(中繼日志)文件中获列,并且更新master.info文件信息。(把讀取到Master最新的binlog日志文件名和位置點(diǎn)更新到master.info文件中蛔垢,下一次當(dāng)前位置去讀取Master的binlog日志)

4击孩、Slave端的SQL線程會(huì)定期讀取relaylog,把二進(jìn)制的日志解析成SQL語(yǔ)句鹏漆,并執(zhí)行這些SQL語(yǔ)句巩梢,同步數(shù)據(jù)到從庫(kù)中。

注意:mysql主從復(fù)制要求主從兩個(gè)數(shù)據(jù)庫(kù)版本相同艺玲,或者從機(jī)比主機(jī)版本高括蝠;要實(shí)現(xiàn)主主復(fù)制,則需要兩個(gè)數(shù)據(jù)庫(kù)版本相同饭聚。

使用mysqlbinlog命令查看logbin文件忌警,結(jié)果如下:

復(fù)制模式

1.? 異步模式(mysql async-mode

主節(jié)點(diǎn)不會(huì)主動(dòng)push bin

log到從節(jié)點(diǎn),這樣有可能導(dǎo)致failover的情況下秒梳,也許從節(jié)點(diǎn)沒(méi)有即時(shí)地將最新的bin

log同步到本地法绵。

2.? 半同步模式(mysql semi-sync)

????? 主節(jié)點(diǎn)只需要接收到其中一臺(tái)從節(jié)點(diǎn)的返回信息箕速,就會(huì)commit;否則需要等待直到超時(shí)時(shí)間然后切換成異步模式再提交朋譬;這樣做的目的可以使主從數(shù)據(jù)庫(kù)的數(shù)據(jù)延遲縮小盐茎,可以提高數(shù)據(jù)安全性,確保了事務(wù)提交后徙赢,binlog至少傳輸?shù)搅艘粋€(gè)從節(jié)點(diǎn)上字柠,不能保證從節(jié)點(diǎn)將此事務(wù)更新到db中。性能上會(huì)有一定的降低狡赐,響應(yīng)時(shí)間會(huì)變長(zhǎng)窑业。

3.? 全同步模式

主節(jié)點(diǎn)和從節(jié)點(diǎn)全部執(zhí)行了commit并確認(rèn)才會(huì)向客戶端返回成功。

4.? GTID復(fù)制模式

在傳統(tǒng)的復(fù)制里面枕屉,當(dāng)發(fā)生故障数冬,需要主從切換,需要找到binlog和pos點(diǎn)搀庶,然后將主節(jié)點(diǎn)指向新的主節(jié)點(diǎn),相對(duì)來(lái)說(shuō)比較麻煩铜异,也容易出錯(cuò)哥倔。在MySQL 5.6里面,不用再找binlog和pos點(diǎn)揍庄,我們只需要知道主節(jié)點(diǎn)的ip咆蒿,端口,以及賬號(hào)密碼就行蚂子,因?yàn)閺?fù)制是自動(dòng)的沃测,MySQL會(huì)通過(guò)內(nèi)部機(jī)制GTID自動(dòng)找點(diǎn)同步。

多線程復(fù)制(基于庫(kù))食茎,在MySQL 5.6以前的版本蒂破,slave的復(fù)制是單線程的。一個(gè)事件一個(gè)事件的讀取應(yīng)用别渔。而master是并發(fā)寫(xiě)入的附迷,所以延時(shí)是避免不了的。唯一有效的方法是把多個(gè)庫(kù)放在多臺(tái)slave哎媚,這樣又有點(diǎn)浪費(fèi)服務(wù)器喇伯。在MySQL 5.6里面,我們可以把多個(gè)表放在多個(gè)庫(kù)拨与,這樣就可以使用多線程復(fù)制稻据。

基于GTID復(fù)制實(shí)現(xiàn)的工作原理

主節(jié)點(diǎn)更新數(shù)據(jù)時(shí),會(huì)在事務(wù)前產(chǎn)生GTID买喧,一起記錄到binlog日志中捻悯。

從節(jié)點(diǎn)的I/O線程將變更的bin log匆赃,寫(xiě)入到本地的relay log中。

SQL線程從relay log中獲取GTID秋度,然后對(duì)比本地binlog是否有記錄(所以MySQL從節(jié)點(diǎn)必須要開(kāi)啟binary log)炸庞。

如果有記錄,說(shuō)明該GTID的事務(wù)已經(jīng)執(zhí)行荚斯,從節(jié)點(diǎn)會(huì)忽略埠居。

如果沒(méi)有記錄,從節(jié)點(diǎn)就會(huì)從relay log中執(zhí)行該GTID的事務(wù)事期,并記錄到bin log滥壕。

在解析過(guò)程中會(huì)判斷是否有主鍵,如果沒(méi)有就用二級(jí)索引兽泣,如果有就用全部掃描绎橘。

復(fù)制方式

1、基于語(yǔ)句的復(fù)制在Master上執(zhí)行的SQL語(yǔ)句唠倦,在Slave上執(zhí)行同樣的語(yǔ)句称鳞。MySQL默認(rèn)采用基于語(yǔ)句的復(fù)制,效率比較高稠鼻。一旦發(fā)現(xiàn)沒(méi)法精確復(fù)制時(shí)冈止,會(huì)自動(dòng)選著基于行的復(fù)制

2、基于行的復(fù)制把改變的內(nèi)容復(fù)制到Slave候齿,而不是把命令在Slave上執(zhí)行一遍熙暴。從MySQL5.0開(kāi)始支持

3、混合類(lèi)型的復(fù)制默認(rèn)采用基于語(yǔ)句的復(fù)制慌盯,一旦發(fā)現(xiàn)基于語(yǔ)句的無(wú)法精確的復(fù)制時(shí)周霉,就會(huì)采用基于行的復(fù)制

相應(yīng)地,binlog的格式也有三種:STATEMENT亚皂,ROW俱箱,MIXED。



mysql主主復(fù)制配置

???????? 本方案使用基于GTID的復(fù)制模式孕讳,配置過(guò)程如下:

1. 兩臺(tái)數(shù)據(jù)庫(kù)服務(wù)器匠楚,IP分別為 192.168.216.128 和 192.168.216.129,在服務(wù)器上裝MYSQL(我的配置版本為5.5.56)

2. 打開(kāi) 192.168.216.128 服務(wù)器上的MYSQL的配置文件 /etc/my.cnf (路徑根據(jù)自己服務(wù)器的情況來(lái)看)厂财,將其中的 server-id 設(shè)為1(默認(rèn)為1芋簿,總之兩臺(tái)服務(wù)器要設(shè)置為不同的ID),然后重啟MYSQL服務(wù)

3. 打開(kāi)?192.168.216.129 服務(wù)器上的MYSQL的配置文件 /etc/my.cnf (路徑根據(jù)自己服務(wù)器的情況來(lái)看),將其中的 server-id 設(shè)為2(默認(rèn)為1)璃饱,然后重啟MYSQL服務(wù)

4. 設(shè)?192.168.216.128 為主服務(wù)器与斤,那么在主服務(wù)器上加一個(gè)從服務(wù)器可以登錄的用戶,語(yǔ)句如下:

GRANT REPLICATION SLAVE ON *.* TO 'root'@'192.168.216.129'IDENTIFIED BY 'raisecom@123';

FLUSH PRIVILEGES;

建好后,在192.168.216.129 服務(wù)器上執(zhí)行以下語(yǔ)句

mysql -h 192.168.216.128 -uroot

-praisecom@123

然后試一下可不可以連上撩穿,如果可以磷支,則正確,如果連不上食寡,看一下什么原因雾狈,是否是防火墻的原因,如果是則去配置防火墻的規(guī)則抵皱。

5. 以上完成后在主服務(wù)器上執(zhí)行以下語(yǔ)句善榛,查詢master的狀態(tài)

show masterstatus;

可以看到以上結(jié)果,這兒我們使用master_auto_position配置呻畸,因此不需要關(guān)注File 和 Position移盆,其它的兩個(gè)分別是白名單和黑名單,意思為同步哪幾個(gè)數(shù)據(jù)庫(kù)和不同步哪幾個(gè)數(shù)據(jù)庫(kù)伤为,可自行根據(jù)需求進(jìn)行設(shè)置咒循。在從庫(kù)上執(zhí)行以下語(yǔ)句:

CHANGE MASTER TO

MASTER_HOST='192.168.216.128',

MASTER_USER='root',

MASTER_PASSWORD='raisecom@123',

MASTER_AUTO_POSITION=1;

6. 執(zhí)行完畢后,在從庫(kù)上繼續(xù)執(zhí)行如下語(yǔ)句:

slave start;

show slavestatus\G

這樣绞愚,查看從服務(wù)器的狀態(tài)叙甸,如果狀態(tài)中的用紅線標(biāo)出來(lái)兩個(gè)參數(shù)的值都為YES,那證明配置已經(jīng)成功位衩,否則可以檢查一下具體問(wèn)題出現(xiàn)在什么地方蚁署。

這樣,就算配置完成了蚂四。在主庫(kù)中新建數(shù)據(jù)庫(kù),新建一張表哪痰,插幾條數(shù)據(jù)遂赠,到從庫(kù)上查詢一下看是否已經(jīng)同步過(guò)來(lái)。

如果失敗晌杰,可以從以下幾個(gè)方面去排查問(wèn)題:  

1.首先試一下主從服務(wù)器相互之間是否PING 得通

2.試一下遠(yuǎn)程連接是否正確跷睦,如果連不上,則有可能是網(wǎng)卡不一致肋演、防火墻沒(méi)有放行3306 端口

3.server-id 是否配成一致抑诸,主從不能一致

4.bin-log 的信息是否正確

二、如何配置MYSQL的主主復(fù)制爹殊?

上面說(shuō)了主從復(fù)制的配置方法蜕乡,現(xiàn)在接著上面的配置繼續(xù),然后實(shí)現(xiàn)雙主復(fù)制梗夸,讓以上的兩個(gè)服務(wù)器互為主從层玲。

1. 在主服務(wù)器上配置 /etc/my.cnf 文件,配置如下:

binlog_format=mixed

auto_increment_increment=2???????? #步進(jìn)值auto_imcrement。一般有n臺(tái)主MySQL就填n

auto_increment_offset=1??????????? #起始值辛块。一般填第n臺(tái)主MySQL畔派。此時(shí)為第一臺(tái)主MySQL

binlog-ignore=mysql??????????????? #忽略mysql庫(kù)【我一般都不寫(xiě)】

binlog-ignore=information_schema?? #忽略information_schema庫(kù)【我一般都不寫(xiě)】

gtid-mode = on

配置之后重啟MYSQL服務(wù)

2.在從服務(wù)器上配置 /etc/my.cnf 文件,配置如下

binlog_format=mixed

auto_increment_increment=2?? #步進(jìn)值auto_imcrement润绵。一般有n臺(tái)主MySQL就填n

auto_increment_offset=2?? #起始值线椰。一般填第n臺(tái)主MySQL。此時(shí)為第二臺(tái)主MySQL

binlog-ignore=mysql?? #忽略mysql庫(kù)【我一般都不寫(xiě)】

binlog-ignore=information_schema?? #忽略information_schema庫(kù)【我一般都不寫(xiě)】

gtid-mode = on

配置之后重啟MYSQL服務(wù)

3. 在從服務(wù)器上添加一個(gè)主服務(wù)器可以訪問(wèn)的用戶尘盼,命令如下:

GRANT REPLICATION

SLAVE ON *.* TO 'root'@'192.168.216.128'IDENTIFIED BY 'raisecom@123';

FLUSH PRIVILEGES

建好后憨愉,在192.168.216.128 服務(wù)器上執(zhí)行以下語(yǔ)句

mysql -h 192.168.216.129-uroot -praisecom@123

如果可以連上,則進(jìn)行下一步悔叽,連不上的話莱衩,參考上面進(jìn)行問(wèn)題排查。

4. 因?yàn)橐橹鲝慕颗欤袁F(xiàn)在從服務(wù)器也是master 笨蚁,所以也要查看一下?tīng)顟B(tài)

show masterstatus;

查到相應(yīng)的信息后,在原來(lái)的主服務(wù)器上執(zhí)行以下命令(因?yàn)楝F(xiàn)在它現(xiàn)在也是另一臺(tái)的從服務(wù)器)

CHANGE MASTER TO

MASTER_HOST='192.168.216.129',

MASTER_USER='root',

MASTER_PASSWORD='raisecom@123',

MASTER_AUTO_POSITION=1;

5. 執(zhí)行完畢后趟庄,在原主庫(kù)上繼續(xù)執(zhí)行如下語(yǔ)句:

start slave;

show slavestatus\G;

同上括细,如果出現(xiàn)如下畫(huà)面,則證明配置成功戚啥。

6. 在兩臺(tái)服務(wù)器的MYSQL中分別進(jìn)行一些建庫(kù)奋单、建表、插入猫十、更新等操作览濒,看一下另一臺(tái)會(huì)不會(huì)進(jìn)行同步,如果可以則證明主主配置成功拖云,否則還是上面的排錯(cuò)方法贷笛,進(jìn)行錯(cuò)誤排查。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宙项,一起剝皮案震驚了整個(gè)濱河市乏苦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌尤筐,老刑警劉巖汇荐,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異盆繁,居然都是意外死亡掀淘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)油昂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)繁疤,“玉大人咖为,你說(shuō)我怎么就攤上這事〕砝埃” “怎么了躁染?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)架忌。 經(jīng)常有香客問(wèn)我吞彤,道長(zhǎng),這世上最難降的妖魔是什么叹放? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任饰恕,我火速辦了婚禮,結(jié)果婚禮上井仰,老公的妹妹穿的比我還像新娘埋嵌。我一直安慰自己,他們只是感情好俱恶,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布雹嗦。 她就那樣靜靜地躺著,像睡著了一般合是。 火紅的嫁衣襯著肌膚如雪了罪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天聪全,我揣著相機(jī)與錄音泊藕,去河邊找鬼。 笑死难礼,一個(gè)胖子當(dāng)著我的面吹牛娃圆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蛾茉,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼踊餐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了臀稚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤三痰,失蹤者是張志新(化名)和其女友劉穎吧寺,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體散劫,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稚机,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了获搏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赖条。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纬乍,到底是詐尸還是另有隱情碱茁,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布仿贬,位于F島的核電站纽竣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏茧泪。R本人自食惡果不足惜蜓氨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望队伟。 院中可真熱鬧穴吹,春花似錦、人聲如沸嗜侮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)棘钞。三九已至缠借,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宜猜,已是汗流浹背泼返。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姨拥,地道東北人绅喉。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像叫乌,于是被迫代替她去往敵國(guó)和親柴罐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容