mysql雙機(jī)熱備

A钧舌、MySql雙機(jī)熱備概述

雙機(jī)熱備就是使用MySQL提供的一種主從備份機(jī)制實(shí)現(xiàn)尿褪。所謂雙機(jī)熱備其實(shí)是一個(gè)復(fù)制的過程徐伐,復(fù)制過程中一個(gè)服務(wù)器充當(dāng)主服務(wù)器,一個(gè)或多個(gè)服務(wù)器充當(dāng)從服務(wù)女嘲。這個(gè)復(fù)制的過程實(shí)質(zhì)上是從服務(wù)器復(fù)制主服務(wù)器上MySQL的二進(jìn)制日志(bin-log)畜份,并在從服務(wù)器上還原主服務(wù)器上的操作。

雙機(jī)熱備的實(shí)現(xiàn)需要MySQL的版本高于3.2欣尼。另外由于這種備份是基于MySQL二進(jìn)制日志實(shí)現(xiàn)爆雹,所以主從服務(wù)器上的MySQL版本最好能夠一樣,至少?gòu)姆?wù)器的MySQL版本不可以低于主服務(wù)器的數(shù)據(jù)庫(kù)版本愕鼓。因?yàn)镸ySQL不同的版本之間二進(jìn)制日志可能不一樣钙态。

配置參數(shù)說明

Server-id

ID值唯一的標(biāo)識(shí)了復(fù)制群集中的主從服務(wù)器,因此它們必須各不相同菇晃。Master_id必須為1到232-1之間的一個(gè)正整數(shù)值册倒,slave_id值必須為2到232-1之間的一個(gè)正整數(shù)值。

Log-bin

表示打開binlog磺送,打開該選項(xiàng)才可以通過I/O寫到Slave的relay-log驻子,也是可以進(jìn)行replication的前提。

Binlog-do-db

表示需要記錄二進(jìn)制日志的數(shù)據(jù)庫(kù)估灿。如果有多個(gè)數(shù)據(jù)可以用逗號(hào)分隔拴孤,或者使用多個(gè)binlog-do-dg選項(xiàng)。

Binglog-ingore-db

表示不需要記錄二進(jìn)制日志的數(shù)據(jù)庫(kù)甲捏,如果有多個(gè)數(shù)據(jù)庫(kù)可用逗號(hào)分隔演熟,或者使用多binglog-ignore-db選項(xiàng)。

Replicate-do-db

表示需要同步的數(shù)據(jù)庫(kù)司顿,如果有多個(gè)數(shù)據(jù)可用逗號(hào)分隔芒粹,或者使用多個(gè)replicate-do-db選項(xiàng)。

Replicate-ignore-db

表示不需要同步的數(shù)據(jù)庫(kù)大溜,如果有多個(gè)數(shù)據(jù)庫(kù)可用逗號(hào)分隔化漆,或者使用多個(gè)replicate-ignore-db選項(xiàng)。

Master-connect-retry

master-connect-retry=n表示從服務(wù)器與主服務(wù)器的連接沒有成功钦奋,則等待n秒(s)后再進(jìn)行管理方式(默認(rèn)設(shè)置是60s)座云。如果從服務(wù)器存在mater.info文件,它將忽略些選項(xiàng)付材。

Log-slave-updates

配置從庫(kù)上的更新操作是否寫入二進(jìn)制文件朦拖,如果這臺(tái)從庫(kù),還要做其他從庫(kù)的主庫(kù)厌衔,那么就需要打這個(gè)參數(shù)璧帝,以便從庫(kù)的從庫(kù)能夠進(jìn)行日志同步。

Slave-skip-errors

在復(fù)制過程富寿,由于各種原因?qū)е耣inglo中的sql出錯(cuò)睬隶,默認(rèn)情況下锣夹,從庫(kù)會(huì)停止復(fù)制,要用戶介入苏潜∫迹可以設(shè)置slave-skip-errors來定義錯(cuò)誤號(hào),如果復(fù)制過程中遇到的錯(cuò)誤是定義的錯(cuò)誤號(hào)恤左,便可以路過砖顷。如果從庫(kù)是用來做備份,設(shè)置這個(gè)參數(shù)會(huì)存在數(shù)據(jù)不一致赃梧,不要使用。如果是分擔(dān)主庫(kù)的查詢壓力豌熄,可以考慮授嘀。

Sync_binlog=1 Or N

