標籤:
很多人都會MySQL主從架構的搭建,但很多人沒有真正理解同步基本用途、同步的基本原理,還有當Master和Slave同步斷開後的處理以及導致Master和slave不同步的原因等等,當你對這些都了如指掌的時候,對於MySQL主從出現的一些常見問題,也能很輕鬆的解決它,而且對資料庫結構描述的最佳化及改造都會有很大的協助。下面我們一起來學習下MySQL Replication吧,^0^
Replication的用途:
1、資料分發,scale out,sacle up,垂直劃分,水平劃分
2、負載平衡 load balance
3、備份,一般不會用作備份,一旦執行delete操作,replication也不會保留
4、實現資料的高可用
5、可以在不同的主從庫上使用不同的儲存引擎
6、測試MySQL的升級
常見的MySQL Replication的架構有:
MySQL一主多從,實現讀寫分離的架構圖:
常見的負載平衡架構:
當使用的slave過多,減輕Mater壓力的級聯架構,Master2開啟log-slave-updates配置
一台Master down時候的冗餘架構:
Replication不同的庫到不同的主機:
原理:
1、三個進程:
MySQL的複製(relication)是一個非同步複製,從一個Master複製到另一個Slave。實現整個複製操作主要由三個進程完成的,其中兩個進程在Slave上(Sql進程和IO進程),另外一個進程在Master上(IO進程),如果replication在進行的話,在Master上可以通過運行show processlist查看,在Slave上可以執行show slave status進行查看,裡面的Slave_IO_Running:No
Slave_SQL_Running:No
是兩個進程的狀態是否運行。
2、三個log檔案和兩個info檔案:
複製進行時,在Master上執行的語句會記錄到bin.log裡面,日誌的位置和數字,當有變化發生時,slave會通過現代戰爭io進程讀取master的二進位log,發現有變化時,會把新的變化複製到它的relay.log(中繼日誌),會記錄行的位置和資料到一個新的檔案叫master.info,繼續檢查master的二進位log,當slave的sql進程發現在relay.log裡有變化時候會執行,同時slave也會通過sql進程去對比Master和Slave的變化,如果對比發現不一致,複製進程會停止並把錯誤資訊計入slave的error.log,如果結果對得上,一個新的日誌的位置和數字會記錄到relay-log.info檔案,slave會等另一個變化到relay.log檔案。
3、複製的基本過程如下:
簡單的講就是Mster記錄其變化到binlog,Slave接收到的變化會記錄到他的Relay log,slave通過重放relay log,然後寫進自己的log
1)、Slave上面的IO進程串連上Master,並請求從指定記錄檔的指定位置(或者從最開始的日誌)之後的日誌內容;
2)、Master接收到來自Slave的IO進程的請求後,通過負責複製的IO進程根據請求資訊讀取指定日誌的指定位置之後的日誌資訊,返回給Slave的IO進程。返回資訊中除了日誌所包含的資訊之外,還包括本次返回的資訊已經到Master端的bin-log檔案的名稱以及bin-log的位置;
3)、Slave的IO進程接收到資訊後,將接收到的日誌內容依次添加到Slave端的relay-log檔案的最末端,並將讀取到的Master端的bin-log的檔案名稱和位置記錄到master-info檔案中,以便在下次讀取的時候能夠清楚的告訴Master"我需要從某個bin-log的哪個位置開始往後的日誌內容,請發給我";
4)、Slave的Sql進程檢測到relay-log中新增加了內容後,會馬上解析relay-log的內容成為在Master端真實執行時的那些可執行檔內容,並在自身執行;
4、Replication的兩種複製層級:
Statement level層級 MySQL 3.23後:
每一條修改資料的query都會記錄到master的binary log中,slave複製時候sql線程會解析成合原來的master端執行過的相同的query。
優點是:不需記錄每條變化,減少log,節省IO。
缺點是:必須每條語句相關資訊,即上下文資訊。
Row level層級5.1以後:
Binaty log會記錄成每一行資料被修改的形式,然後在slave連接埠對相同的資料進行修改,鎖表操作會大量減少。
優點:不需要記錄執行query語句的上下文資訊,只需要記錄那條被修改了,修改了什麼了。
缺點是:產生的log記錄比較大
還有一種不常用的mixed層級。
5、導致master和slave不同步的原因
1)、delete update 改變行的時候不使用limit語句,沒有order by
2)、一些函數在使用statements based replication 時候如下:
Load_file,User,Found_rows,UUID,UUID_SHORT,SYSDATE()
3)、不用使用暫存資料表,當slave crash掉或者重啟後,後丟失資訊
4)、slave down掉
5)、使用replicate-ignore-db 和 binlog-ignore-db
6)、錯誤的binlog執行sql導致binlog堵上,具體詳細內容可以參考:http://dev.mysql.com/doc/refman/5.0/en/replication.html
6、MySQL replication的曆史
mysql版本的4.0-5.0:
MySQL 5.1
總結:
一、通過MySQL Replication原理的學習,可以清楚理解到資料是怎麼從Master庫同步到Slave庫的,什麼情況會導致同步斷開等。
二、通過MySQL Replication架構的學習,可以根據線上及業務需要選擇合適自己業務的架構,提高資料的安全性及訪問的效率。
詳細內容可以參考大牛的部落格: http://ourmysql.com/archives/876
MySQL Replication Report