程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MYSQL入門知識 >> Mysql主從庫同步原理分析和多線程同步

Mysql主從庫同步原理分析和多線程同步

編輯:MYSQL入門知識
 

Mysql的Replication是一個 “異步” 的復制過程,也就是從Master復制到一個Slave上。

Mysql 5.1 多線程實現主從復制

重要的是,從Mysql5.1起,Master與Slave之間的復制過程修改為三個線程來完成。

其中兩個線程(Sql線程和IO線程)在 Slave 端,另外一個線程(IO線程)在 Master 端,使用並行的處理方式。而老版本的主從復制是用一個線程來處理。這樣的話,就解決了從庫延遲的問題;以及,從庫處理Bin_log時,主庫又新增數據, 從而帶來的數據丟失問題。

主從復制基本過程

主從庫的整個復制過程實際上就是:Slave從Master端獲取Binary log然後再按順序的執行日志中所記錄的各種操作。

Slave 上面的IO線程連接上 Master,並請求從指定日志文件的指定位置(或者從最開始的日志)之後的日志內容

Master 接收到來自 Slave 的 IO 線程的請求後,通過負責復制的 IO 線程根據請求信息讀取指定日志指定位置之後的日志信息,返回給 Slave 端的 IO 線程。返回信息中除了日志所包含的信息之外,還包括本次返回的信息在 Master 端的 Binary Log 文件的名稱以及在 Binary Log 中的位置

Slave 的 IO 線程接收到信息後,將接收到的日志內容依次寫入到 Slave 端的Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,並將讀取到的Master端的bin-log的文件名和位置記錄到master- info文件中,以便在下一次讀取的時候能夠清楚的高速Master“我需要從某個bin-log的哪個位置開始往後的日志內容,請發給我”

Slave 的 SQL 線程檢測到 Relay Log 中新增加了內容後,會馬上解析該 Log 文件中的內容成為在 Master 端真實執行時候的那些可執行的 Query 語句,並在自身執行這些 Query。這樣,實際上就是在 Master 端和 Slave 端執行了同樣的 Query,所以兩端的數據是完全一樣的

Mysql主從延遲問題的解決

當然,即使是換成了現在這樣兩個線程來協作處理之後,同樣也還是存在 Slave 數據延時以及數據丟失的可能性的,畢竟這個復制是異步的。只要數據的更改不是在一個事務中,這些問題都是存在的。

如果要完全避免這些問題,就只能用 MySQL 的 Cluster 來解決了。不過 MySQL的 Cluster 仍然還是一個內存數據庫的解決方案,也就是需要將所有數據包括索引全部都 Load 到內存中,這樣就對內存的要求就非常大的大,對於一般的大眾化應用來說可實施性並不是太大

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved