mysql 主从架构详解
MySQL 主从架构详解MySQL 主从复制Master-Slave Replication是构建高可用、可扩展数据库系统的核心架构之一。它通过将主数据库Master的变更同步到从数据库Slave实现数据冗余、读写分离和故障恢复。本文将从原理、配置、实战代码和常见问题入手带你深入理解这一架构。## 主从复制的原理MySQL 主从复制基于**二进制日志binlog**机制。主库的所有数据变更如 INSERT、UPDATE、DELETE会记录在 binlog 中从库通过 I/O 线程拉取这些日志并写入中继日志relay log再由 SQL 线程重放从而保持数据一致。关键组件-Master开启 binlog授权复制用户。-Slave配置连接 Master 的信息启动复制线程。-I/O 线程从 Master 拉取 binlog 事件。-SQL 线程执行 relay log 中的 SQL 语句。工作流程1. Master 将数据变更写入 binlog。2. Slave 的 I/O 线程连接到 Master请求 binlog 事件。3. Master 的 dump 线程发送 binlog 给 Slave。4. Slave 将事件写入 relay log。5. Slave 的 SQL 线程重放 relay log更新本地数据。## 配置主从复制### 前提条件- 安装 MySQL 8.0示例使用 Docker 环境。- 确保主从库网络互通本文在同一台机器上演示使用不同端口。### 主库配置 (Master)主库需要开启 binlog 并设置唯一 server-id。以下为 Linux 环境下的配置示例。bash# 编辑主库配置文件 /etc/mysql/mysql.conf.d/mysqld.cnf[mysqld]# 开启二进制日志log_bin /var/log/mysql/mysql-bin.log# 设置服务器 ID主库唯一server-id 1# 指定要复制的数据库可选留空表示所有库binlog-do-db test_db# 二进制日志格式ROW 比 STATEMENT 更可靠binlog_format ROW# 每执行 N 次事务写一次 binlog提升性能sync_binlog 1重启 MySQL 后进入主库创建复制用户sql-- 登录主库mysql -u root -p-- 创建用户仅允许从库 IP本例为 192.168.1.100连接CREATE USER replicator192.168.1.100 IDENTIFIED BY StrongPassword123!;-- 授予复制权限GRANT REPLICATION SLAVE ON *.* TO replicator192.168.1.100;-- 刷新权限FLUSH PRIVILEGES;-- 查看主库状态记录 File 和 Position 值SHOW MASTER STATUS;输出示例------------------------------------------------------------| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |------------------------------------------------------------| mysql-bin.000003 | 154 | test_db | |------------------------------------------------------------### 从库配置 (Slave)从库需要设置不同的 server-id并指定主库信息。bash# 编辑从库配置文件[mysqld]server-id 2# 开启中继日志relay_log /var/log/mysql/mysql-relay-bin.log# 只读模式避免从库写入冲突read_only 1# 可选设置复制过滤replicate-do-db test_db重启从库后执行以下 SQL 建立复制链路sql-- 登录从库mysql -u root -p-- 停止已有的复制如果有STOP SLAVE;-- 配置连接主库的信息CHANGE MASTER TO MASTER_HOST 192.168.1.100, MASTER_PORT 3306, MASTER_USER replicator, MASTER_PASSWORD StrongPassword123!, -- 使用前面 SHOW MASTER STATUS 得到的值 MASTER_LOG_FILE mysql-bin.000003, MASTER_LOG_POS 154;-- 启动复制START SLAVE;-- 查看复制状态SHOW SLAVE STATUS\G;关键字段解释-Slave_IO_Running: YesI/O 线程正常-Slave_SQL_Running: YesSQL 线程正常-Seconds_Behind_Master: 0延迟为 0## 实战代码读写分离演示以下 Python 脚本演示了在主库写入数据并在从库读取。假设主库连接为localhost:3307从库为localhost:3308通过不同端口模拟不同机器。pythonimport mysql.connectorfrom mysql.connector import Error# 主库连接配置写操作master_config { host: localhost, port: 3307, user: root, password: root_password, database: test_db}# 从库连接配置读操作slave_config { host: localhost, port: 3308, user: root, password: root_password, database: test_db}def write_to_master(): 在主库插入数据 try: conn mysql.connector.connect(**master_config) cursor conn.cursor() # 创建表如果不存在 cursor.execute( CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), email VARCHAR(100) ) ) # 插入一条记录 sql INSERT INTO users (name, email) VALUES (%s, %s) cursor.execute(sql, (Alice, aliceexample.com)) conn.commit() print(f写入成功记录 ID: {cursor.lastrowid}) except Error as e: print(f写入错误: {e}) finally: if conn.is_connected(): cursor.close() conn.close()def read_from_slave(): 从从库读取数据 try: conn mysql.connector.connect(**slave_config) cursor conn.cursor() cursor.execute(SELECT * FROM users) rows cursor.fetchall() print(从库读取结果:) for row in rows: print(row) except Error as e: print(f读取错误: {e}) finally: if conn.is_connected(): cursor.close() conn.close()if __name__ __main__: # 先写入主库 write_to_master() # 等待复制完成实际环境可用轮询 import time time.sleep(1) # 从从库读取 read_from_slave()### 复制延迟监控脚本以下 Shell 脚本定期检查从库延迟并在延迟过大时告警。bash#!/bin/bash# 监控 MySQL 主从复制延迟# 用法: ./monitor_replication.shSLAVE_HOSTlocalhostSLAVE_PORT3308SLAVE_USERrootSLAVE_PASSroot_password# 获取 Seconds_Behind_Master 值LAG$(mysql -h $SLAVE_HOST -P $SLAVE_PORT -u $SLAVE_USER -p$SLAVE_PASS -e SHOW SLAVE STATUS\G | grep Seconds_Behind_Master | awk {print $2})if [[ $LAG NULL ]]; then echo 错误: 复制未启动或状态异常 exit 1fiif [[ $LAG -gt 60 ]]; then echo 警告: 复制延迟超过 60 秒当前延迟: ${LAG}秒 # 可在此处发送邮件或短信告警else echo 正常: 复制延迟 ${LAG}秒fi## 常见问题与优化### 1. 复制中断-IO 线程 No检查网络、防火墙、复制用户权限。-SQL 线程 No查看Last_Error字段可能是主从数据不一致如主库有记录从库没有。可跳过错 误SET GLOBAL SQL_SLAVE_SKIP_COUNTER 1; START SLAVE;### 2. 延迟优化- 使用半同步复制rpl_semi_sync_master_enabled1。- 从库开启log_slave_updates用于级联复制。- 调整innodb_flush_log_at_trx_commit和sync_binlog参数。### 3. 安全性- 使用 SSL 加密复制链路。- 从库设置read_only1避免误写。- 定期备份 binlog 文件。## 总结MySQL 主从复制是保障数据库可用性和扩展性的基石。通过本文的配置演示和实战代码你可以在几分钟内搭建起一套基本的主从架构。关键点包括正确配置 binlog 和 server-id、使用正确的位置参数建立复制、通过监控脚本持续关注延迟。在生产环境中建议结合半同步复制、GTID全局事务标识符和自动故障切换工具如 Orchestrator来进一步提升可靠性。掌握这些技能你将能应对大多数数据库高可用场景。

