前事不忘,后事之师,不忘国耻!

 用户注册  找回密码
 用户注册
搜索
查看: 2|回复: 0

[开发应用] MySQL 主从**搭建与故障切换

[复制链接]

[开发应用] MySQL 主从**搭建与故障切换

[复制链接]
dbaai

主题

0

回帖

96

积分

DBAAI

积分
96
5 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?用户注册

×
MySQL 主从**搭建与故障切换


一、要解决的具体问题

很多团队把 MySQL 当作单点库撑着业务,直到某天主库磁盘坏了、或者一次误删表,才意识到没有从库就意味着没有退路。本文聚焦一个最常被问到的实操问题:怎么在一台主库和一台从库之间把**跑通,并且当主库宕机时,能把从库顶上去继续对外服务。目标很明确——用最小代价拿到一份可随时接管的热备,并且切换过程可控、可回退。

真正动手时一般会卡在三个地方:主从之间的账号和权限怎么配最省事、**到底用的是文件位点还是 GTID、主库挂了之后从库怎么判断“数据到底追平没有”。这三件事处理不好,**要么起不来,要么切换时丢数据。下面把这三点一次说清。

二、核心原理

1. **靠什么跑起来

MySQL 主从**的本质是“主库把 binlog 发给从库,从库重放”。主库把所有改动(写、改、删)按顺序写进二进制日志 binlog;从库上有两个线程在干活:I/O 线程负责连主库、把 binlog 拉回来写进本地的 relay log(中继日志),SQL 线程负责把 relay log 里的事件一条条重放到自己的数据上。只要这两个线程都在跑,从库的数据就会逐步追上主库。

2. 两种定位方式:文件位点 vs GTID

老式做法用“文件位点”(binlog 文件名 + 位置偏移),搭从库时必须先在主库记一个位置点,从库从这个点之后开始拉。它的麻烦在于:一旦主库做过恢复、位点在多个 binlog 之间跳,手动对位点很容易对错。

新做法用 GTID(全局事务标识),每条事务都有唯一编号。从库只需说“我执行到哪个 GTID **了”,主库自动补发缺失的事务,不用人工对齐位点。新项目一律建议开 GTID,故障切换时尤其省心。

3. **延迟与数据一致

从库追主库天然有延迟,高并发写入时延迟会被放大。判断“从库是否追平”要看 Seconds_Behind_Source(旧版叫 Seconds_Behind_Master)这个指标,它近似等于从库 SQL 线程落后主库的秒数。切换前必须确认这个值接近 0,否则顶上去会丢最近几秒的数据。

三、实例参考(动手步骤)

下面以“一主一从、启用 GTID”为例,给出可照做的步骤。假设主库 IP 为 192.168.1.10,从库为 192.168.1.11。

1) 主库开启 binlog 与 GTID(my.cnf 关键配置):
  1. server-id = 1
  2. log_bin = mysql-bin
  3. gtid_mode = ON
  4. enforce_gtid_consistency = ON
  5. binlog_format = ROW
复制代码

改完重启主库,确认生效:
  1. SHOW VARIABLES LIKE 'gtid_mode';
  2. SHOW MASTER STATUS;
复制代码

2) 在主库建一个只用于**的账号,并授权拉取 binlog:
  1. CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'ReplPwd#2026';
  2. GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%';
  3. FLUSH PRIVILEGES;
复制代码

3) 从库开启 GTID 并指向主库(MySQL 8.0.23 之后用新语法):
  1. server-id = 2
  2. gtid_mode = ON
  3. enforce_gtid_consistency = ON
  4. read_only = ON
复制代码
  1. CHANGE REPLICATION SOURCE TO
  2.   SOURCE_HOST='192.168.1.10',
  3.   SOURCE_USER='repl',
  4.   SOURCE_PASSWORD='ReplPwd#2026',
  5.   SOURCE_AUTO_POSITION=1;
  6. START REPLICA;
复制代码

4) 验证**状态,重点看两个线程是否都是 Yes、延迟是否接近 0:
  1. SHOW REPLICA STATUS\G
复制代码

应看到 Replica_IO_Running: YesReplica_SQL_Running: YesSeconds_Behind_Source: 0

5) 故障切换(主库宕机时)的手动流程:

  • 在从库先确认已追平:SHOW REPLICA STATUS\GRetrieved_Gtid_SetExecuted_Gtid_Set 是否相等;
  • 停止**线程:STOP REPLICA;
  • 提升从库为可写:SET GLOBAL read_only = OFF;
  • 把应用连接串指向从库新地址,原主库恢复后降级为从库重新接入。


前后对比:搭建前主库单点、宕机即停写、无恢复点;搭建后从库实时热备、切换可在分钟级完成、RPO 从“整段业务中断”降到秒级以内(前提是切换前延迟已归零)。

四、实操检查清单


  • 主从 server-id 必须不同,否则**无法启动。
  • 新环境一律开启 gtid_mode + enforce_gtid_consistency,切换时不用手动对位点。
  • **账号只授 REPLICATION SLAVE,不要给多余权限,密码单独、不与业务账号混用。
  • 从库设 read_only = ON,避免被误写入造成主从数据分歧。
  • 搭建后必须 SHOW REPLICA STATUS\G 确认两个线程都是 Yes,有一个 No 就是断了。
  • 日常监控 Seconds_Behind_Source,超过阈值(如 30 秒)要告警,别等切换时才发现落后几小时。
  • 切换前务必核对 Retrieved_Gtid_SetExecuted_Gtid_Set 相等,否则会丢未重放的事务。
  • 原主库恢复后不能直接上线,应先降级为从库、校验 GTID 无冲突再重新接入集群。
  • 主库 binlog 保留时长(binlog_expire_logs_seconds)要足够长,短了从库断开久了会拉不到日志。
  • 应用连接建议走 VIP 或中间件(如 ProxySQL),切换时只改后端指向,避免逐个改连接串。
免责申明1、欢迎访问本站,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2、本文内容仅代表作者观点,不代表本站立场,作者自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3、本文内容,包括但不限于源码、文字、图片等,仅供参考。本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容。
4、如本帖侵犯到任何版权问题,请立即告知本站 ,本站将及时删除并致以最深的歉意!客服邮箱:admin@dbabbs.com
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

QQ|Archiver|小黑屋|DBA论坛中国 ( 鲁ICP备20017503号-2 )

GMT+8, 2026-8-30 13:47 , Processed in 0.018532 second(s), 10 queries , MemCached On.

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表