Sync_binlog的默認(rèn)值是0,這種模式下锣险,MySQL不會(huì)同步到磁盤中去蹄皱。這樣的話,Mysql依賴操作系統(tǒng)來刷新二進(jìn)制日志binary log芯肤,就像操作系統(tǒng)刷新其他文件的機(jī)制一樣巷折。因此如果操作系統(tǒng)或機(jī)器(不僅僅是Mysql服務(wù)器)崩潰,有可能binlog中最后的語(yǔ)句丟失了崖咨。要想防止這種情況锻拘,可以使用sync_binlog全局變量,使binlog在每N次binlog寫入后與硬盤同步击蹲。當(dāng)sync_binlog變量設(shè)置為1是最安全的署拟,因?yàn)樵赾rash崩潰的情況下,你的二進(jìn)制日志binary log只有可能丟失最多一個(gè)語(yǔ)句或者一個(gè)事務(wù)歌豺。但是推穷,這也是最慢的一種方式(除非磁盤有使用帶蓄電池后備電源的緩存cache,使得同步到磁盤的操作非常快)类咧。

即使sync_binlog設(shè)置為1馒铃,出現(xiàn)崩潰時(shí),也有可能表內(nèi)容和binlog內(nèi)容之間存在不一致性痕惋。如果使用InnoDB表区宇,Mysql服務(wù)器處理COMMIT語(yǔ)句,它將整個(gè)事務(wù)寫入binlog并將事務(wù)提交到InnoDB中值戳。如果在兩次操作之間出現(xiàn)崩潰萧锉,重啟時(shí),事務(wù)被InnoDB回滾述寡,但仍然存在binlog中柿隙∫抖矗可以用-innodb-safe-binlog選項(xiàng)來增加InnoDB表內(nèi)容和binlog之間的一致性。(注釋:在Mysql 5.1版本中不需要-innodb-safe-binlog禀崖;由于引入了XA事務(wù)支持衩辟,該選項(xiàng)作廢了),該選項(xiàng)可以提供更大程度的安全波附,使每個(gè)事務(wù)的binlog(sync_binlog=1)和(默認(rèn)情況為真)InnoDB日志與硬盤同步艺晴,該選項(xiàng)的效果是崩潰后重啟時(shí),在滾回事務(wù)后掸屡,Mysql服務(wù)器從binlog剪切回滾的InnoDB事務(wù)封寞。這樣可以確保binlog反饋InnoDB表的確切數(shù)據(jù)等,并使從服務(wù)器保持與主服務(wù)器保持同步(不接收回滾的語(yǔ)句)仅财。

Auto_increment_offset和Auto_increment_increment

Auto_increment_increment和auto_increment_offset用于主-主服務(wù)器(master-to-master)復(fù)制狈究,并可以用來控制AUTO_INCREMENT列的操作。兩個(gè)變量均可以設(shè)置為全局或局部變量盏求,并且假定每個(gè)值都可以為1到65,535之間的整數(shù)值抖锥。將其中一個(gè)變量設(shè)置為0會(huì)使該變量為1。

這兩個(gè)變量影響AUTO_INCREMENT列的方式:auto_increment_increment控制列中的值的增量值碎罚,auto_increment_offset確定AUTO_INCREMENT列值的起點(diǎn)磅废。

如果auto_increment_offset的值大于auto_increment_increment的值,則auto_increment_offset的值被忽略荆烈。例如:表內(nèi)已有一些數(shù)據(jù)拯勉,就會(huì)用現(xiàn)在已有的最大自增值做為初始值。


image.png
B憔购、 MySQL雙機(jī)熱備份配置步驟

假設(shè)主服務(wù)器A(master)谜喊、從服務(wù)器為B(slave)。兩服務(wù)器Ip為:A——10.0.21.223倦始,B——10.0.21.221斗遏。本文服務(wù)器A采用windows操作系統(tǒng),服務(wù)器B采用centos7.9鞋邑,目的是為了一次說明windows和Linux不同環(huán)境中的配置诵次。

步驟一:主服務(wù)器授權(quán)

在主服務(wù)器A上創(chuàng)建一個(gè)username和password供從服務(wù)器B訪問時(shí)使用。在MySQL命令行下輸入

mysql>GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO backup@10.0.21.221 IDENTIFIED BY'123456';

步驟二:數(shù)據(jù)復(fù)制

將A上已有的數(shù)據(jù)備份到B上枚碗,以便主從數(shù)據(jù)庫(kù)建立的時(shí)候兩個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)保持一致(這里復(fù)制的方法有很多逾一,但必須保證兩個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)完全相同)。

步驟三:配置主服務(wù)器

主服務(wù)器A是windows操作系統(tǒng)肮雨,其mysql配置文件在mysql安裝目錄下的my.ini文件遵堵。我們對(duì)主服務(wù)器的配置都在my.ini中。

