0、引言html
MySQL主從複製的原理及搭建,故障分析mysql
1、MySQL主從同步的架構及原理sql
原理:安全
1)Slave鏈接到master,主從數據一致,開啓同步,開始同步數據微信
2) 用戶在主上寫入數據,日誌儲存到binlog,master上IO thread讀取主庫binlog,而後把信息傳遞給從庫上的IO thread網絡
3)從庫上的IO thread再把部分信息存儲在master.info(存儲鏈接位置信息)和relay log裏(存儲binlog信息)架構
4)從庫上的SQL thread監測到relay log有更新,把更新的信息恢復到從庫,而後把位置點信息記錄下來函數
2、MySQL實現主從同步的幾種方式及使用價值工具
一、MySQL主從複製的幾種實現方式性能
l 基於binlog+position的傳統複製
l 基於事務的GTID複製
l 多源複製
l Group replication(5.7新特性)
l 半同步
二、MySQL主從複製的使用價值
l 利用從庫作高可用
l 利用從庫作讀寫分離
l 利用從庫作升級
3、MySQL基於binlog三種模式下的複製
一、基於statement格式的複製
優勢:binlog文件小,節省磁盤IO,只記錄執行的SQL,方便閱讀統計
缺點:對MySQL特殊函數不能複製,可能會致使主從不一致
二、基於row格式的複製
優勢:詳細記錄每一行的修改信息(上下文信息),不會出現某些特定狀況下函數、觸發器、存儲過程不執行的狀況,方便flashback
缺點:binlog文件會更大,不能直接看到用戶執行的SQL語句
三、基於mixed格式的複製
匯合使用row格式和statement格式,對於DDL記錄會statement格式,對於table裏的行操做記錄爲row格式。可是bug較多,不建議使用
4、MySQL的主從配置
一、創建用於同步的帳號(權限replication slave)
二、確保server-id全局惟一,並開啓log-bin
三、備份主庫,恢復到從庫,確保主從數據一致
四、查看主庫位置信息並配置鏈接,開啓主從
Tips:
一、若是庫表較多,可使用percona-tools工具集進行主從校驗
二、也能夠看slave status輸出,瞭解同步情況
>show slave status\G;關注下面幾個信息
Slave_IO_Running:從庫I/O線程是否工做
Slave_SQL_Running:從庫SQL線程是否工做
Seconds_Behind_Master:同步延遲時間,單位秒
Master_Log_File:主庫上的I/O線程目前讀到的binlog
Read_Master_Log_Pos:主庫上的I/O線程目前讀到的binlog的點
Relay_Master_Log_File:從庫SQL線程目前執行到的主庫binlog
Exec_Master_Log_Pos:從庫SQL線程目前執行到的主庫binlog的點
Relay_Log_File:從庫SQL線程目前執行的relay log
Relay_Log_Pos:從庫SQL線程目前執行的relay log的點
5、MySQL主從複製怎麼保證數據一致性
在MySQL中,一次事務提交後,須要寫undo、寫redo、寫binlog,寫數據文件等等。在這個過程當中,可能在某個步驟發生crash,就有可能致使主從數據的不一致。那麼如何保證複製數據一致性呢?
一、在master上修改配置,設置雙一,保證每次提交後,日誌落盤
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
二、在slave上修改配置,前兩個選項是確保slave上和複製相關的元數據表也採用innoDB引擎,受到innoDB事務安全的保護,後一個選項是開啓relay log自動修復機制,儘量避免數據丟失
master_info_repository = "TABLE"
relay_log_info_repository = "TABLE"
relay_log_recovery = 1
經過以上兩個方式基本能夠保證主從環境裏數據一致性,若是仍是出現主從數據不一致,可經過pt-table-checksum 和 pt-table-sync 工具來進行數據的校驗和修復。
6、MySQL主從複製常見問題及處理
MySQL同步中斷常見是由兩個方面引發:
I/O中斷 :網絡問題、主機宕機、受權改變
SQL中斷:執行的SQL出錯
一、主從複製過程當中,修改用於複製帳號的密碼,致使主從不一樣步
原來主從正常運行,後來修改用於複製帳號的密碼,修改完後從新執行
change master to master_host='xxx.xxx.xxx.xxx', master_user='replication user', master_password='passwd', master_port=xxxx, master_log_file='mysql-binlog.000xxx', master_log_pos=xxx;
悲劇了,若是指定MASTER_HOST與MASTER_PORT參數,slave會認爲master與以前的不是同一個(即使MASTER_HOST 與 MASTER_PORT所帶的參數與以前相同),以前指定的master的binlog文件名及位置將再也不適用。
所以,更新密碼後,只須要
change master to master_user='replication user', master_password='new passwd';
二、同步延時
seconds_behind_master>0
可能的緣由:
l 主庫在大量導入數據
l 從庫硬件跟不上,致使性能降低
l 從庫讀負載較大
l RAID卡充放電
三、常見的error code及意義
1062錯誤:
主鍵衝突,通常能夠跳過此類錯誤或者在配置文件中設置slave-skip-errors=1062
1032錯誤:
找不到這條記錄,能夠在從庫手動插入數據。或者跳過這個錯誤,要視狀況而定。
1050錯誤:
從庫上表存在了,直接刪除這個表便可
參考文檔:
FAQ系列 | 如何保證主從複製數據一致性
http://imysql.com/2015/11/20/mysql-faq-how-make-sure-replicate-data-consistant.shtml
爲了方便你們交流,本人開通了微信公衆號,和QQ羣291519319。喜歡技術的一塊兒來交流吧