解讀mysql主從配置及其原理分析(Master-Slave)

在windows下配置的,后面會(huì)在Linux下配置進(jìn)行測(cè)試,需要配置mysql數(shù)據(jù)庫(kù)同步的朋友可以參考下。

1.在主數(shù)據(jù)庫(kù)服務(wù)器為從服務(wù)器添加一個(gè)擁有權(quán)限訪問(wèn)主庫(kù)的用戶:
GRANT REPLICATION SLAVE ON *.* TO ‘ test’@’%’ IDENTIFIED BY ‘test’;
(%表示允許所有IP,可設(shè)置指定從服務(wù)器IP)
添加用戶后:
可在從服務(wù)器上用mysql -h127.0.0.1 -utest -ptest; 來(lái)測(cè)試是否有權(quán)限訪問(wèn)主數(shù)據(jù)庫(kù)

server-id = 2
master-host = 10.0.0.199
master-user = test
master-password = test
replicate-do-db = test
master-port = 3306
log-bin = mysql-bin

在主服務(wù)器上輸入show master status

那么,恭喜,主從數(shù)據(jù)庫(kù)配置OK,可以在主數(shù)據(jù)庫(kù)插入數(shù)據(jù)進(jìn)行測(cè)試,是否從庫(kù)同步木有…
注:請(qǐng)檢查防火墻!!!
其實(shí)配置過(guò)程是很容易簡(jiǎn)單的,不要太過(guò)激動(dòng),我們?cè)倩c(diǎn)時(shí)間了解其主從的原理。
下面的內(nèi)容對(duì)你理解應(yīng)該有點(diǎn)作用。

一 MySQL 復(fù)制的基本過(guò)程如下(各部分學(xué)習(xí)自Google,謝謝)
1. Slave 上面的IO線程連接上 Master,并請(qǐng)求從指定日志文件的指定位置(或者從最開(kāi)始的日志)之后的日志內(nèi)容;

2. Master 接收到來(lái)自 Slave 的 IO 線程的請(qǐng)求后,通過(guò)負(fù)責(zé)復(fù)制的 IO線程根據(jù)請(qǐng)求信息讀取指定日志指定位置之后的日志信息,返回給 Slave 端的 IO線程。返回信息中除了日志所包含的信息之外,還包括本次返回的信息在 Master 端的 Binary Log 文件的名稱以及在 BinaryLog 中的位置;
3. Slave 的 IO 線程接收到信息后,將接收到的日志內(nèi)容依次寫(xiě)入到 Slave 端的RelayLog文件(mysql-relay-lin.xxxxxx)的最末端,并將讀取到的Master端的bin-log的文件名和位置記錄到 master-info文件中,以便在下一次讀取的時(shí)候能夠清楚的高速M(fèi)aster“我需要從某個(gè)bin-log的哪個(gè)位置開(kāi)始往后的日志內(nèi)容,請(qǐng)發(fā)給 我”

4. Slave 的 SQL 線程檢測(cè)到 Relay Log 中新增加了內(nèi)容后,會(huì)馬上解析該 Log 文件中的內(nèi)容成為在 Master
端真實(shí)執(zhí)行時(shí)候的那些可執(zhí)行的 Query 語(yǔ)句,并在自身執(zhí)行這些 Query。這樣,實(shí)際上就是在 Master 端和 Slave
端執(zhí)行了同樣的 Query,所以兩端的數(shù)據(jù)是完全一樣的。

二、設(shè)置mysql主從配置的優(yōu)點(diǎn):
1、解決web應(yīng)用系統(tǒng),數(shù)據(jù)庫(kù)出現(xiàn)的性能瓶頸,采用數(shù)據(jù)庫(kù)集群的方式來(lái)實(shí)現(xiàn)查詢負(fù)載;一個(gè)系統(tǒng)中數(shù)據(jù)庫(kù)的查詢操作比更新操作要多得多,通過(guò)多臺(tái)查詢服務(wù)器將 數(shù)據(jù)庫(kù)的查詢分擔(dān)到不同的查詢服務(wù)器上從而提高查詢效率。
2、Mysql數(shù)據(jù)庫(kù)支持?jǐn)?shù)據(jù)庫(kù)的主從復(fù)制功能,使用主數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)的插入、刪除與更新操作,而從數(shù)據(jù)庫(kù)則專門(mén)用來(lái)進(jìn)行數(shù)據(jù)查詢操作,這樣可以將更新操作和 查詢操作分擔(dān)到不同的數(shù)據(jù)庫(kù)上,從而提高了查詢效率。


