1. 程式人生 > 資料庫 >為什麼要對MySQL做主從同步複製

為什麼要對MySQL做主從同步複製

為什麼要對MySQL做主從同步複製

一.MySQL主從方案主要作用

  1.讀寫分離,使資料庫能支撐更大的併發

  在報表中尤其重要。由於部分報表sql語句非常的慢,導致鎖表,影響前臺服務。如果前臺使用master,報表使用slave,那麼報表sql將不會造成前臺鎖,保證了前臺速度。

  2.發揚不同表引擎的優點

  目前Myisam表的查詢速度比innodb略快,而寫入併發innodb比myIsam要好。那麼,我們可以使用innodb作為master,處理高併發寫入,使用master作為slave,接受查詢。或在myisam slave中建立全文索引,解決innodb無全文索引的弱點。

  3.熱備

  slave和master的資料“準實時”同步。

二.複製技術能夠解決的問題

  MySQL複製技術有以下一些特點:
  1.資料分佈 (Data distribution )
  2.負載平衡(load balancing)
  3.備份(Backups) 
  4.高可用性和容錯行 High availability and failover

三.MySQL主從同步複製原理

  MySQL主從複製的基本互動過程,如下:

  wKioL1c4XGPQW0pxAABUrjWR9Ok618.gif

  1.slave端的IO執行緒連線上master端,並請求從指定binlog日誌檔案的指定pos節點位置(或者從最開始的日誌)開始複製之後的日誌內容。

  2.master端在接收到來自slave端的IO執行緒請求後,通知負責複製程序的IO執行緒,根據slave端IO執行緒的請求資訊,讀取指定 binlog日誌指定pos節點位置之後的日誌資訊,然後返回給slave端的IO執行緒。該返回資訊中除了binlog日誌所包含的資訊之外,還包括本次返回的資訊在master端的binlog檔名以及在該binlog日誌中的pos節點位置。

  3.slave端的IO執行緒在接收到master端IO返回的資訊後,將接收到的binlog日誌內容依次寫入到slave端的relay log檔案(mysql-relay-bin.xxxxxx)的最末端,並將讀取到的master端的binlog檔名和pos節點位置記錄到master- info(該檔案存在slave端)檔案中,以便在下一次讀取的時候能夠清楚的告訴master,我需要從哪個binlog檔案的哪個pos節點位置開 始,請把此節點以後的日誌內容發給我。

  4.slave端的SQL執行緒在檢測到relaylog檔案中新增內容後,會馬上解析該log檔案中的內容。然後還原成在master端真實執行的那些SQL語句,並在自身按順序依次執行這些SQL語句。這樣,實際上就是在master端和slave端執行了同樣的SQL語句,所以master端和 slave端的資料是完全一樣的。

  以上mysql主從複製互動過程比較拗口,理解起來也比較麻煩,我簡化了該互動過程。如下:

  1、master在執行sql之後,記錄二進位制log檔案(bin-log)。

  2、slave連線master,並從master獲取binlog,存於本地relay-log中,然後從上次記住的位置起執行SQL語句,一旦遇到錯誤則停止同步。

  注意:

  請注意當你進行復制時,所有對複製中的表的更新必須在主伺服器上進行。否則,你必須要小心,以避免使用者對主伺服器上的表進行的更新與對從伺服器上的表所進行的更新之間的衝突。

四.MySQL主從同步複製的缺點

  從以上mysql的Replication原理可以看出:

  1.主從間的資料庫不是實時同步,就算網路連線正常,也存在瞬間主從資料不一致的情況。

  2.如果主從的網路斷開,則從庫會在網路恢復正常後,批量進行同步。

  3.如果對從庫進行修改資料,那麼如果此時從庫正在在執行主庫的bin-log時,則會出現錯誤而停止同步,這個是很危險的操作。所以一般情況下,我們要非常小心的修改從庫上的資料。

  注意:

  1.一個衍生的配置是雙主、互為主從配置,只要雙方的修改不衝突,則可以工作良好。

  2.如果需要多主庫的話,可以用環形配置,這樣任意一個節點的修改都可以同步到所有節點。

五.如何實現MySQL主從複製 

  要實現MySQL的Replication,首先必須開啟master端的binlog (mysql-bin.xxxxxx)日誌功能,否則無法實現mysql的主從複製。因為mysql的整個主從複製過程實際上就是:slave端從 master端獲取binlog日誌,然後再在自己身上完全順序的執行該日誌中所記錄的各種SQL操作。

參考部落格:

from:https://blog.51cto.com/zkhylt/1773679