ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MySQL高可用实战:MHA+GTID集群部署与故障切换全解析

MySQL高可用实战:MHA+GTID集群部署与故障切换全解析 做 MySQL 高可用绕不开一个名字MHA。这套由日本工程师吉川信行在 DeNA 时期开发的方案虽然年头不短但在中小团队和本地化部署场景里依然是出现频率最高的选择。我这次用 MySQL 5.7.44 加 GTID 模式在本地三台服务器上完整落地了一套 MHA 集群从装 MySQL、搭 GTID 主从复制到部署 MHA 的 node 和 manager再到模拟主库宕机、观察自动切换整个过程踩了不少坑也摸清了这套方案的脾气。这篇就把部署流程、配置细节、故障切换的实操记录和踩坑经验都放出来给正准备做 MySQL 高可用的同学一份可以直接照抄的作业。MHA 干的事很直接主库不可用时自动把流量切到数据最新的从库上客户端几乎无感知。GTID 模式则代替了传统 binlog 文件名加 position 的定位方式让复制链路的判断更准确切换更可靠。这套组合在本地实验环境、生产环境都适用适合 DBA、后端开发和运维工程师参考。不管你是第一次接触 MySQL 高可用还是已经在用传统复制想升级改造下面这套流程都能用得上。1. 部署前先想清楚为什么是 MHA GTID1.1 从复制说起GTID 解决了什么问题开始动手之前得先把 GTID 的原理理解到位否则后面配置报错、切换失败时你根本没法定位。传统的主从复制是基于 binlog 的从库要告诉主库“我从哪个位置开始拉”这个位置是文件名加偏移量比如 mysql-bin.000004 的 723 这个坐标。问题在于一主多从的时候每个从库的停留坐标都不一样切换主库时管理员要手动比对每个从库的 binlog 位置挑一个正确的位点再用CHANGE MASTER TO MASTER_LOG_FILE..., MASTER_LOG_POS...去对齐繁琐不说还特别容易出错。我见过不少线上事故就是因为手工算位点算错导致新从库起来后数据错乱。GTIDGlobal Transaction Identifier把这个痛点直接消掉了。每个事务在提交时都会拿到一个全局唯一编号格式是server_uuid:transaction_id比如3e43d5f1-9a2c-11ee-8a2a-525400123456:1-2135其中连字符后面的范围表示已经执行过的连续的 1 到 2135 号事务。这个编号贯穿整个复制链路从库执行事务时会把对应 GTID 记下来主库与从库的对齐就变成了集合运算你有哪些 GTID我有哪些 GTID差哪些就补哪些。MHA 在切换时借助 GTID 判断哪个从库数据最新、切换后如何补齐逻辑一下子简单可靠很多。所以不要只把 GTID 当成一个开关它是整个 MHA 切换准确性的基石。1.2 高可用方案横向对比MHA 凭什么还能打经常有人问官方不是有 Group Replication 和 InnoDB Cluster 吗为什么还用 MHA我的看法是方案没有绝对的好坏只有适不适合。官方方案确实先进自动故障恢复、内置 Router、多主写入听着很棒但在版本兼容、环境要求、运维复杂度上都有门槛对老版本 MySQL 存量环境、对只想快速落地的人来说并不友好。MHA 的优势恰恰在“简单直接”。它不要求改变现有主从架构不引入新的客户端中间件只用一个常驻 manager 进程做监控和切换调度就能在 30 秒以内完成一次主库故障切换实测通常在 10 到 30 秒。它配合半同步复制可以把数据丢失窗口压到极小。我简单横向比过几种方案MMM 的切换脚本维护成本高、脑裂风险大Orchestrator 功能强但要引入外部依赖MGR 对网络抖动敏感所有节点版本必须对齐三台机器加老版本的组合基本不用想。对本地部署、资源有限、要求快速上线的场景MHA 仍然是非常务实的选择这也是它在社区里一直没被淘汰的原因。1.3 本地部署的拓扑规划与资源预算我用的三台 CentOS 7.9 服务器内存 4G、双核构成标准 MHA 拓扑主库 M1、从库 S1、从库 S2manager 进程放在 S1 上没有单独占机器。这种拓扑在资源有限时很常见manager 本身是轻量进程常驻内存不到 100MB放在从库上不影响主库性能也省了一台机器。生产环境条件允许的话还是建议单独一台机器跑 manager避免从库挂掉时 manager 也没了这个风险后面细说。版本方面MySQL 我用 5.7.44这也是 5.7 系列的最后一个大版本很多存量企业都停在这个版本上。MHA 用 0.58 版mha4mysql-node 和 mha4mysql-manager 都是 0.58这是目前最稳定、资料最全的组合。需要提醒的是MySQL 8.0 和 MHA 的兼容性比较一般8.0 的默认认证插件caching_sha2_password和 MHA 的 Perl 连接逻辑有冲突很多部署案例都在这一步卡住我选 5.7 也是求稳。2. 环境准备MySQL 5.7 GTID 主从搭建2.1 基础环境与 MySQL 安装三台节点的规划如下M1 的 IP 是 192.168.1.11S1 是 192.168.1.12S2 是 192.168.1.13VIP 用 192.168.1.100。安装 MySQL 之前先把基础环境整理干净关闭 SELinuxsystemctl stop firewalld或者放行 3306、22 端口然后同步时间。MHA 判断切换依赖时间戳节点间时钟漂移超过几秒就可能在 relay log 补齐阶段出问题所以我会先把 chrony 配好三台机器对同一台时间服务器同步。MySQL 安装方式有很多我这次用的 rpm 包安装5.7.44 的 rpm bundle 解压后按顺序装 common、libs、client、server 这几个包。装完初始化数据目录mysqld --initialize --usermysql会生成一个临时 root 密码在日志里先记下来。启动后第一件事是改 root 密码然后创建两个专用账号复制账号repl权限是REPLICATION SLAVE, REPLICATION CLIENTMHA 监控账号mha这里为了方便直接给了ALL ON *.*。要注意账号的 host 别只写 localhost节点之间要用 IP 互连所以 host 用%或者明确的网段。2.2 关键参数配置与 GTID 模式开启GTID 模式不是改一个参数就完事需要一组参数配合。我的主库和从库在[mysqld]下统一配置了这些参数server-id 1 log-bin mysql-bin log_slave_updates ON gtid_mode ON enforce_gtid_consistency ON binlog_format ROW relay_log relay-bin relay_log_purge 0 skip-name-resolve这里面有四个关键点。第一log_slave_updates必须打开否则从库应用完主库的 binlog 后自己不再产生 binlog后续级联复制和 MHA 判断 GTID 集合都会出问题。第二enforce_gtid_consistency必须打开它禁止执行 GTID 模式下不允许的语句比如CREATE TEMPORARY TABLE和事务中更新非事务表这是保证 GTID 集合一致性的前提。第三relay_log_purge 0是给 MHA 留后路的后面专门讲。第四skip-name-resolve建议打开让 MySQL 直接用 IP 判断客户端来源配合 host 为%的账号最省心。改完配置记得systemctl restart mysqld。GTID 模式从关闭到开启如果库里有历史事务会有gtid_mode只能从 OFF 到 ON 的严格限制需要按 OFF - OFF_PERMISSIVE - ON_PERMISSIVE - ON 的步骤走。我这次三台全是新库直接一步到位没问题但如果你是存量库改造千万别直接在配置里把gtid_modeON一改就重启大概率起不来。2.3 全量初始化与 GTID 主从搭建主从搭建的第一步是让 S1、S2 拿到 M1 的全量数据。最稳妥的方式是逻辑备份加 GTID 自动定位。在 M1 上执行mysqldump --single-transaction --all-databases --master-data2 --set-gtid-purgedON -uroot -p /backup/full.sql--single-transaction在 InnoDB 下用一致性快照不加锁--master-data2会把 binlog 位置信息注释写进备份文件头部方便排查--set-gtid-purgedON是关键它会把主库当前已执行的 GTID 集合以SET GLOBAL.GTID_PURGED...的形式导出从库恢复时就能正确跳过主库已经执行过的事务。把备份文件传到 S1、S2 上用mysql full.sql导入。注意在导入之前从库的 GTID 模式已经开启而且GTID_EXECUTED为空这样导入后系统才会正确设置GTID_PURGED。如果数据量大用mysqldump会慢到怀疑人生这时候可以改用 Percona XtraBackup。xtrabackup --backup --target-dir/backup热备主库再用xtrabackup --prepare应用 redo log最后用xtrabackup --move-back恢复到从库数据目录。恢复完成后从库的xtrabackup_info文件里记录了主库的 GTID 集合启动实例后按这个值设置gtid_purged就行。这个方式对线上大数据量建从库非常实用建议提前练一遍。数据就位后在 S1、S2 上分别执行CHANGE MASTER TO MASTER_HOST192.168.1.11, MASTER_USERrepl, MASTER_PASSWORDyour_pass, MASTER_AUTO_POSITION1; START SLAVE;MASTER_AUTO_POSITION1就是 GTID 复制标志从库会通过 GTID 自动协商位点不再需要手动指定日志文件和偏移量。执行完SHOW SLAVE STATUS\G确认Slave_IO_Running: Yes和Slave_SQL_Running: Yes再看Retrieved_Gtid_Set和Executed_Gtid_Set是否在持续增长基本就成了。2.4 校验复制链路与 relay log 配置复制跑起来之后别急着装 MHA先做一轮完整校验。我会在三台机器上分别执行SHOW MASTER STATUS和SHOW SLAVE STATUS对比Executed_Gtid_Set确保从库集合是主库集合的超集或相等。这里有个容易忽略的细节relay_log_purge我特意设成 0是因为 MHA 切换时要靠 relay log 补数据。如果从库每次应用完中继日志就自动删除主库万一在事务传输到一半时宕机MHA 能用来恢复的增量就丢了。很多生产事故的根因就在这一行参数上默认值是 1MHA 文档也明确要求改成 0。同时我建议顺手把半同步复制开起来。MHA 自己不能保证零丢失半同步可以。主库和从库都安装半同步插件主库设置rpl_semi_sync_master_enabled1从库设置rpl_semi_sync_slave_enabled1然后重启复制线程。开了半同步之后主库提交事务要等至少一个从库确认收到 binlog这样 MHA 切换时就能把丢数据窗口缩到极短。本地部署做高可用这个组合几乎是我固定的配方。INSTALL PLUGIN rpl_semi_sync_master SONAME semisync_master.so; INSTALL PLUGIN rpl_semi_sync_slave SONAME semisync_slave.so; SET GLOBAL rpl_semi_sync_master_enabled 1; SET GLOBAL rpl_semi_sync_slave_enabled 1;3. MHA 组件部署与配置3.1 安装 mha4mysql-node 与 managerMHA 分成两部分node 安装在每一台 MySQL 节点上负责解析 relay log、补数据等底层操作manager 安装一台就够了负责监控和切换调度。两个包都依赖 Perl 环境先装依赖yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes。然后编译安装两个源码包tar -zxf mha4mysql-node-0.58.tar.gz cd mha4mysql-node-0.58 perl Makefile.PL make make install tar -zxf mha4mysql-manager-0.58.tar.gz cd mha4mysql-manager-0.58 perl Makefile.PL make make install编译装完masterha_check_ssh和masterha_manager这些命令就有了默认在/usr/local/bin下。常见的问题是这个目录不在 PATH 里导致后面脚本调用找不到命令我会统一在/etc/profile里加上export PATH$PATH:/usr/local/bin。另外manager 节点在执行切换时会调用mysqlbinlog去解析 binlog所以 MySQL 的 bin 目录也必须能直接访问这个不配好check_repl阶段就会报错。3.2 SSH 免密与故障切换脚本说明MHA 的 manager 要能免密登录所有 MySQL 节点节点之间也要互信因为切换时 manager 会把命令分发到各节点去执行。很多人只做了 manager 到各节点的单向免密结果masterha_check_ssh报错节点间的连接测试过不去。正确做法是每台机器都生成密钥然后互相ssh-copy-id形成三台机器两两互通的信任矩阵。ssh-keygen -t rsa -P -f ~/.ssh/id_rsa ssh-copy-id root192.168.1.11 ssh-copy-id root192.168.1.12 ssh-copy-id root192.168.1.13三台机器都要执行一遍。密钥生成之后重点测试的不仅是免密还有命令执行返回值。MHA 判断 SSH 正常靠的是远端执行命令后返回码为 0。如果远端 shell 里有多余的欢迎信息、或者是登录后自动加载的脚本里输出了一些日志都可能干扰判断。我在.bashrc里特意避免了任何非交互输出之前就见过有人因为echo欢迎语导致 check_ssh 一直报错。3.3 application.cnf 配置详解manager 的所有配置集中在一个配置文件里我放在/etc/mha/app1.cnf。所谓 app1 是集群名可以自定义。配置文件的核心结构如下[server default] manager_workdir/var/log/mha manager_log/var/log/mha/manager.log master_binlog_dir/data/mysql passwordyour_mha_pass usermha ping_interval1 repl_userrepl repl_passwordyour_repl_pass ssh_userroot [server1] hostname192.168.1.11 candidate_master1 [server2] hostname192.168.1.12 candidate_master1 [server3] hostname192.168.1.13 no_master1逐个解释关键参数。user和password是 manager 连接 MySQL 用的账号也就是前面创建的mha用户repl_user和repl_password是切换后让其他从库重新指向新主时用的复制账号。ping_interval1表示每秒对主库做一次健康检查这个值可以调生产环境不建议低于 1否则网络抖动容易误切换。[server1]到[server3]定义了集群拓扑candidate_master1表示这台机器可以成为新主库no_master1表示这台机器永远不当主库。我的设计是 S1、S2 都有资格当新主S3 是纯从库也可以根据业务把不同节点标注成候选主。另外配置文件里的密码有个坑MHA 配置解析对特殊字符敏感密码里如果包含#、空格、%之类的字符可能会有诡异的解析错误建议密码只用字母和数字。还有master_binlog_dir要写 MySQL 实际的 binlog 目录MHA 需要从这里读取 binlog 来补齐数据。3.4 上线前检查check_ssh 与 check_repl启动 manager 之前一定要先跑两个内置检查命令这是所有新手最容易跳过的步骤。第一个是 SSH 检查masterha_check_ssh --conf/etc/mha/app1.cnf正常会输出类似All SSH connection tests passed successfully.的结果。如果输出Connect to 192.168.1.13 fail就回到免密那一步排查。第二个是复制检查masterha_check_repl --conf/etc/mha/app1.cnf这个检查比较重它会验证主库是否存活、从库复制是否正常、GTID 集合是否一致、MHA 账号连接是否通畅。输出里会有一行MySQL Replication Health is OK.看到这行基本可以放心启动 manager 了。我见过check_repl报Cant exec mysqlbinlog: No such file or directory原因就是 manager 节点的 PATH 里找不到 mysqlbinlog把 MySQL bin 目录加进 PATH 再重试就过了。check 通过后启动 managernohup masterha_manager --conf/etc/mha/app1.cnf \ --remove_dead_master_conf --ignore_last_failover \ /var/log/mha/manager.run.log 21 --remove_dead_master_conf表示切换成功后自动从配置里删掉死掉的旧主防止重复误判--ignore_last_failover是忽略上一次切换的时间保护不然刚切完的集群想立刻再验证一次会被 MHA 拦下来默认 8 小时保护期。启动后用masterha_check_status --conf/etc/mha/app1.cnf看状态输出app1 is running.就说明监控已经挂上了。从这一刻起MHA 每秒都在探活主库。4. 故障切换演练实录4.1 模拟主库宕机kill -9 之后发生了什么部署完成的下一步一定是做一次故障演练不然这套高可用就是“纸面 HA”。我在 M1 上直接kill -9杀掉 mysqld 进程模拟最极端的断电场景同时观察 manager 日志。故障发生后MHA 的感知流程大概是这样连续两次 ping 主库失败后判定主库不可用然后从存活的从库中选一个 GTID 集合最新的作为候选新主我这个环境里选中的是 S1。接下来 MHA 会在 S1 上把还没应用的 relay log 补齐在 S2 上做同样的差额应用全部就绪后把 S1 提升为主库再让 S2 指向新的 S1。整个过程日志在/var/log/mha/manager.log里关键标记是Master 192.168.1.11 is down!和New master is 192.168.1.12。从 kill 到新主可用我这次大约耗时 18 秒符合预期。这个速度取决于 relay log 的量、服务器性能和检测间隔。18 秒听起来不长但对业务来说依然是一次短暂中断所以高可用的前提永远是业务侧有重连机制这一点必须跟应用团队提前对齐。4.2 手动恢复演练masterha_master_switch 的使用自动切换验证完成后我建议再做一次平滑的手动切换演练。日常运维里比如主库要换硬件、要升级都需要主动把流量切到另一台机器上这时候用masterha_master_switchmasterha_master_switch --conf/etc/mha/app1.cnf \ --master_statealive --new_master_host192.168.1.12 \ --orig_master_is_new_slave--master_statealive表示旧主还活着是计划内切换--orig_master_is_new_slave表示切换完成后把旧主降级为新主的从库。这个命令会先检查复制延迟延迟过大会要求你追加--running_updates_limit参数意思是如果主库上的更新超过这个秒数还在持续就中止切换。手动切换是低风险的因为 MHA 会一步步确认每个环节不像自动切换那么“决绝”。演练完之后我再用同样的命令把主库切回 M1验证双向切换都正常。4.3 虚拟 IP 漂移与业务接入MHA 本身不提供负载均衡它做的只是把 MySQL 的“身份”切换掉。要让业务无感通常配合虚拟 IP。VIP 的漂移逻辑写在master_ip_failover脚本里这个脚本在切换成功后由 manager 自动调用。脚本核心逻辑很简单从库提升为新主后在新主上执行ip addr add 192.168.1.100/24 dev eth0在旧主上执行ip addr del。这样业务连接串里只需要写 192.168.1.100主库是谁对客户端透明。脚本文件默认路径是/usr/local/bin/master_ip_failover需要从 MHA 的 sample 目录复制出来改成自己的 VIP。注意 MHA 检测“成功执行”靠的是脚本退出码所以脚本里要写好判断逻辑比如 ping 不到 VIP 就返回非 0。脚本执行失败会导致 VIP 不漂移业务继续连旧的死主这是高可用部署里最常见的“切了等于没切”事故。配好脚本后在手动切换演练里顺便验证 VIP 确实从旧主移到了新主这一步要盯着看别只看 MySQL 状态。4.4 故障集群的善后与原主回归演练完成后原主 M1 是死掉的状态。要让集群恢复完整步骤是修复 M1 的 mysqld 进程让它重新启动但此时它已经不是主库了而且它自己的 GTID 集合跟新主会有差异里面有它作为主库时执行过的、但新主可能没有的事务。所以正确的回归方式是把它当作一个全新的从库加入新主。如果 M1 的数据目录还能用且 GTID 集合跟新主有重叠直接在新主上执行CHANGE MASTER TO MASTER_HOST192.168.1.12, MASTER_AUTO_POSITION1; START SLAVE;如果数据目录已经损坏最稳的做法是删掉旧数据目录用新主做一次 XtraBackup 全量恢复再以从库身份加入。这一步务必注意千万不要在原主上执行RESET MASTER或者清空 GTID那会让整个集群的 GTID 集合变得千疮百孔。原主回归并追上复制后把它加回/etc/mha/app1.cnf的[server3]或对应位置再重启 manager 即可。我每次演练完都会重新跑一遍masterha_check_repl确认集群回到完全健康的监控状态。5. 部署中常见问题与排查实录5.1 SSH 检查不通过问题表现为masterha_check_ssh报某个节点连接失败。除了基础免密没做好还有一个隐蔽原因known_hosts 缺失。严格模式下ssh-copy-id会在每台机器上留下指纹记录但如果你重新装过系统、改过 IP旧的指纹会让 SSH 握手失败。解决方法是先删掉~/.ssh/known_hosts里对应 IP 的行重新连接。另外MHA 检查 SSH 用的是 root 用户千万别用普通用户配免密然后企图让 MHA 切到 sudo那样会遇到很多权限边界问题直接把 SSH 互信任配在 root 下最省事。5.2 从库 relay log 无法补齐导致切换失败我遇到过 S2 切换时报relay log apply failed原因是某台从库的relay_log_purge被改回了默认的 1。中继日志被清掉后MHA 在切换时发现 S2 比新主少了某些 GTID 事务而 relay log 里已经找不到这些事务来补齐只能宣告失败整个集群就处于一个“半切不切”的状态后果很严重。所以这个参数一定要在配置里写死并且每次重启 MySQL 后检查一遍。另一个相关坑是 relay log 本身的乱序问题MHA 官方建议在故障排查期间不要做大事务的 relay log 手动清理一旦RESET SLAVE清掉中继日志MHA 的补数机制会直接失效。5.3 GTID 一致性错误与事务跳过GTID 模式下最让人头疼的是复制中途报错比如主库执行了一条在从库上重复键的事务SHOW SLAVE STATUS里显示Last_SQL_Error。传统复制可以靠SET GLOBAL SQL_SLAVE_SKIP_COUNTER1跳过GTID 模式下这招不管用。正确做法是注入一个空事务占位找到报错事务的 GTID在从库上手动执行一遍把 GTID 标记为已执行再继续复制。SET SESSION.GTID_NEXT3e43d5f1-9a2c-11ee-8a2a-525400123456:2136; BEGIN; COMMIT; SET SESSION.GTID_NEXTAUTOMATIC;这只是临时绕过真实业务里必须回到主库去查找为什么会产生重复键否则后面会有更多事务冲突。我见过不少团队用这种方式“跳过”之后主从不一致越来越严重最后只能重新全量同步。这里的原则是空事务只用于明确知道可以跳过的事务任何心存疑虑的报错都优先选择重建从库。5.4 manager 单点与进程守护前面说过 manager 放在从库上省资源但它确实是个单点。manager 进程挂掉后集群不会自动切换故障发现完全停止相当于高可用失效。所以无论如何都要给 manager 加守护我用的是 systemd 服务让masterha_manager常驻crash 后自动拉起。还有一点masterha_manager默认同一时间只允许一个实例工作重复启动第二个会报锁冲突这也避免了两个 manager 同时决策造成脑裂。启动脚本里我加了--remove_dead_master_conf如果切换发生后 manager 再次拉起不会再对着死主做重复动作。5.5 实战避坑清单把能想到的坑集中列一下第一所有节点的 MySQL 版本尽量一致大版本不一致时 GTID 协商和 relay log 解析都可能出问题。第二账号权限宁多勿少MHA 的mha账号我这里给了全部权限因为切换时它可能要在新主上做SET GLOBAL read_only、建账号等操作权限不足会在切换最后一刻才暴露。第三切换前手动检查SHOW SLAVE STATUS的Seconds_Behind_Master延迟过大的从库被选成新主业务会读到严重滞后的数据。第四配置文件和脚本里的密码不要用特殊字符Perl 的解析有时会让你崩溃。第五VIP 最好配在独立网口别名上比如 eth0:1避免和 DHCP 分配的地址冲突。6. 生产环境经验与个人体会6.1 监控告警与日常巡检MHA 能做好自动化切换但前提是你得知道它什么时候切了、为什么切。我目前的做法是manager 机器上配一个定时任务每隔五分钟执行masterha_check_status如果进程不存在就立刻告警到钉钉/企业微信。日志层面MHA 的 manager.log 要接入日志采集重点监控Failover、Master down这类关键字。日常巡检则看三样东西SHOW SLAVE STATUS是否双 Yes、Executed_Gtid_Set是否一致、各节点磁盘空间是否充足。这几样看着基础但几乎每一次故障都跟其中之一有关。6.2 每月一次切换演练的重要性高可用方案最怕的就是“从没切过”。如果只在脑子里觉得它会切那真到故障时刻大概率手忙脚乱。我给自己定了一个习惯每个月的低峰期做一次主动切换演练直接用masterha_master_switch --master_statealive把主库切走再切回来同时记录响应时间。这个习惯帮我提前发现了很多问题比如有一次发现 S2 的 relay log 目录所在磁盘只剩 15% 空间差点在切换时撑爆又有一次发现密码过期策略导致mha账号连接失败。这些坑都是靠演练提前排掉的。6.3 几点个人踩坑体会最后分享几个朴素但重要的体会。第一MHA GTID 这套组合不是我说的“完美方案”它解决的是主库故障自动切换这个核心问题但备份、监控、容量规划这些基础工作一样都不能少MHA 不是替你做这些事的。第二本地部署和生产部署的差距主要在网络环境和硬件上本地演练通过的配置生产还要关注机房网络抖动带来的误切换ping_interval可以根据实际网络质量微调。第三文档和注释写清楚MHA 的配置文件和故障切换脚本我都在头部写了注释包括每个节点的角色、VIP 漂移方式、半同步状态。半年后你再回来看这些配置会感谢当时的自己。这套高可用方案不算新但它足够稳定、足够直观只要把细节都顾到位它依然是 MySQL 主从架构下一道很结实的防线。
返回列表