二 主從原理如下:
1.
主服務(wù)器將更新寫(xiě)入二進(jìn)制日志文件,并維護(hù)文件的一個(gè)索引以跟蹤日志循環(huán)。這些日志可以記錄發(fā)送到從服務(wù)器的更新。當(dāng)一個(gè)從服務(wù)器連接主服務(wù)器時(shí),它通知 主服務(wù)器從服務(wù)器在日志中讀取的最后一次成功更新的位置。從服務(wù)器接收從那時(shí)起發(fā)生的任何更新,然后封鎖并等待主服務(wù)器通知新的更新。

MySQL復(fù)制基于主服務(wù)器在二進(jìn)制日志中跟蹤所有對(duì)數(shù)據(jù)庫(kù)的更改(更新、刪除等等)。因此,要進(jìn)行復(fù)制,必須在主服務(wù)器上啟用二進(jìn)制日志。

每個(gè)從服務(wù)器從主服務(wù)器接收主服務(wù)器已經(jīng)記錄到其二進(jìn)制日志的保存的更新,以便從服務(wù)器可以對(duì)其數(shù)據(jù)拷貝執(zhí)行相同的更新。

從服務(wù)器設(shè)置為復(fù)制主服務(wù)器的數(shù)據(jù)后,它連接主服務(wù)器并等待更新過(guò)程。如果主服務(wù)器失敗,或者從服務(wù)器失去與主服務(wù)器之間的連接,從服務(wù)器保持定期嘗試連 接,直到它能夠繼續(xù)幀聽(tīng)更新。由–master-connect-retry選項(xiàng)控制重試間隔。 默認(rèn)為60秒。

每個(gè)從服務(wù)器跟蹤復(fù)制時(shí)間。主服務(wù)器不知道有多少個(gè)從服務(wù)器或在某一時(shí)刻有哪些被更新了。

2.主從同步過(guò)程的相關(guān)文件

默認(rèn)情況,中繼日志使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是從服務(wù)器主機(jī)名,nnnnnn是序 列號(hào)。用連續(xù)序列號(hào)來(lái)創(chuàng)建連續(xù)中繼日志文件,從000001開(kāi)始。從服務(wù)器跟蹤索引文件中目前正使用的中繼日志。 默認(rèn)中繼日志索引文件名為host_name-relay-bin.index。默認(rèn)情況,在從服務(wù)器的數(shù)據(jù)目錄中創(chuàng)建這些文件??梢杂?#8211;relay- log和–relay-log-index服務(wù)器選項(xiàng)覆蓋 默認(rèn)文件名

中繼日志與二進(jìn)制日志的格式相同,并且可以用mysqlbinlog讀取。SQL線程執(zhí)行完中繼日志中的所有事件并且不再需要之后,立即自動(dòng)刪除它。沒(méi)有 直接的刪除中繼日志的機(jī)制,因?yàn)镾QL線程可以負(fù)責(zé)完成。然而,F(xiàn)LUSH LOGS可以循環(huán)中繼日志,當(dāng)SQL線程刪除日志時(shí)會(huì)有影響。

從屬?gòu)?fù)制服務(wù)器在數(shù)據(jù)目錄中另外創(chuàng)建兩個(gè)小文件。這些狀態(tài)文件默認(rèn)名為主master.info和relay-log.info。它們包含SHOW SLAVE STATUS語(yǔ)句的輸出所顯示的信息(關(guān)于該語(yǔ)句的描述參見(jiàn)13.6.2節(jié),“用于控制從服務(wù)器的SQL語(yǔ)句”)。狀態(tài)文件保存在硬盤(pán)上,從服務(wù)器關(guān)閉時(shí) 不會(huì)丟失。下次從服務(wù)器啟動(dòng)時(shí),讀取這些文件以確定它已經(jīng)從主服務(wù)器讀取了多少二進(jìn)制日志,以及處理自己的中繼日志的程度。

