MySQL主從復制與數據庫集群深度解析

一、主從復制核心架構與復制模式

MySQL主從復制是構建分布式數據庫的基礎技術,通過日志同步機制實現數據冗余與讀寫分離。其核心架構分為三層:

  1. 日志記錄層:主庫將數據變更寫入二進制日志(Binlog)
  2. 網絡傳輸層:從庫I/O線程拉取Binlog并寫入中繼日志
  3. 事件應用層:從庫SQL線程解析日志并執行SQL語句
復制模式對比
模式核心原理數據安全性性能影響適用場景
異步復制主庫提交事務后立即返回,不等待從庫確認低(主庫故障可能丟數據)非核心業務、測試環境
半同步復制主庫等待至少1個從庫確認后返回中(至少2節點存數據)增加1-5ms訂單、支付等中等一致性場景
全同步復制主庫等待所有從庫確認后返回高(所有節點一致)增加10-50ms金融交易、證券等強一致場景
二、主從復制配置與操作實戰
1. 異步復制配置(基礎模式)

主庫配置(my.cnf)

[mysqld]
server-id=1                      # 唯一實例ID
log-bin=/data/mysql/binlog        # Binlog存儲路徑
binlog-format=ROW                # 行級格式保證一致性
gtid-mode=ON                     # 啟用全局事務ID
enforce-gtid-consistency=ON       # 強制GTID一致性

創建復制用戶

CREATE USER 'repl'@'192.168.1.%' IDENTIFIED WITH mysql_native_password BY 'Repl@123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%';
FLUSH PRIVILEGES;

從庫配置(my.cnf)

[mysqld]
server-id=2                      # 不同ID
relay-log=/data/mysql/relay       # 中繼日志路徑
read-only=ON                     # 從庫只讀
slave-parallel-workers=4         # 并行復制線程數
slave-parallel-type=LOGICAL_CLOCK # 邏輯時鐘并行模式

從庫連接主庫

CHANGE MASTER TOMASTER_HOST='192.168.1.10',MASTER_USER='repl',MASTER_PASSWORD='Repl@123',MASTER_AUTO_POSITION=1;        # GTID模式自動定位
START SLAVE;
SHOW SLAVE STATUS\G;             # 確認IO/SQL線程運行正常
2. 半同步復制配置(增強安全性)

主庫啟用半同步

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled=ON;
SET GLOBAL rpl_semi_sync_master_timeout=5000;  # 超時5秒

從庫啟用半同步

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled=ON;
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;  # 重啟IO線程生效

監控半同步狀態

-- 主庫查看
SHOW STATUS LIKE 'Rpl_semi_sync_master_status';  -- ON表示啟用
SHOW STATUS LIKE 'Rpl_semi_sync_master_no_tx';   -- 異步降級次數-- 從庫查看
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';   -- ON表示啟用
三、內容傳輸機制與格式深度解析
1. Binlog格式對比與選擇
格式存儲內容日志量一致性風險典型場景
STATEMENTSQL語句文本函數執行差異開發測試、日志空間敏感
ROW行數據前后鏡像生產環境、金融交易
MIXED自動混合前兩種模式中等混合場景的折中選擇

ROW格式內核
包含TABLE_MAP_EVENT(表結構映射)、WRITE/UPDATE/DELETE_ROWS_EVENT(行操作),完整記錄主鍵和變更字段,確保從庫執行結果與主庫一致。
隱患示例:STATEMENT格式下INSERT INTO t VALUES (NOW())會導致從庫生成不同時間戳,ROW格式則記錄主庫實際值。

2. 傳輸流程與優化技術
主庫事務提交
寫入Binlog
斷線重連后請求該位置
請求Binlog增量數據
寫入中繼日志
解析并執行SQL
更新從庫數據
記錄Master_Log_Pos
  1. 主庫記錄:事務提交時寫入Binlog Cache,刷盤后生成Binlog文件
  2. 從庫拉取:I/O線程通過TCP獲取Binlog,寫入中繼日志
  3. 從庫應用:SQL線程解析中繼日志,執行SQL語句

優化技術

  • 壓縮傳輸binlog_transaction_compression=zlib(5.7+),大事務壓縮比達4:1
  • 斷點續傳:GTID自動追蹤未執行事務,網絡中斷后無縫恢復
  • 并行復制:MySQL 8.0的WRITESET模式基于行級沖突檢測,并行度提升2倍
