MySQL的Replication(英文為復(fù)制)是一個(gè)多MySQL數(shù)據(jù)庫(kù)做主從同步的方案,特點(diǎn)是異步復(fù)制,廣泛用在各種對(duì)MySQL有更高性能、更高可靠性要求的場(chǎng)合。與之對(duì)應(yīng)的是另一個(gè)同步技術(shù)是MySQL Cluster,但因?yàn)镸ySQL Cluster配置比較復(fù)雜,所以使用者較少。 MySQL的Replication是一個(gè)異步復(fù)制的過(guò)程(mysql5.1.7以上版本分為異步復(fù)制和半同步兩種模式),它是從一個(gè)Mysql instance(instance英文為實(shí)例)(我們稱之為Master)復(fù)制到另一個(gè)Mysql instance(我們稱之slave)。在master與slave之間實(shí)現(xiàn)整個(gè)復(fù)制過(guò)程主要由三個(gè)線程來(lái)完成,其中兩個(gè)線程(SQL線程和IO線程)在slave端,另外一個(gè)線程(IO線程)在master端。 要實(shí)現(xiàn)MySQL的Replication,首先必須打開master端的binlog (mysql-bin.xxxxxx)日志功能,否則無(wú)法實(shí)現(xiàn)mysql的主從復(fù)制。因?yàn)閙ysql的整個(gè)主從復(fù)制過(guò)程實(shí)際上就是:slave端從master端獲取binlog日志,然后再在自己身上完全順序的執(zhí)行該日志中所記錄的各種SQL操作。 有關(guān)具體如何開啟mysql的binlog日志功能,請(qǐng)大家自己在網(wǎng)上搜。 MySQL主從復(fù)制的基本交互過(guò)程,如下: 1、slave端的IO線程連接上master端,并請(qǐng)求從指定binlog日志文件的指定pos節(jié)點(diǎn)位置(或者從最開始的日志)開始復(fù)制之后的日志內(nèi)容。 2、master端在接收到來(lái)自slave端的IO線程請(qǐng)求后,通知負(fù)責(zé)復(fù)制進(jìn)程的IO線程,根據(jù)slave端IO線程的請(qǐng)求信息,讀取指定binlog日志指定pos節(jié)點(diǎn)位置之后的日志信息,然后返回給slave端的IO線程。該返回信息中除了binlog日志所包含的信息之外,還包括本次返回的信息在master端的binlog文件名以及在該binlog日志中的pos節(jié)點(diǎn)位置。 3、slave端的IO線程在接收到master端IO返回的信息后,將接收到的binlog日志內(nèi)容依次寫入到slave端的relaylog文件(mysql-relay-bin.xxxxxx)的最末端,并將讀取到的master端的binlog文件名和pos節(jié)點(diǎn)位置記錄到master-info(該文件存在slave端)文件中,以便在下一次讀取的時(shí)候能夠清楚的告訴master“我需要從哪個(gè)binlog文件的哪個(gè)pos節(jié)點(diǎn)位置開始,請(qǐng)把此節(jié)點(diǎn)以后的日志內(nèi)容發(fā)給我”。 4、slave端的SQL線程在檢測(cè)到relaylog文件中新增內(nèi)容后,會(huì)馬上解析該log文件中的內(nèi)容。然后還原成在master端真實(shí)執(zhí)行的那些SQL語(yǔ)句,并在自身按順豐依次執(zhí)行這些SQL語(yǔ)句。這樣,實(shí)際上就是在master端和slave端執(zhí)行了同樣的SQL語(yǔ)句,所以master端和slave端的數(shù)據(jù)是完全一樣的。 以上mysql主從復(fù)制交互過(guò)程比較拗口,理解起來(lái)也比較麻煩,我簡(jiǎn)化了該交互過(guò)程。如下: 1、master在執(zhí)行sql之后,記錄二進(jìn)制log文件(bin-log)。 2、slave連接master,并從master獲取binlog,存于本地relay-log中,然后從上次記住的位置起執(zhí)行SQL語(yǔ)句,一旦遇到錯(cuò)誤則停止同步。 從以上mysql的Replication原理可以看出: * 主從間的數(shù)據(jù)庫(kù)不是實(shí)時(shí)同步,就算網(wǎng)絡(luò)連接正常,也存在瞬間主從數(shù)據(jù)不一致的情況。 * 如果主從的網(wǎng)絡(luò)斷開,則從庫(kù)會(huì)在網(wǎng)絡(luò)恢復(fù)正常后,批量進(jìn)行同步。 * 如果對(duì)從庫(kù)進(jìn)行修改數(shù)據(jù),那么如果此時(shí)從庫(kù)正在在執(zhí)行主庫(kù)的bin-log時(shí),則會(huì)出現(xiàn)錯(cuò)誤而停止同步,這個(gè)是很危險(xiǎn)的操作。所以一般情況下,我們要非常小心的修改從庫(kù)上的數(shù)據(jù)。 * 一個(gè)衍生的配置是雙主、互為主從配置,只要雙方的修改不沖突,則可以工作良好。 * 如果需要多主庫(kù)的話,可以用環(huán)形配置,這樣任意一個(gè)節(jié)點(diǎn)的修改都可以同步到所有節(jié)點(diǎn) |
|