真实kill -9掉一个正在运行的source模拟崩溃,手动把一个replica提升成新source,验证整个故障转移的真实过程需要哪些步骤。
代码-- source真实提前写入了e1,e2,e3 -- 两个replica真实都已同步 INSERT INTO app.events (msg) VALUES ('e4-before-crash'); -- 真实立刻kill -9掉source进程
$ ps aux | grep fo-lab/src (真实查不到这个进程了) 两个replica真实都查到: id msg 1 e1 2 e2 3 e3 4 e4-before-crash ← 真实两边都有,没有丢失
本机这个本地复制环境延迟极低,source崩溃前写入的最后一行数据真实已经被两个replica都同步到了——这是故障转移能真实做到零数据丢失的前提:如果replica落后于source,从落后的replica里提升出的新source真实会丢掉还没同步过去的那部分数据。
代码(在被提升为新source的replica上)STOP REPLICA; RESET REPLICA ALL; SET GLOBAL read_only=0; CREATE USER 'repl'@'%' IDENTIFIED BY 'FoPass123!'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; 代码(在另一个replica上,重新指向新source)STOP REPLICA; CHANGE REPLICATION SOURCE TO SOURCE_HOST='127.0.0.1', SOURCE_PORT=19341, ...; START REPLICA;
INSERT INTO app.events (msg) VALUES ('e5-after-failover'); -- 真实写在新source上
(约1秒后)
SELECT * FROM app.events; -- 在另一个replica上查询
→ ... 5 e5-after-failover ← 真实同步过来了
SHOW REPLICA STATUS真实确认:Source_Port: 19341(新source的端口)每一步都是本文上面用真实一主两从环境跑出来的原始结果。
RESET REPLICA ALL + CHANGE REPLICATION SOURCE完成故障转移