為什么要對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主從復制的基本交互過程,如下:
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操作。
參考博客:
http://blog.chinaunix.net/uid-25266990-id-3239588.html
from:https://blog.51cto.com/zkhylt/1773679