—— 解決方案 ——
|
Mysql主從復(fù)制1. mysql主從復(fù)制的基本原理: mysql支持單向、異步復(fù)制,復(fù)制過程中一個(gè)服務(wù)器充當(dāng)主服務(wù)器,而一個(gè)或多個(gè)其它服務(wù)器充當(dāng)從服務(wù)器。mysql復(fù)制基于主服務(wù)器在二進(jìn)制日志中跟蹤所有對(duì)數(shù)據(jù)庫(kù)的更改(更新、刪除等等)。因此,要進(jìn)行復(fù)制,必須在主服務(wù)器上啟用二進(jìn)制日志。每個(gè)從服務(wù)器從主服務(wù)器接收主服務(wù)器已經(jīng)記錄到其二進(jìn)制日志的保存的更新。當(dāng)一個(gè)從服務(wù)器連接主服務(wù)器時(shí),它通知主服務(wù)器從服務(wù)器在日志中讀取的最后一次成功更新的位置。從服務(wù)器接收從那時(shí)起發(fā)生的任何更新,并在本機(jī)上執(zhí)行相同的更新。然后封鎖并等待主服務(wù)器通知新的更新。從服務(wù)器執(zhí)行備份不會(huì)干擾主服務(wù)器,在備份過程中主服務(wù)器可以繼續(xù)處理更新。 2. mysql實(shí)現(xiàn)細(xì)節(jié) mysql使用3個(gè)線程來(lái)執(zhí)行復(fù)制功能(其中1個(gè)在主服務(wù)器上,另兩個(gè)在從服務(wù)器上)。當(dāng)發(fā)出start slave時(shí),從服務(wù)器創(chuàng)建一個(gè)I/O線程,以連接主服務(wù)器并讓它發(fā)送記錄在其二進(jìn)制日志中的語(yǔ)句。主服務(wù)器創(chuàng)建一個(gè)線程將二進(jìn)制日志中的內(nèi)容發(fā)送到從服務(wù)器。該線程可以即為主服務(wù)器上show processlist輸出中的Binlog Dump線程。從服務(wù)器I/O線程讀取主服務(wù)器Binlog Dump線程發(fā)送的內(nèi)容并將該數(shù)據(jù)拷貝到從服務(wù)器數(shù)據(jù)目錄中的本地文件中,即中繼日志。第3個(gè)線程是sql線程,由從服務(wù)器創(chuàng)建,用于讀取中繼日志并執(zhí)行日志中包含的更新。在從服務(wù)器上,讀取和執(zhí)行更新語(yǔ)句被分成兩個(gè)獨(dú)立的任務(wù)。當(dāng)從服務(wù)器啟動(dòng)時(shí),其I/O線程可以很快地從主服務(wù)器索取所有二進(jìn)制日志內(nèi)容。 1.復(fù)制線程狀態(tài) 通過showslave status\G和show master status可以查看復(fù)制線程狀態(tài)。常見的線程狀態(tài)有: (1)主服務(wù)器Binlog Dump線程 Has sent allbinlog to slave; waiting for binlog to be updated 線程已經(jīng)從二進(jìn)制日志讀取所有主要的更新并已經(jīng)發(fā)送到了從服務(wù)器。線程現(xiàn)在正空閑,等待由主服務(wù)器上新的更新導(dǎo)致的出現(xiàn)在二進(jìn)制日志中的新事件。 (2)從服務(wù)器I/O線程狀態(tài) Waiting formaster to send event 線程已經(jīng)連接上主服務(wù)器,正等待二進(jìn)制日志事件到達(dá)。如果主服務(wù)器正空閑,會(huì)持續(xù)較長(zhǎng)的時(shí)間。如果等待持續(xù)slave_read_timeout秒,則發(fā)生超時(shí)。此時(shí),線程認(rèn)為連接被中斷并企圖重新連接。 (3)從服務(wù)器SQL線程狀態(tài) Reading eventfrom the relay log 線程已經(jīng)從中繼日志讀取一個(gè)事件,可以對(duì)事件進(jìn)行處理了。 Has read allrelay log; waiting for the slave I/O thread to update it 線程已經(jīng)處理了中繼日志文件中的所有事件,現(xiàn)在正等待I/O線程將新事件寫入中繼日志。 2.復(fù)制過程中使用的傳遞和狀態(tài)文件 默認(rèn)情況,中繼日志使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是從服務(wù)器主機(jī)名,nnnnnn是序列號(hào)。中繼日志與二進(jìn)制日志的格式相同,并且可以用mysqlbinlog讀取。 從服務(wù)器在data目錄中另外創(chuàng)建兩個(gè)小文件。這些狀態(tài)文件默認(rèn)名為主master.info和relay-log.info。狀態(tài)文件保存在硬盤上,從服務(wù)器關(guān)閉時(shí)不會(huì)丟失。下次從服務(wù)器啟動(dòng)時(shí),讀取這些文件以確定它已經(jīng)從主服務(wù)器讀取了多少二進(jìn)制日志,以及處理自己的中繼日志的程度。 |