掌握 MySQL 數據復制:從 Binlog 到主從同步的最佳實踐
1. 前言
在現代分布式數據庫架構中,數據的高可用性和一致性是至關重要的。MySQL 作為最流行的關系型數據庫之一,提供了多種機制來確保數據的高可用性和容錯性。其中,binlog(二進制日志)和主從復制是實現高可用性和災難恢復的重要技術。
在本篇文章中,我們將深入探討 MySQL binlog 的原理、配置以及如何通過 binlog 實現主從同步。無論你是 MySQL 新手,還是希望進一步了解數據庫高可用性的開發人員,都可以從本文中獲得寶貴的實踐經驗和理論知識。
2. Binlog
Binlog(Binary Log,二進制日志) 是 MySQL 用來記錄所有數據庫修改操作的日志文件,是Mysql server層去記錄,所以,不管是什么存儲引擎進行的數據存儲,如果BinLog開啟,都會進行記錄。
Binlog用途
- 數據同步與主從復制:
在 MySQL 主從復制架構中,主服務器將所有的數據庫變更操作記錄到 binlog 中,從服務器會讀取主服務器的 binlog 文件并將其應用到本地數據庫,從而實現數據的實時同步。
binlog 是主從復制的核心,通過它,MySQL 可以確保從服務器與主服務器保持數據一致性。
- 數據恢復:
- binlog 提供了基于時間點的數據恢復功能。當發生數據庫崩潰或誤操作時,管理員可以從最后的備份恢復數據,并通過 replay binlog 文件將其恢復到最新狀態。
- 這種方式比傳統的全備份方式更高效,可以更精確地恢復到某個特定時刻的數據。
Binlog配置
查詢Binlog配置命令
show variables like '%log_bin%';
show variables like '%binlog%';比較重要的配置含義
log_bin -- 默認on 開啟 可以對binlog進行關閉
log_bin_basename -- bin文件前綴 默認/var/lib/mysql/mysql-bin
log_bin_index -- bin文件索引 /var/lib/mysql/mysql-bin.index
binlog_cache_size -- binlog日志 事務緩存大小
binlog_encryption -- 內容是否加密 我們的內容為了安全性可能需要加密
binlog_format -- binlog格式
binlog_expire_logs_seconds -- 多久后binlog刪除 默認2592000s也就是30天BinLog格式
STATEMENT: 基于sql語句記錄,記錄的是語句,后續去執行binLog的執行語句。優點是存儲空間小,但在某些情況下可能會出現與主庫不一致的情況,比如:
update order set pay_time = now() where id = 1;大家想想,如果這條語句是11月1號執行的,但是11月3號數據庫宕機需要恢復數據,那么pay_time就會有問題。
ROW: 基于行格式記錄,binLog記錄的是單個行是如何更改的,雖然這種方式會占用更多的存儲空間,但能確保主從數據的一致性。比如上面那個語句:
update order set pay_time = 168535465 where @1 = 1; -- 168535465隨便寫的,不要糾結這個MIXED: 混合模式,默認是STATEMENT,在個別場景會切換成ROW模式
BinLog同步機制
BinLog也是先放到內存再同步到磁盤的,這里可以聯想下redolog內存與磁盤的方式
show variables like '%binlog_cache_size%'; -- 事務期間用于保存二進制日志更改的內存緩沖區的大小show variables like '%sync_binlog%'; -- 同步方式sync_binlog=0,不同步刷新到磁盤,交給操作系統去操作,斷電或者操作系統異常,可能導致數據丟失
sync_binlog=1,能保證數據的一致性,每次提交都必須同步到磁盤,但是對性能有影響,默認
sync_binlog=N, N默認是1,最大4294967295,代表我達到N條binLog后,再同步到磁盤,能夠靈活的來設置數據的一致性與性能之間的平衡
3. 主從同步
流程圖:
圖片
必要條件:
- 確保有唯一的server_id在配置文件中配置
server-id=xx或者使用sql語句配置
SET GLOBAL server_id=xx; -- 更改server_id- 數據源(master)必須開啟bin_log
從庫創建流程
- master創建用戶
- 建立主從關系
CHANGE REPLICATION SOURCE TO
-> SOURCE_HOST='source_host_name',
-> SOURCE_USER='replication_user_name',
-> SOURCE_PASSWORD='replication_password',
-> SOURCE_LOG_FILE='recorded_log_file_name',
-> SOURCE_LOG_POS=recorded_log_position; --我要從binlog的哪個位置開始同步- 開啟主從同步
start replica; --開啟主從同步- 更改從庫只讀
SHOW VARIABLES LIKE'%read_only%';
SET GLOBAL super_read_notallow=1; -- super賬號也只讀
SET GLOBAL read_notallow=1; -- 只讀同步方式
- 異步同步:默認方式,性能比較高,但是數據一致性低,會有數據丟失可能。
- 半同步:由于異步同步會存在一定的數據丟失,所以Mysql的主從復制有一個半同步的概念,所謂半同步,就是我的主必須等待數據至少有一個副本(具體數量可以進行配置)接收并記錄了,才會允許提交事務。
4. 總結
MySQL 的 binlog(二進制日志) 和 主從同步 是確保數據庫高可用性、可擴展性和災難恢復的關鍵技術。通過 binlog,MySQL 記錄了所有數據修改操作,為主從復制提供了數據同步的基礎。主服務器的變更通過 binlog 被傳遞到從服務器,實現了數據的實時同步,從而保證了數據的一致性和容錯能力。
在配置 MySQL 主從復制時,理解和正確配置 binlog 是至關重要的。binlog 不僅是數據同步的核心,也是數據庫恢復和數據審計的重要工具。通過合適的配置(如設置 log_bin、server-id、read_only 等參數),可以確保主從同步的高效性和可靠性。
此外,雖然 binlog 和主從復制為 MySQL 提供了高可用性和災難恢復的基礎,但在實際使用過程中,仍然需要關注復制延遲、網絡帶寬、負載均衡等因素的影響。對于復雜的生產環境,建議結合 GTID(全局事務標識符) 和 semi-sync replication(半同步復制) 等技術來進一步增強主從復制的健壯性和一致性。
總的來說,MySQL 的 binlog 和主從同步技術為我們提供了強大的數據復制和恢復能力,是構建高可用數據庫架構的基石。在日常使用中,掌握這些技術不僅能幫助我們實現高效的數據同步,還能為系統的擴展性和容錯能力提供保障。

