相关新闻

5步解锁:Input Overlay让直播操作可视化成为新常态

5步解锁:Input Overlay让直播操作可视化成为新常态

5步解锁:Input Overlay让直播操作可视化成为新常态 【免费下载链接】input-overlay Show keyboard, gamepad and mouse input on stream 项目地址: https://gitcode.com/gh_mirrors/in/input-overlay 你是否曾因为观众看不懂你的操作而烦恼?在激烈…

2026/10/11 17:33:57 阅读更多 →
7天实现数据治理自动化:OpenMetadata策略引擎终极实战指南

7天实现数据治理自动化:OpenMetadata策略引擎终极实战指南

7天实现数据治理自动化:OpenMetadata策略引擎终极实战指南 【免费下载链接】OpenMetadata The Open Context Layer for Data and AI , OpenMetadata is the open platform for building trusted data context and business semantics for humans, AI assistants, an…

2026/10/11 8:13:03 阅读更多 →
如何快速掌握BepInEx:Unity游戏插件框架的完整使用指南

如何快速掌握BepInEx:Unity游戏插件框架的完整使用指南

如何快速掌握BepInEx:Unity游戏插件框架的完整使用指南 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 想要为心爱的Unity游戏添加新功能、修复Bug或创造全新体验吗&am…

2026/10/9 17:39:23 阅读更多 →

