mysql主從同步以及原理

mysql主從複製介紹

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

    實時和異步:

   

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

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

   半同步複製:指的是客戶端連接到MySQL主服務器寫入一段數據, MySQL主服務器只將數據同步複製給其中一臺從服務器, 半同步複製給其他的從服務器, 來達到其中一臺從服務器完全同步的效果


主從複製原理:

image.png

從庫需要兩個線程完成,一個叫做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.在主庫上解鎖。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章