由I/O線程更新master.info文件。文件中的行和SHOW SLAVE STATUS顯示的列的對(duì)應(yīng)關(guān)系為:
代碼如下:
行 描述
1 文件中的行號(hào)
2 Master_Log_File
3 Read_Master_Log_Pos
4 Master_Host
5 Master_User
6 密碼(不由SHOW SLAVE STATUS顯示)
7 Master_Port
8 Connect_Retry
9 Master_SSL_Allowed
10 Master_SSL_CA_File
11 Master_SSL_CA_Path
12 Master_SSL_Cert
13 Master_SSL_Cipher
14 Master_SSL_Key

由SQL線程更新relay-log.info文件。文件中的行和SHOW SLAVE STATUS顯示的列的對(duì)應(yīng)關(guān)系為:
代碼如下:
行 描述
1 Relay_Log_File
2 Relay_Log_Pos
3 Relay_Master_Log_File
4 Exec_Master_Log_Pos

四:主從同步過(guò)程的相關(guān)文件和MySQL語(yǔ)句的關(guān)系
由I/O線程更新master.info文件。文件中的行和SHOW SLAVE STATUS顯示的列的對(duì)應(yīng)關(guān)系為:
代碼如下:
行 描述
1 文件中的行號(hào)
2 Master_Log_File
3 Read_Master_Log_Pos
4 Master_Host
5 Master_User
6 密碼(不由SHOW SLAVE STATUS顯示)
7 Master_Port
8 Connect_Retry
9 Master_SSL_Allowed
10 Master_SSL_CA_File
11 Master_SSL_CA_Path
12 Master_SSL_Cert
13 Master_SSL_Cipher
14 Master_SSL_Key

由SQL線程更新relay-log.info文件。文件中的行和SHOW SLAVE STATUS顯示的列的對(duì)應(yīng)關(guān)系為:
代碼如下:
行 描述
1 Relay_Log_File
2 Relay_Log_Pos
3 Relay_Master_Log_File
4 Exec_Master_Log_Pos

