標籤:mysql 主從同步的原理
前幾天搭建了MySQL的主從複製,已經搭建完成,但是主從複製的原理還不知道,所以來研究一下。
本文的部分內容來自於互連網。
主從複製的過程
首先要瞭解到的是一個單向主從複製的實現是由三個線程來完成,master一個IO線程,slave一個IO
線程和一個SQL線程。
1. slave 上面的IO線程串連上 master,並請求從指定記錄檔的指定位置(或者從最開始的日誌)之後的日誌內容;
2. master 接收到來自 slave 的IO線程的請求後,通過負責複製的IO線程根據請求資訊讀取指定日誌指定位置之後的日誌資訊,返回給slave端的IO線程。返回資訊中除了日誌所包含的資訊之外,還包括本次返回的資訊在master端的bin-log檔案的名稱以及在bin-log中的位置;
3. slave的IO線程接收到資訊後,將接收到的日誌內容依次寫入到slave端的Relay Log檔案(hostname-relay-bin.xxxxxx)的最末端,並將讀取到的Master端的bin-log的檔案名稱和位置記錄到master- info檔案中,以便在下一次讀取的時候能夠清楚的告訴master“我需要從某個bin-log的哪個位置開始往後的日誌內容,請發給我”
4. slave的SQL線程檢測到Relay Log中新增加了內容後,會馬上解析該Log檔案中的內容成為在 master 端真實執行時候的那些可執行檔Query 語句,並在自身執行這些Query。這樣,實際上就是在 master 端和slave 端執行了同樣的Query,所以兩端的資料是完全一樣的。
下面是實際的操作圖
1.首先看一下主庫的狀態
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6C/92/wKioL1VMc9WAJUolAADln3tdavQ440.jpg" title="QQ20150508162316.png" alt="wKioL1VMc9WAJUolAADln3tdavQ440.jpg" />
2.然後看一下從庫中master.info和nginx-relay-bin.000008(請無視名字,這個跟主機名稱有關)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6C/97/wKiom1VMc7iwixsnAAFNotQJQJ8605.jpg" title="QQ20150508162907.png" alt="wKiom1VMc7iwixsnAAFNotQJQJ8605.jpg" />
master.info中一部分檔案內容,跟master的bin-log的名稱和位置是一致的
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6C/97/wKiom1VMc-yyt_TnAABnbg3KZ5Q941.jpg" title="QQ20150508162555.png" alt="wKiom1VMc-yyt_TnAABnbg3KZ5Q941.jpg" />
然後是nginx-relay-bin.000008的檔案(有刪節)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6C/92/wKioL1VMecPSwu1oAAV1-8HsXG4894.jpg" title="QQ20150508164339.png" alt="wKioL1VMecPSwu1oAAV1-8HsXG4894.jpg" />
然後主庫建一個庫測試一下
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6C/97/wKiom1VMeK6TpglhAAEWvIzE2Yc027.jpg" title="QQ20150508165017.png" alt="wKiom1VMeK6TpglhAAEWvIzE2Yc027.jpg" />
看一下從庫的master.info和nginx-relay-bin.000008檔案
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6C/97/wKiom1VMee_iFlBmAACMcP6l_lc383.jpg" style="float:none;" title="QQ20150508165219.png" alt="wKiom1VMee_iFlBmAACMcP6l_lc383.jpg" />
nginx-relay-bin.000008檔案
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6C/93/wKioL1VMe2OQ_KeRAAIOLzVRi0s218.jpg" style="float:none;" title="QQ20150508165326.png" alt="wKioL1VMe2OQ_KeRAAIOLzVRi0s218.jpg" />
現在我們來類比一下故障,此時從資料庫宕機,此時master.info檔案不變,但是nginx-relay-bin.000008檔案產生變化
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6C/93/wKioL1VMfLjQ9QJ9AAGaO_LKvww685.jpg" title="QQ20150508170119.png" alt="wKioL1VMfLjQ9QJ9AAGaO_LKvww685.jpg" />
主要資料庫建立一個庫測試一下,
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6C/97/wKiom1VMfCvjx0QXAAFPL9ZQ99k350.jpg" title="QQ20150508170513.png" alt="wKiom1VMfCvjx0QXAAFPL9ZQ99k350.jpg" />
現在啟動從資料庫,此時relay-bin日誌會重新產生兩個,查看一下數值大的那個
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6C/93/wKioL1VMfvmSbrTQAAFlGqdgxE0597.jpg" title="QQ20150508170948.png" alt="wKioL1VMfvmSbrTQAAFlGqdgxE0597.jpg" />
查看nginx.relay-bin.000010
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6C/98/wKiom1VMf9bTVz4qAAZ53PEyrFA804.jpg" title="QQ20150508171325.png" alt="wKiom1VMf9bTVz4qAAZ53PEyrFA804.jpg" />
此時master.info檔案也會更新到最新的pos
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6C/93/wKioL1VMgeOjolceAABurZycrxY285.jpg" title="QQ20150508172321.png" alt="wKioL1VMgeOjolceAABurZycrxY285.jpg" />
故障類比完成。
寫到這裡,突然感覺寫的實在是太繁瑣了,詳細一點也好,保證大家能看明白,不會雲裡霧裡的感覺。
--------------------------------------分割線-----------------------------------------
說一下自己做實驗時一些小細節
1.搭建完單向主從的時候,在主庫建立了一個庫sunys01做測試,然後在從庫刪掉了他,此時的主從資料不一致,但是主從還是正常的,主庫再建一個庫,從庫也能同步的到資料。我一直以為主從同步只要是在從庫進行過操作就會導致主從斷掉。現在接上面的情況,從庫刪掉了sunys01,在主庫也刪掉sunys01,此時主從斷裂,主庫寫資料從庫無法同步資料, 現在我在從庫重新建立了一個sunys01庫,重啟一下mysql,主從恢複了,主庫中後續資料也成功同步。
2.做了一個雙向主從在主1建立新庫,同時他的master status變掉了,主1建立的庫在主2也有,但是主2的master status也變掉了。我同學也是做的雙主,但是主2的master status是不會變的,不知道是什麼原因
寫到這裡終於結束了,有什麼問題可以在評論中詢問,大家共同進步
MySQL之主從複製的過程和原理