停止A服務(wù)器上的mysql服務(wù),打開my.ini配置文件陌宿。在my.ini中找到[mysqld]锡足,并在[mysqld]區(qū)域內(nèi)做如下修改:

[mysqld]

server-id=1#是1~2^23-1內(nèi)的唯一值且不能與B或其它slave服務(wù)中的配置相同

log-bin = bin_log#日志文件以bin_log為前綴,如果不給log-bin賦值,日志文件將以#master-server-hostname為前綴

binlog-ignore-db= test#日志文件跳過的數(shù)據(jù)庫(kù)(可選屬性 ),如果有多個(gè)數(shù)據(jù)庫(kù),可以重復(fù)配置這個(gè)屬性

binlog-do-db= db_test #日志文件操作的數(shù)據(jù)庫(kù)(可選屬性 壳坪,默認(rèn)所有數(shù)據(jù)庫(kù)的相關(guān)操作都寫入二進(jìn)制日志文件) ,如果有多個(gè)數(shù)據(jù)庫(kù)舶得,可以重復(fù)配置這個(gè)屬性

expire_logs_days=30 #設(shè)置bin-log日志保存的天數(shù)

步驟四:重啟A中的MySQL服務(wù)

配置完上面選項(xiàng)后,重啟A上的MySQL服務(wù)爽蝴,這時(shí)候A上所有對(duì)qxpt_demo數(shù)據(jù)庫(kù)的更新操作都會(huì)被記錄到二進(jìn)制日志中沐批。

步驟五:配置slave

本文中slave所在的B服務(wù)器是linux環(huán)境,其MySQL配置文件在/etc/my.cnf中蝎亚。

在slave的my.cnf中 [mysqld]九孩,并在其中做如下配置:

[mysqld]

server-id=2#唯一并與主服務(wù)器上的server-id不同。

replicate-do-db= db_test#復(fù)制操作要針對(duì)的數(shù)據(jù)庫(kù)(可選发框,默認(rèn)為全部)躺彬,同樣如果有多個(gè)數(shù)據(jù)庫(kù)則可配置多次本屬性。

expire_logs_days=30 #設(shè)置bin-log日志保存的天數(shù)

步驟六:重啟并對(duì)slave進(jìn)行設(shè)置

重啟B服務(wù)器上的MySQL服務(wù)缤底,用mysql -uroot -p 登錄MySQL,并執(zhí)行如下命令:

mysql> change master to \

-> master_host='10.0.21.221',//主服務(wù)器的IP地址

-> master_user='backup',//同步數(shù)據(jù)庫(kù)的用戶

-> master_password=’123456’;//同步數(shù)據(jù)庫(kù)的密碼

注:MySQL 5.1.7之前上面命令中的參數(shù)都可以在my.cnf配置文件的[mysqld]區(qū)域中配置番捂。

  • 參數(shù)說明

mysql>show slave status个唧;
mysql>change master to master_host='10.0.21.221',
master_user='backup',
master_password='123456',
master_port=3306,
master_log_file='test-mysql-bin.000001',
master_log_pos=1612,
master_connect_retry=30;

   
    master_host='11.11.11.61':主節(jié)點(diǎn)的IP地址
    master_user='admin':剛才在Master建立的用于同步數(shù)據(jù)庫(kù)的用戶
    master_password='xiaoliu':主節(jié)點(diǎn)同步用戶的密碼
    master_port=3306:Master節(jié)點(diǎn)數(shù)據(jù)庫(kù)的端口
    master_log_file='lyz-mysql-bin.000001':指定Slave從哪個(gè)日志文件開始讀取復(fù)制文件(可在Master上使用show master status查看到日志文件名)
    master_log_pos=1312:從哪個(gè)POSITION號(hào)開始讀(可在Master上使用show master status查看)
    master_connect_retry=30:當(dāng)重新建立主從連接時(shí),如果連接建立失敗设预,間隔多久后重試,單位為秒徙歼,默認(rèn)設(shè)置為60秒,同步延遲調(diào)優(yōu)參數(shù)鳖枕。

步驟七:重啟并對(duì)slave進(jìn)行設(shè)置

MySQL中執(zhí)行show slave status魄梯;命令查看slave狀態(tài):

image.png

這時(shí)候slave還未啟動(dòng),我們只要在MySQL中執(zhí)行start slave; 即可啟動(dòng)slave宾符。這時(shí)候slave_io_running和slave_sql_runing的值都應(yīng)該變?yōu)閥es酿秸。

經(jīng)過以上六個(gè)步驟我們就可以實(shí)現(xiàn)從A到B的單向熱備份。這時(shí)候我們對(duì)A中db_test數(shù)據(jù)庫(kù)進(jìn)行修改等影響數(shù)據(jù)庫(kù)數(shù)據(jù)及結(jié)構(gòu)的操作會(huì)被復(fù)制到B中魏烫。

C辣苏、 MySQL雙機(jī)熱備份原理

MySQL的雙機(jī)熱備份是一個(gè)異步的復(fù)制(replication),slave的備份數(shù)據(jù)實(shí)際上就是從master端獲取其binlog日志后哄褒,在自己身上完全順序的執(zhí)行日志中記錄的各種操作稀蟋。實(shí)現(xiàn)整個(gè)復(fù)制操作主要由三個(gè)步驟:

(1) master將改變記錄到二進(jìn)制日志(bin-log)中;

(2)slave將master的bin-log拷貝到它的中繼日志(relay log)呐赡;

(3) slave重做中繼日志中的事件退客,將改變反映它自己的數(shù)據(jù)。

在網(wǎng)上找了一個(gè)個(gè)人感覺比較好的圖,如下:

image

結(jié)合本圖可以看出雙機(jī)熱備的具體步驟如下:

(1)在每個(gè)事務(wù)更新數(shù)據(jù)完成之前萌狂,master在二日志記錄這些改變档玻。MySQL將事務(wù)串行的寫入二進(jìn)制日志,在事件寫入二進(jìn)制日志完成后粥脚,提交事物窃肠。

(2)slave開始一個(gè)工作線程——I/O線程。slave的io進(jìn)程鏈接到master后刷允,向master請(qǐng)求指定位置的日志內(nèi)容冤留。

(3) master接受到slave的請(qǐng)求后,通過master的io讀取指定日志內(nèi)容及bin-log文件的相關(guān)信息(slave status中Master_Log_File和Read_Master_Log_Pos屬性)树灶,并返回給slave的io進(jìn)程纤怒。

(4)slave接收到信息后,將接受到的日志內(nèi)容依次添加到slave端的relay-log(在MySQLdata目錄中)的最末端天通,并讀取master傳過來的bin-log文件信息泊窘,將bin-log的文件信息存到master.info文件中,以便下一次請(qǐng)求能夠清楚的告訴master需要讀取bin-log的哪個(gè)位置開始往后的日志內(nèi)容像寒。

(5)slave的sql進(jìn)程檢測(cè)到relay-log中新增內(nèi)容后烘豹,會(huì)立刻解析relay-log的內(nèi)容,將其解析成在master端真實(shí)執(zhí)行的那些可執(zhí)行內(nèi)容诺祸,并在slave自身執(zhí)行携悯。

PS 操作從庫(kù)修改一條記錄報(bào)錯(cuò)

先操作從庫(kù)修改一條記錄,又去主庫(kù)修改筷笨,會(huì)造成同步出錯(cuò)

去從庫(kù)執(zhí)行

mysql>stop slave;
mysql>set global sql_slave_skip_counter=1;
mysql>start slave;

或者在主庫(kù)執(zhí)行憔鬼,記住這里的File_size,后面從庫(kù)的pos會(huì)用到

mysql>show master logs;

image.png

然后去從庫(kù)執(zhí)行

mysql>show slave status胃夏;
mysql>stop slave;
mysql>change master to master_log_pos=154, master_log_file='bin_log.000009';
mysql>start slave
mysql>show slave status轴或;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市仰禀,隨后出現(xiàn)的幾起案子照雁,更是在濱河造成了極大的恐慌,老刑警劉巖答恶,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件囊榜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡亥宿,警方通過查閱死者的電腦和手機(jī)卸勺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烫扼,“玉大人曙求,你說我怎么就攤上這事。” “怎么了悟狱?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵静浴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我挤渐,道長(zhǎng)苹享,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任浴麻,我火速辦了婚禮得问,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘软免。我一直安慰自己宫纬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布膏萧。 她就那樣靜靜地躺著漓骚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪榛泛。 梳的紋絲不亂的頭發(fā)上蝌蹂,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音曹锨,去河邊找鬼孤个。 笑死,一個(gè)胖子當(dāng)著我的面吹牛艘希,可吹牛的內(nèi)容都是我干的硼身。 我是一名探鬼主播硅急,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼覆享,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了营袜?” 一聲冷哼從身側(cè)響起撒顿,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荚板,沒想到半個(gè)月后凤壁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跪另,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年拧抖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片免绿。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唧席,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情淌哟,我是刑警寧澤迹卢,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站徒仓,受9級(jí)特大地震影響腐碱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掉弛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一症见、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狰晚,春花似錦筒饰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至秒咐,卻和暖如春谬晕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背携取。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工攒钳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雷滋。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓不撑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親晤斩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子焕檬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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