mysql複製基礎

mysql支持單向、異步複製,複製過程中一個服務器充當主服務器,而一個或多個其它服務器充當從服務器。mysql複製基於主服務器在二進制日誌中跟蹤所有對數據庫的更改(更新、刪除等等)。因此,要進行復制,必須在主服務器上啓用二進制日誌。每個從服務器從主服務器接收主服務器已經記錄到其二進制日誌的保存的更新。當一個從服務器連接主服務器時,它通知主服務器從服務器在日誌中讀取的最後一次成功更新的位置。從服務器接收從那時起發生的任何更新,並在本機上執行相同的更新。然後封鎖並等待主服務器通知新的更新。從服務器執行備份不會干擾主服務器,在備份過程中主服務器可以繼續處理更新。
一、複製步驟
1)master再事務完成,將改變記錄到二進制日誌(binary log)中(這些記錄叫做二進制日誌事件,binary log events),在事件寫入二進制日誌完成後,master通知存儲引擎提交事務。
(2)slave 開啓一個I/O線程將master的binary log events拷貝到它的中繼日誌(relay log);

(3)slave 通過SQL線程重做中繼日誌中的事件,將改變反映它自己的數據。


注:在做主從複製時,最好確保主從服務器的版本兼容。從服務器至少與主服務器版本相同或更高。
二、複製基礎知識
1.mysql複製是異步複製,主從數據有延時,取決於主服務器的數據更新頻率。
避免延時方案:
1)使用pxc方案,基於percona Server,同步寫多個mysql,同時提交。
2)根據業務讓寫的用戶讀取主mysql,其他用戶讀取從數據庫,如論壇、微博等其他用戶延時讀,並無影響。
2.mysql複製是基於binlog日誌,也就是說主服務器必須開啓binlog日誌
目前存在三種日誌格式:
1)Statement 基於語句的複製, 在主服務器上執行的SQL語句,在從服務器上執行同樣的語句。MySQL默認採用基於語句的複製,效率比較高。存儲日誌量是最小的。如使用uuid等函數,由於在主從上執行會造成數據的不一致,一般不建議這種方式。
2)Row 基於行的複製,把改變的內容複製過去,而不是把命令在從服務器上執行一遍. 從mysql5.0開始支持。存儲event數據,存儲日誌量大,但是不能很直接的進行讀取。
3)Mixed 混合類型的複製,默認採用基於語句的複製,一旦發現基於語句的無法精確的複製時,就會採用基於行的複製。一般考慮這種方式。
3.mysql複製可以對整個實例進行復制,也可以對實例中某個庫或者某個表進行復制
1)master端控制,記錄那些庫或忽略那些庫記錄binlog日誌
--binlog-do-db
--binlog-ignore-db
2)slave端
--replicate-do-db
--replicate-ignore-db
--replicate-do-table
--replicate-ignore-table
--replicate-wild-do-table
--replicate-wild-ignore-table
建議在slave控制。
4.mysql複製類型
1)基於二進制日誌的複製類型
mysql5.5之前唯一的複製類型,需要明確知道,當前slave上的數據所對應master的日誌文件和日誌點
2)使用GTID完成基於事務的複製
mysql5.6之後,使用基於事務的複製,使用的是全局事務標識符(GTID)。每一個在master提交的事務都會賦予一個全局的事務標識符。提高數據的完整性,便於切換。
5.mysql支持半同步複製
mysql5.6半同步複製流程,等待slave dump完成才返回客戶端。如果在slave dump過程中,master掛了,由於主已經寫完成了,會照成主從的數據不一致。

mysql5.7半同步複製流程,將slave dump移到master commit之前。避免master宕機,造成數據不一致。


Mysql 5.5.8(GA)半同步配置指南:http://blog.csdn.net/changerlove/article/details/6167255

發佈了404 篇原創文章 · 獲贊 205 · 訪問量 227萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章