復制概述
復制解決的基本問題是讓一臺服務器的數(shù)據(jù)與其他服務器保持同步
MySQL支持兩種復制方式:基于行的復制和基于語句的復制,通過在主庫上記錄二進制日志,然后在備庫重放日志的方式來實現(xiàn)異步數(shù)據(jù)的復制
復制解決的問題
- 數(shù)據(jù)分布:比如在不同的地理位置存放數(shù)據(jù)備份,不同的數(shù)據(jù)中心
- 負載均衡:通過復制將讀操作分布到多個服務器上,實現(xiàn)對讀密集型應用的優(yōu)化
- 備份:復制是備份的一種補充,代替不了備份
- 高可用性和故障切換:避免單點故障,切換備庫縮短宕機時間
- MySQL升級測試
復制如何工作
- 在主庫上把數(shù)據(jù)更改記錄到二進制日志(Binary Log)中(這些記錄被稱為二進制日志事件)
- 備庫將主庫上的日志復制到自己的中繼日志(Relay Log)中
- 備庫讀取中繼日志中的事件,將其重放到備庫數(shù)據(jù)之上
- 兩個新的數(shù)據(jù)庫之間的配置
創(chuàng)建復制賬號、配置主庫和備庫、啟動復制
- 從另一個服務器開始復制
一個已經(jīng)運行了一段時間的主庫,然后用一臺新安裝的備庫與之同步,此時這臺備庫還沒有數(shù)據(jù),需要三個條件來讓主庫和備庫保持同步:
- 在某個時間點的主庫的數(shù)據(jù)快照
- 主庫當前的二進制日志文件,二進制日志文件中的偏移量(日志文件坐標)
- 從快照時間到現(xiàn)在的二進制日志
- 從別的服務器克隆備庫的方法
- 冷備份:關(guān)閉數(shù)據(jù)庫,拷貝數(shù)據(jù)文件
- 熱備份:mysqlhotcopy、rsync
- mysqldump
- 快照或備份
- Xtrabackup:可以在不影響主庫的情況下設(shè)置備庫
- 如果是從主庫獲得備份,可以從xtrabackup_binlog_pos_innodb文件中獲得復制開始的位置
- 如果是從另外的備庫獲得備份,可以從xtrabackup_slave_info文件中獲得復制開始的位置
復制的原理
- 基于語句的復制
主庫會記錄那些造成數(shù)據(jù)更改的查詢,當備庫讀取并重放這些事件時,實際上只是把主庫上執(zhí)行過的sql再執(zhí)行一遍
優(yōu)點:
當主備的模式不同時,邏輯復制能夠在多種情況下工作:比如數(shù)據(jù)類型不同、列的順序不同;基于語句的復制方式一般允許更靈活的操作;基于預計的方式執(zhí)行復制的過程基本上就是執(zhí)行SQL語句。出現(xiàn)問題容易定位。
缺點:
對于儲存過程、觸發(fā)器,存在Bug;如果正在使用觸發(fā)器或者儲存過程,就不要使用基于語句的復制模式,除非能夠清楚的確定不會碰到復制問題
- 基于行的復制
將實際數(shù)據(jù)記錄在二進制日志中,可以證券的復制每一行數(shù)據(jù)
優(yōu)點:
幾乎沒有基于行復制模式無法處理的場景,容易找到并解決數(shù)據(jù)不一致的情況;比如基于語句的復制模式,在備庫更新一個不存在的記錄時不會失敗,但在基于行的復制模式下則會報錯并停止復制
缺點:
由于語句并沒有在日志里記錄,因為無法判斷執(zhí)行了哪些SQL;使用一種完全不同的方式在備庫進行數(shù)據(jù)變更,執(zhí)行基于行的變化的過程就像一個黑盒子,無法知道服務器正在做什么;
復制拓撲
- 一主多備
場景:少量寫、大量讀
- 主-主(主動-主動)
(⊙o⊙)…MySQL不支持多主庫復制
- 主-主(主動-被動)
構(gòu)建容錯性和高可用的強大方式,主要區(qū)別在于:其中一臺服務器是只讀的被動服務器,這種方式使得反復切換主動和被動服務器非常方便,因為服務器的配置是堆成的。使得故障轉(zhuǎn)移和故障恢復很容易。它也可以讓你在不關(guān)閉服務器的情況下執(zhí)行維護、優(yōu)化表、升級操作系統(tǒng)或者其他任務。
配置:
1)確保兩臺服務器上有相同的數(shù)據(jù)
2)啟動二進制日志,選擇唯一的服務器ID,并創(chuàng)建復制賬號
3)啟用備庫更新的日志記錄,這是故障轉(zhuǎn)移和故障恢復的關(guān)鍵
4)把被動服務器配置成只讀
5)啟動每個服務器的MySQL實例
6)將每個主庫設(shè)置為對方的備庫,使用新創(chuàng)建的二進制日志開始工作
- 擁有備庫的主-主結(jié)構(gòu)
- 環(huán)形復制
環(huán)形結(jié)構(gòu)非常脆弱,盡量避免
- 一個主庫、一個分發(fā)主庫和多個備庫
分發(fā)主庫也是一個備庫,只是其他備庫從這個分發(fā)主庫來接收日志事件,降低主庫的壓力
- 樹形或者金字塔形
好處是減輕主庫的負擔,缺點是中間層出現(xiàn)任何錯誤都會影響到多個服務器,中間層次越多,處理故障就會更困難、更復雜
用途建議
- 選擇性復制
比如按部門,將數(shù)據(jù)復制到不同的數(shù)據(jù)庫
- 分離功能
在主庫上用作OLTP,在備庫上作OLAP分析
- 數(shù)據(jù)歸檔
在備庫上實現(xiàn)數(shù)據(jù)歸檔,保留主庫上刪除過的數(shù)據(jù)
- 將備庫用作全文檢索
- 只讀備庫
- 模擬多主庫復制
- 創(chuàng)建日志服務器
創(chuàng)建沒有數(shù)據(jù)的日志服務器,它的唯一目的就是更加容易重放并且過濾二進制日志事件,對崩潰后重啟復制很有幫助