標籤:問題 mysql複製 sleep sla 提高 更新 主伺服器 資料 分析
MySQL主從複製
MySQL複製
MySQL複製支援單向,非同步複製。通過一台主伺服器將更新寫入二進位記錄檔,並維護檔案的一個索引以追蹤記錄檔迴圈。這些日誌可以記錄發送到從伺服器的更新。當一個從伺服器串連主伺服器時,它通知主伺服器從伺服器在日誌中讀取的最後一次成功更新的位置。從伺服器接收從那時起發生的任何更新,然後封鎖並等待主伺服器通知新的更新。MySQL主從複製是非同步進行的。同步需要版本為5.5,使用google提供的外掛程式來實現。
MySQL主從複製操作很靈活既可以實現整個服務的層級的複製,也可以實現對某個庫,甚至某個資料庫中的指定的某個對象進行複製。
MySQL主從複製應用情境
提高效能。通過一(多)主多從的部署方案,將涉及資料寫的操作放在Master端操作,而將資料讀的操作分散到眾多的Slave當中。降低了Master的負載,提高資料寫入的響應效率;多台從伺服器提供讀,分擔了請求,提高了讀的效率。
資料安全。資料複製到Slave節點,即使Master宕機,Slave節點還儲存著完整資料。
資料分析。將資料分析,放在slave上。
主從複製的原理
MySQL的Replication是一個非同步複製過程,從一個MySQL執行個體(Master)複製到另一台MySQL執行個體上。在Master和Slave之間複製的整個過程主要由3個線程完成,其中兩個線程(SQL線程和IO線程)在Slave端,另外一個線程(IO線程)在Master端。
要實現主從複製,首先要在Master端開啟Binary Log功能。因為整個複製過程實際上就是Slave從Master上擷取二進位日誌,然後在自己身上完全按照產生的順序一次執行日誌中記錄的各種操作的過程。
複製的具體過程如下:
MySQL主從複製原理圖
Slave的IO線程連上Master,並請求記錄檔指定位置(或從開始的日誌)之後的日誌的內容。
Master接收到來自Slave的IO線程請求後,負責複製IO線程根據請求的資訊讀取指定日誌之後的日誌資訊,返回給Slave端的IO線程。返回資訊中除了日誌所包含的資訊,還包含了包括本次返回的資訊在Master端的Binary Log檔案的名稱和位置。
Slave的IO線程接受到資訊後,將日誌內容一次寫入Slave端的Relay Log檔案(mysql-relay-bin.xxxx)的末端,並將讀取到的Master端的bin-log的檔案和位置記錄到master-info檔案中,以便在下一次讀取時能夠清楚地告訴Master,下次從bin-log哪個位置開始往後的日誌內容。
Slave的SQL線程檢測檢測到Relay Log中更新內容後,會馬上解析該Log檔案中的內容,還原成在Master端真實執行時的可執行檔SQL語句,並執行這些SQK語句。實際上Master和Slave執行同樣的語句。
Binary Log 記錄方式
Row Level
Binary Log會記錄成每一行資料被修改的形式,然後在Slave端再對相同的資料進行修改。
優點:在Row Level模式下,Binnary Log可以不記錄執行的Query語句的上下文相關資訊,只要記錄哪一行修改了,修改成什麼樣子。Row Level會詳細的記錄下每一行資料的修改細節,而且不會出現某個特定情況下的預存程序,或Function,以及Trigger的調用和觸發無法被正確複製問題。
缺點:產生大量的日誌內容。
Statment Level
每一條會修改的SQL語句都會記錄到Master的Binnary中。Slave端在複製的時候,SQL線程會解析成和原來Master端執行過相同的SQL語句,並再次執行。
優點:首先,解決了Row Level下的缺點,不須要記錄每一行的資料變化,減少了Binnary Log日誌量,節約了IO成本,提高了效能。
缺點:由於它是記錄的執行語句,為了讓這些語句在Slave端也能正確執行。那麼它還必須記錄每條語句在執行時的一些相關資訊,即上下文資訊,以保證所有語句在Slave端被執行的時候能夠得到和在Master端執行時相同的結果。另外,由於MySQL發展比較快,很多新功能不斷加入,使得MySQL複製遇到了不小的挑戰,複製時設計的內容嶽父在,越容易出bug。在Statement Level下,目前已發現不少的情況下會造成MySQL的複製問題。主要是在修改資料使用了某些特定的函數貨功能後,出現,比如:Sleep()函數在有些版本中就不能正確的複製,在預存程序中使用了last_insert_id()函數,可能會使Slave和Master的到不一致的ID,等等。
Mixed Level
在Mixed模式下,MySQL會根據執行的每一條具體的SQL語句來區分對待記錄的日誌形式,也就是在Statement和Row之間選擇一種。除了MySQL認為通過Statement方式可能造成複製過程中Master和Slave之間產生不一致資料。(如特殊Procedure和Funtion的使用,UUID()函數的使用等特殊情況)時,它會選擇ROW的模式來記錄變更之外,都會使用Statement方式。
MySQL主從複製原理