最新新闻

Pylint 的 bad-string-format-type(E1307):旧式 `%` 格式化参数类型不匹配检查完全指南

Pylint 的 bad-string-format-type(E1307):旧式 `%` 格式化参数类型不匹配检查完全指南

静态分析代码质量Lint开发工具 【免费下载链接】pylint Its not just a linter that annoys you! 项目地址: https://gitcode.com/gh_mirrors/pyl/pylint 点击查看 免费下载 导读 bad-string-format-type(消息编号 E1307)是 Pylint 中用于检…

2026/10/12 5:18:06 阅读更多 →
Devtron 全局插件创建全流程指南:从 plugin_metadata 到步骤条件的 7 步 SQL 实操

Devtron 全局插件创建全流程指南:从 plugin_metadata 到步骤条件的 7 步 SQL 实操

云原生DevOps运维 【免费下载链接】devtron The only Kubernetes dashboard you need 项目地址: https://gitcode.com/gh_mirrors/dev/devtron 点击查看 免费下载 Devtron 的全局插件(Global Plugin)体系允许开发者以纯 SQL 的方式在数据库中…

2026/10/12 5:18:06 阅读更多 →
AI资讯聚合系统实战:从信息源管理到自动摘要的完整链路

AI资讯聚合系统实战:从信息源管理到自动摘要的完整链路

1. 当"日报"变成一种产品:AI资讯聚合的底层逻辑做AI资讯聚合这件事,我前前后后折腾了快两年。最早只是给自己用——每天要刷十几个信息源,论文、模型发布、开源项目、行业动态,刷完一圈两个小时没了,效率极低…

2026/10/12 5:18:06 阅读更多 →
Nextcloud Android 导航重构实战:将 DrawerActivity 页面平滑迁移到 NavigatorActivity + Fragment 架构

Nextcloud Android 导航重构实战:将 DrawerActivity 页面平滑迁移到 NavigatorActivity + Fragment 架构

移动开发企业应用 【免费下载链接】android 📱 Nextcloud Android app 项目地址: https://gitcode.com/gh_mirrors/andr/android 点击查看 免费下载 本篇技术指南基于 Nextcloud Android 客户端仓库(.claude/skills/android-activity-to-nav…

2026/10/12 5:18:06 阅读更多 →
mlpack 嵌入式交叉编译环境搭建:supported_boards 支持的架构清单与工具链配置指南

mlpack 嵌入式交叉编译环境搭建:supported_boards 支持的架构清单与工具链配置指南

人工智能机器学习深度学习 【免费下载链接】mlpack mlpack: a fast, header-only C machine learning library 项目地址: https://gitcode.com/gh_mirrors/ml/mlpack 点击查看 免费下载 mlpack 是一个以效率为核心、header-only 设计的 C 机器学习库,非…

2026/10/12 5:18:06 阅读更多 →
测试工程师转型AI数据治理:从缺陷猎人到数据架构师

测试工程师转型AI数据治理:从缺陷猎人到数据架构师

我刚做测试那几年,最上头的不是点按钮找 bug,而是盯着一套接口设计图想“这里到底谁能把它弄坏”。那种感觉就像追一部有瑕疵的侦探剧,提前锁定凶手。后来团队里一位做平台架构的同事半开玩笑说:你有这种“总想证明系统有罪”的毛…

2026/10/12 5:17:06 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →