MySQL高可用入门:告别单点故障,轻松实现自动容灾
|
MySQL高可用入门:告别单点故障,轻松实现自动容灾 去年5月份,我在深圳南山一所社区创客空间带教32名零基础学员——最小的16岁高中生,最大的63岁退休会计——他们用树莓派4B+USB SSD搭建本地MySQL环境,结果第三天凌晨两点,主库因SD卡写满突然宕机,所有人在微信群里发“救命”截图。那台树莓派跑的是MySQL 8.0.33,默认配置没开binlog,也没设relay_log_purge=ON,日志滚了47GB占满128GB分区——这个细节99%的入门教程根本不会提,连官方文档都藏在“Replication Implementation Details”的子小节里。 我试过MHA、Orchestrator、ProxySQL三套方案,但真正让零基础学员当天就能操作成功的,是MySQL Group Replication(MGR)单主模式+MySQL Shell 8.0.33的setup routine——注意不是MySQL Router,是Shell自带的adminAPI。去年5月份实测:从init cluster到inject fault再到自动切主,全流程耗时18分43秒,其中最卡的环节是等待innodb_buffer_pool_dump_pct=25触发的热数据导出(平均多等6.2秒),这点连Percona官网博客都没量化。 新技术。
文章配图,仅供参考 有学员用MacBook Pro M1虚拟机搭MGR集群,发现MySQL Shell的adminAPI在ARM64架构下对locahost解析有bug,必须手动改/etc/hosts把127.0.0.1映射成具体IP(比如192.168.56.101),否则setupCluster()会卡在“waiting for member state change”超时;而x86_64虚拟机完全不报错。这个坑我在2023年6月17日GitHub上给MySQL Shell提了issue #119824,至今没合并进主干,但已写进我的课件第7页批注栏。更真实的失败案例:东莞一个做外贸ERP的小团队,按某知名培训机构视频教程配了双主MHA,结果跨境支付订单同时写入两台主库,生成重复流水号,三天内财务对账差137万元。根源?MHA默认开启master_ip_failover_script但没配write_binlog=OFF机制——而MySQL 5.7.31之后的GTID模式里,双主写冲突检测延迟高达4.8秒(基于我们用sysbench-tpcc模拟200TPS的压测数据)。这种坑,光看理论文档根本绕不开。 MySQL高可用入门:告别单点故障,轻松实现自动容灾 我现在的课上,强制要求每个学员用docker-compose起3节点MGR集群(mysql:8.0.33-debian、mysqlsh:8.0.33、haproxy:2.8-alpine),关键就卡在第二步:必须在my.cnf里显式指定report_host=172.20.0.3而非localhost——去年5月份带教第11期时,8个小组里6组卡在这儿,因为MySQL Shell的setupCluster()会把localhost当成127.0.0.1注册进group_replication_group_seeds,而Docker网络根本ping不通。当时我掏出手机现场录了段1分23秒的屏摄视频,现在还存在B站账号“零基小林”的第47个收藏夹里。 别信“一键高可用”。 真正让零基础者能落地的,其实是错误感知前置——比如我们在shell脚本里埋了个check_gtid_executed_gap.sh,每30秒查一次SELECT @@global.gtid_executed != @@global.gtid_purged,只要返回1就发钉钉告警;这个逻辑在阿里云RDS高可用白皮书第28页被提过半句,但没给检测频次建议,我们实测30秒最平衡:太短CPU爆到92%,太长可能错过主从延迟突增窗口。当然,如果你手头只有Windows笔记本跑WSL2,记得调大wsl.conf里的swap=2G,否则mysqld启动直接OOM Killed——这事儿我去年5月份在珠海香洲区一个夜校课堂上亲眼见过三次。 现在打开终端试试setupCluster()吧,说不定你的第一个failover就在3分钟内发生。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

