master存活的狀態下切換
masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=192.168.0.101 --orig_master_is_new_slave --running_updates_limit=1000
不出意外的情況下,會報下面的錯誤:

查看源代碼:

在新master上獲取正在執行的進程,也就是show processlist操作。並且將獲取到的processlist信息進行分析判斷,如果新master當前還存在binlog dump或binlog dump gtid進程等,則無法切換。

源碼 DBHelper.pm片段

報錯的原因是切換成功后,原master變成了slave,而新slave上的binlog dump gtid線程並沒有沒停掉,理論上切換成功后,由於角色的轉換,原master變成slave,binlog dump gtid進程應該停止運行的,為什么沒有被停止掉呢?


查看新master上的報錯日志。

連接丟失,原來是連接丟失導致slave沒接收到信號,所以進程沒有被停掉。
該問題可以通過配置主從同步心跳檢測時間來提前觸發主從檢測,從而達到slave上的binlog dump gtid進程提前停止。系統默認主從檢測時間是3600S。
配置如下,在可能會成為master的slave上執行
stop slave;
change master to master_heartbeat_period = 10;
set global slave_net_timeout = 25;
start slave;
change master to master_heartbeat_period = 10;
set global slave_net_timeout = 25;
start slave;
在當前主上執行
change master to master_heartbeat_period = 10;
set global slave_net_timeout = 25;
set global slave_net_timeout = 25;
可以直接配置在配置文件中
slave_net_timeout = 25
再次手動切主的時候就發現binlog dump gtid進程很快就被清理了,也不會報錯了。