四、線程分工與底層運行原理
1. 主庫線程模型
  • Binlog Dump線程:為每個從庫創建獨立線程,負責:
    • 解析Binlog為事件流(如FORMAT_DESCRIPTION_EVENT
    • 按GTID過濾事務(僅發送從庫未執行的事務)
    • 每秒發送心跳包維持連接活性
2. 從庫線程演進
版本線程模型并發能力瓶頸點
5.6I/O+SQL(單線程)大事務延遲顯著SQL線程單線程
5.7I/O+SQL+N個回放線程(庫級并行)同庫事務并行,QPS提升3倍跨庫事務仍串行
8.0I/O+協調線程+N個工作線程(行級并行)行級沖突檢測,QPS再提升2倍復雜事務依賴仍需優化

MySQL 8.0并行復制配置

slave-parallel-type=WRITESET         # 行級并行模式
slave-parallel-workers=8            # 并行線程數=CPU核心數
transaction-write-set-extraction=XXHASH64 # 行修改哈希算法
五、關鍵日志作用與管理
1. 二進制日志(Binlog)
  • 核心作用:主從復制數據來源、時間點恢復(PITR)、審計追蹤
  • 安全配置
    binlog-encryption=ON              # AES加密防止流量嗅探
    binlog-row-events-max-size=8192   # 限制單行Binlog大小
    
  • 管理命令
    SHOW BINARY LOGS;                  -- 查看所有Binlog
    PURGE BINARY LOGS BEFORE '2024-01-01'; -- 清理過期日志
    
2. 中繼日志(Relay Log)
  • 高可用設計:分段存儲(默認1GB/文件),從庫重啟時通過mysql.slave_relay_log_info表恢復位置
  • 空間管理
    SHOW RELAYLOG EVENTS;              -- 查看中繼日志進度
    PURGE RELAY LOGS BEFORE '2024-01-01'; -- 清理過期中繼日志
    
3. 錯誤日志(Error Log)
  • 關鍵錯誤碼
    • 1236:主從連接中斷或Binlog不連續(檢查網絡/日志清理)
    • 1872:GTID事務重復執行(需RESET SLAVE ALL
    • 1593:半同步超時(主庫降級為異步,檢查從庫負載)
六、全同步復制與集群方案
1. 全同步復制實現(Galera Cluster)

核心配置

[mysqld]
wsrep_on=ON                        # 啟用Galera
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.1.10,192.168.1.11,192.168.1.12"
wsrep_sst_method=xtrabackup-v2      # 全量同步方式
wsrep_sync_wait=1                   # 等待所有節點確認

優缺點

  • 優點:強一致性,適合金融交易
  • 缺點:性能損耗30%-50%,集群擴展復雜
2. 高可用集群搭建(InnoDB Cluster)

5節點集群初始化

-- 種子節點執行
dba.createCluster('finance_cluster', {adminUser: 'root',adminPassword: 'Root@123'
});-- 添加節點
dba.joinInstance('repl@192.168.1.11:3306', {password: 'Repl@123',recoveryMethod: 'xtrabackup'
});-- 查看集群狀態
SELECT * FROM performance_schema.replication_group_members;

核心特性

  • 自動選舉新主庫(基于Raft算法)
  • 內置MySQL Router實現連接路由
  • 支持多主寫入模式
七、集群維護與故障處理
1. 主從切換實戰

手動切換流程

  1. 主庫設為只讀
    FLUSH TABLES WITH READ LOCK;
    SET GLOBAL read_only=ON;
    
  2. 等待從庫同步
    SHOW SLAVE STATUS\G;  -- 確認Seconds_Behind_Master=0
    
  3. 提升從庫為主庫
    STOP SLAVE;
    RESET SLAVE ALL;
    SET GLOBAL read_only=OFF;
    
  4. 原主庫配置為從庫
    CHANGE MASTER TO MASTER_AUTO_POSITION=1;
    START SLAVE;
    
2. 復制延遲優化

診斷工具

  • pt-heartbeat:精準測量延遲(誤差<1ms)
  • Prometheus監控指標:
    mysql_slave_seconds_behind_master  # 復制延遲
    mysql_binlog_size                # Binlog增長速率
    

優化策略

  • 硬件:主從間部署10Gbps專線,Binlog用NVMe SSD
  • 參數:
    # 主庫批量提交
    binlog-group-commit-sync-delay=50
    binlog-group-commit-sync-no-delay-count=100# 從庫并行復制
    slave-parallel-workers=8
    
  • SQL優化:大事務拆分為小事務
八、企業級最佳實踐
  1. 架構選型

    • 核心交易:半同步+3節點InnoDB Cluster(RTO<30秒,RPO=0)
    • 高并發查詢:一主多從+MySQL Router(讀寫分離)
    • 海量數據:分片集群+MyCat(單庫10TB以上)
  2. 安全加固

    • 復制用戶僅授予REPLICATION SLAVE權限
    • 啟用SSL加密復制連接:
      ssl-ca=/path/to/ca.pem
      ssl-cert=/path/to/server-cert.pem
      ssl-key=/path/to/server-key.pem
      
  3. 監控告警

    • 關鍵指標:復制延遲>50ms、IO/SQL線程異常、Binlog增長速率>10MB/s
    • 告警通道:短信、郵件、釘釘機器人
九、總結:從復制到分布式的演進

MySQL主從復制已從簡單數據同步發展為企業級分布式架構的核心組件。理解其內核(如ROW格式行鏡像、GTID事務追蹤、WRITESET并行復制)是構建高性能集群的基礎。實踐中需根據業務特性選擇復制模式:

  • 強一致性場景:半同步+InnoDB Cluster(金融、支付)
  • 高并發場景:異步復制+分片集群(電商、社交)
  • 海量數據場景:級聯復制+冷熱分離(日志、歷史數據)

通過深度掌握主從復制與集群技術,結合Prometheus監控與自動化運維工具,可構建兼具性能、可用性與擴展性的數據庫系統,支撐企業核心業務的持續發展。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/87015.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/87015.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/87015.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安裝emsdk 4.0.10報Connection reset by peer解決

出錯如下: 使用瀏覽器下載所需文件 https://storage.googleapis.com/webassembly/emscripten-releases-builds/deps/node-v22.16.0-darwin-x64.tar.gz 移動到到emsdk/downloads下 修改emsdk.py download_even_if_exists=True 設置環境變量

win11,visual studio 2022,配置dcmtk,opencv

一、配置dcmtk 1 文件下載---地址&#xff0c;Software Development based on DCMTK - dicom.offis.de 源文件下載&#xff0c;選擇.zip下載&#xff0c;.tar.gz為Linux和macOS下面常見的壓縮包 支持庫下載 解決 DCMTK 在 Windows 上編譯時所需的依賴庫問題 libiconv GNU有…

2025 最新 Appium Inspector 環境搭建教程

1 環境搭建背景 版本升級&#xff1a;Appium 2.0 版本替代 1.x&#xff0c;原 Appium Desktop 因安全漏洞和功能廢棄不再適用。需求痛點&#xff1a;Android Studio 僅支持 debug 程序元素定位&#xff0c;需通過 Appium Inspector 實現通用 APK 元素定位。 2 環境搭建步驟 …

Vue 安裝使用教程

一、Vue 簡介 Vue&#xff08;讀作 /vju?/&#xff0c;類似于“view”&#xff09;是一款用于構建用戶界面的漸進式 JavaScript 框架。它易于上手&#xff0c;輕量高效&#xff0c;適合快速構建前端界面&#xff0c;廣泛應用于各類 Web 項目中。 二、Vue 安裝方式 2.1 直接通…

通過http調用來訪問neo4j時報錯,curl -X POST 執行指令報錯

curl -X POST ^ More? http://localhost:7474/db/neo4j/tx/commit ^ More? -H Authorization: Basic bmVvNGo6MTIzNDU2Nzg ^ More? -H Content-Type: application/json ^ More? -d { \"statements": [{\"statement": \"MATCH (n) RETURN n, label…

Node.js到底是什么

我想像是npm、vite這些名詞大家都很熟悉&#xff0c;對它們的作用也有大致印象&#xff0c;但是可能都像我一樣不明白Node.js到底是什么&#xff0c;這里給大家帶來一個簡單介紹。 Node.js 詳解&#xff1a;歷史發展、生態構建與底層原理 一、Node.js 的起源與歷史發展 誕生背…

Rust與Go:GAN實戰對決

Rust與Go生成對抗 GAN概念 GAN的全稱是Generative Adversarial Network,中文翻譯為生成對抗網絡。這是一種深度學習模型,由兩部分組成:生成器(Generator)和判別器(Discriminator)。生成器的任務是創建數據,而判別器的任務是區分生成器創建的數據和真實數據。這兩部分…

pyspark driver 上傳pod本地文件到對象存儲

前提: pyspark driver on k8s,環境變量或者spark_home/jars 下有相關對象存儲的包,報錯包問題就這里添加jar即可 from py4j.java_gateway import java_import from pyspark.sql import SparkSession# ----------------------------------------------------------------------…

使用GeoServer發布地圖shapefi(.shp)數據

1.創建新的工作區 2.添加新的數據存儲&#xff0c;選擇Shapefile - ESRI? Shapefiles (*.shp) 如果這個發布頁面退出了 可以這樣找回來 點擊發布返回圖層我們發布的數據在圖層顯示 點擊Layer Preview 預覽 現在前端就可以用 OpenLayers地圖來調用這個服務了

python+uniapp基于微信小程序的PS社區系統

文章目錄 具體實現截圖本項目支持的技術路線源碼獲取詳細視頻演示&#xff1a;文章底部獲取博主聯系方式&#xff01;&#xff01;&#xff01;&#xff01;本系統開發思路進度安排及各階段主要任務java類核心代碼部分展示主要參考文獻&#xff1a;源碼獲取/詳細視頻演示 ##項目…

設計模式 - 組合思維_Unix 設計哲學三大原則

文章目錄 引言Unix 哲學本質三大啟示總覽啟示一&#xff1a;保持簡單清晰性軟件復雜度來源實踐方法 啟示二&#xff1a;借鑒組合理念Unix 組合示例避免“定制驅動”爛設計 啟示三&#xff1a;重拾數據思維數據驅動編程演進案例分析 總結 引言&#xff1a;介紹 Unix 與 Unix 哲學…

C++ 快速回顧(四)

C 快速回顧&#xff08;四&#xff09; 前言一、純虛函數二、final關鍵字1.作用到函數2.作用到類 三、虛函數原理四、Lambda一些知識補充 前言 用于快速回顧之前遺漏或者補充C知識 一、純虛函數 純虛函數主要是當接口&#xff0c;沒有具體的實現要到派生類去實現。 純虛函數…

vue入門學習時,按照官方的教程生成的vue3項目后,命令行運行npm install出現一堆warn,然后運行npm run dev報錯,項目啟動失敗

日期&#xff1a;2025年6月27日 星期五農歷六月初三 VUE版本&#xff1a;vue3 IDE&#xff1a;vs code vue入門學習時&#xff0c;按照官方的教程生成的vue3項目后&#xff0c;命令行運行npm install出現一堆warn&#xff0c;然后運行npm run dev報錯&#xff0c;項目啟動失敗…

jQuery EasyUI 安裝使用教程

一、jQuery EasyUI 簡介 jQuery EasyUI 是一套基于 jQuery 的用戶界面框架&#xff0c;提供了豐富的 UI 組件&#xff0c;如數據表格、樹形結構、窗體、對話框等&#xff0c;適用于快速開發后臺管理系統和 Web 應用界面。它封裝了大量常用功能&#xff0c;使用簡單&#xff0c…

python下劃線開頭函數總結

在Python中&#xff0c;以雙下劃線 __ 開頭的函數&#xff08;或變量&#xff09;具有特殊的命名含義&#xff0c;主要用于實現類的私有成員、魔法方法&#xff08;特殊方法&#xff09;和名稱修飾&#xff08;Name Mangling&#xff09;機制。下面詳細解釋這三種情況&#xff…

代理模式 - Flutter中的智能替身,掌控對象訪問的每一道關卡!

痛點場景&#xff1a;直接加載高清大圖 假設你的應用需要顯示用戶相冊&#xff1a; NetworkImage(https://example.com/high-res-photo.jpg)面臨的問題&#xff1a; &#x1f4f6; 網絡差時長時間白屏&#x1f4be; 重復下載相同圖片浪費流量&#x1f512; 敏感圖片無權限驗…

Python集合的創建

一、前言 在 Python 編程中&#xff0c;集合&#xff08;set&#xff09;是一種非常實用的數據結構&#xff0c;它能夠存儲一組無序且不重復的元素。集合廣泛應用于數據去重、交并差運算等場景。 本文將重點講解 Python 中集合的創建方式&#xff0c;包括使用大括號 {}、set(…

作物生長模型Oryza V3實戰15:AutoCalibration程序詳解

ORYZA 模型中的 AutoCalibration (v2.1).exe 是用于 ORYZA 模型參數自動校準的可執行程序,在優化 ORYZA 模型參數、提高模型模擬準確性方面具有重要作用。程序能夠通過特定算法,在給定的參數取值范圍內,自動搜索出一組最優的參數組合,使得模型模擬結果與實際觀測數據(如作…

算法-每日一題(DAY12)最長和諧子序列

1.題目鏈接&#xff1a; 594. 最長和諧子序列 - 力扣&#xff08;LeetCode&#xff09; 2.題目描述&#xff1a; 和諧數組是指一個數組里元素的最大值和最小值之間的差別 正好是 1 。 給你一個整數數組 nums &#xff0c;請你在所有可能的 子序列 中找到最長的和諧子序列的…

阿里云-云效自動部署spring boot項目

1.使用云效通過docker自動部署spring boot項目 1.1 spring boot項目配置 # 阿里云的jdk17鏡像 FROM registry.cn-zhangjiakou.aliyuncs.com/publicci/openjdk:17-jdk-alpineENV APP_HOME /home/admin/app/# 將target/arms-application.jar 復制到容器中 /home/admin/app/app.…