1. 程式人生 > >mysql主從同步以及原理

mysql主從同步以及原理

mysql linux

mysql主從復制介紹

當前的生產工作中,大多數應用的mysql主從同步都是異步的復制方式,即不是嚴格實時的數據同步。

實時和異步:

同步復制: 指的是客戶端連接到MySQL主服務器寫入一段數據, MySQL主服務器同步給MySQL從服務器需要等待從服務器發出同步完成的響應才返回客戶端OK, 這其中等待同步的過程是阻塞的, 如果有N臺從服務器, 效率極低

異步復制: 指的是客戶端連接到MySQL主服務器寫入一段數據, MySQL主服務器將寫入的數據發送給MySQL從服務器, 然後直接返回客戶端OK, 可能從服務器的數據會和主服務不一致

半同步復制:指的是客戶端連接到

MySQL主服務器寫入一段數據, MySQL主服務器只將數據同步復制給其中一臺從服務器, 半同步復制給其他的從服務器, 來達到其中一臺從服務器完全同步的效果


主從復制原理:

技術分享圖片

從庫需要兩個線程完成,一個叫做I/O線程,一個叫做sql線程

主庫需要一個線程叫做I/O線程

主庫必須要開啟binlog日誌才能完成主從同步,當用戶請求到主的庫裏面,會將增刪改的東西記錄到binlog日誌裏面,主從復制是從庫去找主庫的,建立時,我們在從庫上使用change master指定master的ip,端口,二進制文件名稱,pos,master的密碼等信息。並在從庫上開啟start slave就會開啟同步。

開啟同步後,先是從向主發起請求。然後主庫進行驗證從庫是否正常,驗證之後,主庫就會給從庫按照信息發送日誌,從庫上存放日誌的地方叫做中繼日誌(relay log),其實從庫裏面還有一個master info信息,這個裏面記錄的是change master的信息,每一次取日誌回來都會對從庫的master info信息進行更新,接下來從庫根據master info的binlog信息去主庫在取跟新的binlog信息,

放到中繼日誌裏面,我們如何進行更新?

當主將binlog發送過來放到中繼日誌裏面的時候,sql線程就會語句經過轉換寫到從庫裏面。


註意

1.開啟binlog日誌

2.change master(在從庫上)

3.在從庫開啟start slave之前。這兩個庫的數據必須是一樣的,所以講主庫的數據進行備份使用master-data=1,會記錄位置的。然後從庫會指定從主庫備份裏面找備份點。

4.要在開關之前建立專門用於主從同步的賬號

5.從庫打開開關的過程,其實就是打來從庫兩個線程的過程

6.start slave

主庫返回的除了binlog日誌內容外,還有本次返回日誌內容後在Master服務器端的新的binlog文件名稱以及在binlog中的下一個指定更新的位置。這個位置會保存在從庫的master info裏面。

>flush tables with read lock;在主庫上執行加上讀鎖

然後另開一個窗口,連接到主mysql

>show master status; 查看主庫的binlog以及pos值。

下來是備份主庫數據,將備份數據在從庫上執行。目的就是讓從庫和主庫的數據一樣。

從庫將主庫的備份數據導入完了以後要將鎖打來:

>unlocks tables;

然後在從庫上執行change master語句。這些信息會記錄在從庫的master.info的信息中;(如果你備份的時候指定master-data=1)

最後一步開啟start slave;

查看是否成功使用show slave status; 查看兩個進程是否為yes。

從庫裏面的relay-log.info:記錄sql線程從中繼裏面讀取到的日誌。



描述mysql主從復制原理

自己總結:從庫的io線程會實時依據master.info信息的去主庫的binlog日誌裏面讀取更新的內容,將更新的內容取回到自己的中繼日誌中,同時會更新master.info信息,此時sql線程實時會從中繼日誌中讀取並執行裏面的sql語句。

描述mysql主從同步部署

自己總結:

1.將主庫的數據備份,備份的時候時候master-data=1指定。然後在從庫上將備份數據導入

2.在主庫上給開啟主庫的bin-log功能,以及service-id

mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave_account'@'10.121.0.220' identified by '123456'

這句的意思是,允許從服務器'10.121.0.220 '使用'slave-account'及'123456'這個帳號密碼對對主服務器的所有數據庫(*.*)進行主從復制('REPLICATION SLAVE').

3.在主庫上執行flush tables with relay locks; 讀寫鎖。然後領開啟一個窗口

4.然後只從庫上執行change master 裏面指定剛才創建的用戶以及密碼

5.執行start slave;

6.show slave status;看看兩個線程是否啟動

7.在主庫上解鎖。


mysql主從同步以及原理