當(dāng)備份從服務(wù)器的數(shù)據(jù)時(shí),你還應(yīng)備份這兩個(gè)小文件以及中繼日志文件。它們用來(lái)在恢復(fù)從服務(wù)器的數(shù)據(jù)后繼續(xù)進(jìn)行復(fù)制。如果丟失了中繼日志但仍然有 relay-log.info文件,你可以通過(guò)檢查該文件來(lái)確定SQL線程已經(jīng)執(zhí)行的主服務(wù)器中二進(jìn)制日志的程度。然后可以用 Master_Log_File和Master_LOG_POS選項(xiàng)執(zhí)行CHANGE MASTER TO來(lái)告訴從服務(wù)器重新從該點(diǎn)讀取二進(jìn)制日志。當(dāng)然,要求二進(jìn)制日志仍然在主服務(wù)器上。
如果從服務(wù)器正復(fù)制LOAD DATA INFILE語(yǔ)句,你應(yīng)也備份該目錄內(nèi)從服務(wù)器用于該目的的任何SQL_LOAD-*文件。從服務(wù)器需要這些文件繼續(xù)復(fù)制任何中斷的LOAD DATA INFILE操作。用–slave-load-tmpdir選項(xiàng)來(lái)指定目錄的位置。如果未指定, 默認(rèn)值為tmpdir變量的值。
五:主從同步起點(diǎn)的說(shuō)明
master.info的內(nèi)容會(huì)覆蓋命令行或in my.cnf中指定的部分選項(xiàng)。
如果從服務(wù)器啟動(dòng)時(shí)master.info文件不存在,選項(xiàng)采用選項(xiàng)文件或命令行中指定的值。首次將服務(wù)器作為從服務(wù)器啟動(dòng)時(shí),或者已經(jīng)運(yùn)行RESET SLAVE然后已經(jīng)關(guān)閉并重啟從服務(wù)器時(shí)會(huì)發(fā)生。
如果從服務(wù)器啟動(dòng)時(shí)master.info文件存在,服務(wù)器忽略那些選項(xiàng)。使用master.info文件中發(fā)現(xiàn)的值。
如果你使用與master.info文件中相對(duì)應(yīng)的啟動(dòng)選項(xiàng)的不同的值重啟從服務(wù)器,啟動(dòng)選項(xiàng)的不同的值不會(huì)生效,因?yàn)榉?wù)器繼續(xù)使用 master.info文件。要想使用啟動(dòng)選項(xiàng)的不同的值,必須刪除master.info文件并重啟從服務(wù)器,或(最好是)在從服務(wù)器運(yùn)行時(shí)使用 CHANGE MASTER TO語(yǔ)句重新設(shè)置值。
六:如何確保所有從服務(wù)器已經(jīng)處理了中繼日志中的所有語(yǔ)句
在每個(gè)從服務(wù)器上,發(fā)出STOP SLAVE IO_THREAD語(yǔ)句,然后檢查SHOW PROCESSLIST語(yǔ)句的輸出,直到你看到Has read all relay log。當(dāng)所有從服務(wù)器都執(zhí)行完這些,它們可以被重新配置為一個(gè)新的設(shè)置。在被提升為主服務(wù)器的從服務(wù)器S1上,發(fā)出STOP SLAVE和RESET MASTER語(yǔ)句。
七:如果你確定可以跳過(guò)來(lái)自主服務(wù)器的下一個(gè)語(yǔ)句,可以執(zhí)行下面的語(yǔ)句
代碼如下:
mysql> SET GLOBAL SQL_slave_SKIP_COUNTER = n;
mysql> START SLAVE;

如果來(lái)自主服務(wù)器的下一個(gè)語(yǔ)句不使用AUTO_INCREMENT或LAST_INSERT_ID(),n 值應(yīng)為1。否則,值應(yīng)為2。使用AUTO_INCREMENT或LAST_INSERT_ID()的語(yǔ)句使用值2的原因是它們從主服務(wù)器的二進(jìn)制日志中取 兩個(gè)事件。
七:兩個(gè)重要的選項(xiàng):
1):· –logs-slave-updates
這個(gè)是在my.cnf文件配置的
通常情況,從服務(wù)器從主服務(wù)器接收到的更新不記入它的二進(jìn)制日志。該選項(xiàng)告訴從服務(wù)器將其SQL線程執(zhí)行的更新記入到從服務(wù)器自己的二進(jìn)制日志。為了使該 選項(xiàng)生效,還必須用–logs-bin選項(xiàng)啟動(dòng)從服務(wù)器以啟用二進(jìn)制日志。如果想要應(yīng)用鏈?zhǔn)綇?fù)制服務(wù)器,應(yīng)使用–logs-slave- updates。例如,可能你想要這樣設(shè)置:
A -> B -> C
也就是說(shuō),A為從服務(wù)器B的主服務(wù)器,B為從服務(wù)器C的主服務(wù)器。為了能工作,B必須既為主服務(wù)器又為從服務(wù)器。你必須用–logs-bin啟動(dòng)A和B以啟用二進(jìn)制日志,并且用–logs-slave-updates選項(xiàng)啟動(dòng)B。
2):· –slave-skip-errors=[err_code1,err_code2,… | all]
這個(gè)是在mysql啟動(dòng)時(shí)的選項(xiàng)
通常情況,當(dāng)出現(xiàn)錯(cuò)誤時(shí)復(fù)制停止,這樣給你一個(gè)機(jī)會(huì)手動(dòng)解決數(shù)據(jù)中的不一致性問(wèn)題。該選項(xiàng)告訴從服務(wù)器SQL線程當(dāng)語(yǔ)句返回任何選項(xiàng)值中所列的錯(cuò)誤時(shí)繼續(xù)復(fù)制。
如果你不能完全理解為什么發(fā)生錯(cuò)誤,則不要使用該選項(xiàng)。如果復(fù)制設(shè)置和客戶程序中沒(méi)有bug,并且MySQL自身也沒(méi)有bug,應(yīng)不會(huì)發(fā)生停止復(fù)制的錯(cuò)誤。濫用該選項(xiàng)會(huì)使從服務(wù)器與主服務(wù)器不能保存同步,并且你找不到原因。
對(duì)于錯(cuò)誤代碼,你應(yīng)使用從服務(wù)器錯(cuò)誤日志中錯(cuò)誤消息提供的編號(hào)和SHOW SLAVE STATUS的輸出。服務(wù)器錯(cuò)誤代碼列于附錄B:錯(cuò)誤代碼和消息。
你也可以(但不應(yīng))使用不推薦的all值忽略所有錯(cuò)誤消息,不考慮所發(fā)生的錯(cuò)誤。無(wú)需而言,如果使用該值,我們不能保證數(shù)據(jù)的完整性。在這種情況下,如果從服務(wù)器的數(shù)據(jù)與主服務(wù)器上的不相近請(qǐng)不要抱怨(或編寫(xiě)bug報(bào)告)。已經(jīng)警告你了。
例如:
代碼如下:
–slave-skip-errors=1062,1053
–slave-skip-errors=all

