20-在线进行切换
在日常工作下,会需要将现有的主服务器迁移到另外一台服务器上。比如主服务器需要进行硬件升级,主库大表的DDL变更和在线添加索引操作等。MHA提供快速切换和优雅的阻塞写入,这个切换过程只需要0.5~2s的时间,这段时间内数据是无法写入的。在很多情况下, 0.5~2s的阻塞写入是可以接受的。因此切换主服务器不需要计划分配维护时间窗口。
MHA在线切换过程如下:
(1)检测复制设置和确定当前主服务器;
(2)确定新的主服务器;
(3)阻塞写入到当前主服务器;
(4)等待所有从服务器赶上复制;
(5)授予写入到新的主服务器;
(6)重新设置从服务器。
注意,在线切换的时候应用架构需要考虑以下两个问题:
自动识别master和slave的问题(master机器可能会切换),如果采用了VIP的方式,基本上可以解决这个问题;
负载均衡的问题(我们可以定义大概的读写比例,每台机器可承担的负载比例,当有机器离开集群时,需要考虑这个问题)。
为了保证数据完全一致,在最快的时间内完成切换,MHA 的在线切换必须在满足以下条件下才会切换成功,否则会切换失败。
所有slave 的IO线程都在运行。
所有slave的SQL线程都在运行。
所有 slave的 show slave status\G ;的输出中Seconds_Behind_Master参数小于或者等于running_updates_limit 秒,如果在切换过程中不指定 running_updates_limit,那么默认情况下running_updates_limit为1秒。
在 master端,通过 show processlist输出,没有一个更新花费的时间大于 running_updates_limit秒。
在线切换的一般操作步骤如下。
首先,停掉MHA监控:
masterha_stop --conf=/masterha/app1/app1.cnf
其次,进行在线切换操作(模拟在线切换主库操作,原主库ip81变为slave,ip83提升为新的主库):
masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive--new_master_host=192.168.7.83 --new_master_port=3307 --orig_master_is_new_slave--running_updates_limit=10000
最后查看切换过程,执行过程中的输出信息如下:
It is better to execute FLUSH NO_WRITE_TO_BINLOG TABLES on the master before switching. Is it ok to execute on 192.168.7.81(192.168.7.81:3307)? (YES/no): YES
From:
192.168.7.81 (current master)
+--192.168.7.83
+--192.168.7.185
To:
192.168.7.83 (new master)
+--192.168.7.185
+--192.168.7.81
Starting master switch from 192.168.7.81(192.168.7.81:3307) to 192.168.7.83(192.168.7.83:3307)? (yes/NO):
…
其中--orig_master_is_new_slave 的意思是将原master变换成slave,默认MHA下不做上述操作。
在--running_updates_limit切换时,如果原库执行的写入更新操作花费的时间大于默认1秒,或者新的主库和老的主库间存在主从延时的秒数大于默认1秒,那么MHA进行在线切换时将会失败,加上该参数代表,允许在主从延时的时间小于 running_updates_limit 内和主库执行写入SQL大于该参数设定的范围内成功在线切换MHA。