八:二個(gè)有用的問(wèn)與答:
1)Q:如果主服務(wù)器正在運(yùn)行并且不想停止主服務(wù)器,怎樣配置一個(gè)從服務(wù)器?
A:有多種方法。如果你在某時(shí)間點(diǎn)做過(guò)主服務(wù)器備份并且記錄了相應(yīng)快照的二進(jìn)制日志名和偏移量(通過(guò)SHOW MASTER STATUS命令的輸出),采用下面的步驟:
代碼如下:
1. 確保從服務(wù)器分配了一個(gè)唯一的服務(wù)器ID號(hào)。
2. 在從服務(wù)器上執(zhí)行下面的語(yǔ)句,為每個(gè)選項(xiàng)填入適當(dāng)?shù)闹担?
mysql> CHANGE MASTER TO
-> MASTER_HOST=’master_host_name’,
-> MASTER_USER=’master_user_name’,
-> MASTER_PASSWORD=’master_pass’,
-> MASTER_LOG_FILE=’recorded_log_file_name’,
-> MASTER_LOG_POS=recorded_log_position;

3. 在從服務(wù)器上執(zhí)行START SLAVE語(yǔ)句。
如果你沒(méi)有備份主服務(wù)器,這里是一個(gè)創(chuàng)建備份的快速程序。所有步驟都應(yīng)該在主服務(wù)器主機(jī)上執(zhí)行。

以下是引用片段:
1. 發(fā)出該語(yǔ)句:
mysql> FLUSH TABLES WITH READ LOCK;
2. 仍然加鎖時(shí),執(zhí)行該命令(或它的變體):
shell> tar zcf /tmp/backup.tar.gz /var/lib/mysql
3. 發(fā)出該語(yǔ)句并且確保記錄了以后用到的輸出:
mysql>SHOW MASTER STATUS;
4. 釋放鎖:
mysql> UNLOCK TABLES;
一個(gè)可選擇的方法是,轉(zhuǎn)儲(chǔ)主服務(wù)器的SQL來(lái)代替前面步驟中的二進(jìn)制復(fù)制。要這樣做,你可以在主服務(wù)器上使用mysqldump –master-data,以后裝載SQL轉(zhuǎn)儲(chǔ)到到你的從服務(wù)器。然而,這比進(jìn)行二進(jìn)制復(fù)制速度慢。
不管你使用這兩種方法中的那一個(gè),當(dāng)你有一個(gè)快照和記錄了日志名與偏移量時(shí),后來(lái)根據(jù)說(shuō)明操作。你可以使用相同的快照建立多個(gè)從服務(wù)器。一旦你擁有主服務(wù) 器的一個(gè)快照,可以等待創(chuàng)建一個(gè)從服務(wù)器,只要主服務(wù)器的二進(jìn)制日志完整。兩個(gè)能夠等待的時(shí)間實(shí)際的限制是指在主服務(wù)器上保存二進(jìn)制日志的可用硬盤(pán)空間和 從服務(wù)器同步所用的時(shí)間。
你也可以使用LOAD DATA FROM MASTER。這是一個(gè)方便的語(yǔ)句,它傳輸一個(gè)快照到從服務(wù)器并且立即調(diào)整日志名和偏移量。將來(lái),LOAD DATA FROM MASTER將成為創(chuàng)建從服務(wù)器的推薦方法。然而需要注意,它只工作在MyISAM 表上并且可能長(zhǎng)時(shí)間持有讀鎖定。它并不象我們希望的那樣高效率地執(zhí)行。如果你有大表,執(zhí)行FLUSH TABLES WITH READ LOCK語(yǔ)句后,這時(shí)首選方法仍然是在主服務(wù)器上制作二進(jìn)制快照。
2)Q:從服務(wù)器需要始終連接到主服務(wù)器嗎?
A:不,不需要。從服務(wù)器可以宕機(jī)或斷開(kāi)連接幾個(gè)小時(shí)甚至幾天,重新連接后獲得更新信息。例如,你可以在通過(guò)撥號(hào)的鏈接上設(shè)置主服務(wù)器/從服務(wù)器關(guān)系,其 中只是偶爾短時(shí)間內(nèi)進(jìn)行連接。這意味著,在任何給定時(shí)間,從服務(wù)器不能保證與主服務(wù)器同步除非你執(zhí)行某些特殊的方法。將來(lái),我們將使用選項(xiàng)來(lái)阻塞主服務(wù)器 直到有一個(gè)從服務(wù)器同步。

當(dāng)備份從服務(wù)器的數(shù)據(jù)時(shí),你還應(yīng)備份這兩個(gè)小文件以及中繼日志文件。它們用來(lái)在恢復(fù)從服務(wù)器的數(shù)據(jù)后繼續(xù)進(jìn)行復(fù)制。如果丟失了中繼日志但仍然有 relay-log.info文件,你可以通過(guò)檢查該文件來(lái)確定SQL線程已經(jīng)執(zhí)行的主服務(wù)器中二進(jìn)制日志的程度。然后可以用 Master_Log_File和Master_LOG_POS選項(xiàng)執(zhí)行CHANGE MASTER TO來(lái)告訴從服務(wù)器重新從該點(diǎn)讀取二進(jìn)制日志。當(dāng)然,要求二進(jìn)制日志仍然在主服務(wù)器上。
如果從服務(wù)器正復(fù)制LOAD DATA INFILE語(yǔ)句,你應(yīng)也備份該目錄內(nèi)從服務(wù)器用于該目的的任何SQL_LOAD-*文件。從服務(wù)器需要這些文件繼續(xù)復(fù)制任何中斷的LOAD DATA INFILE操作。用–slave-load-tmpdir選項(xiàng)來(lái)指定目錄的位置。如果未指定, 默認(rèn)值為tmpdir變量的值

MySQL的 Replication 是一個(gè)異步的復(fù)制過(guò)程,從一個(gè) Mysql instace(我們稱之為 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 ,首先必須打開(kāi) Master 端的BinaryLog(mysql-bin.xxxxxx)功能,否則無(wú)法實(shí)現(xiàn)。因?yàn)檎麄€(gè)復(fù)制過(guò)程實(shí)際上就是Slave從Master端獲取該日志然后 再在自己身上完全順序的執(zhí)行日志中所記錄的各種操作。打開(kāi) MySQL 的 Binary Log 可以通過(guò)在啟動(dòng) MySQL Server 的過(guò)程中使用“—log-bin” 參數(shù)選項(xiàng),或者在 my.cnf 配置文件中的 mysqld 參數(shù)組([mysqld]標(biāo)識(shí)后的參數(shù)部分)增加“l(fā)og-bin” 參數(shù)項(xiàng)。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊13 分享