12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
ADADADADAD
mysql数据库 时间:2024-12-03 12:13:38
作者:文/会员上传
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
在日常工作中,会碰到如下的场景,如mysql数据库升级,主服务器硬件升级等,这个时候就需要将写操作切换到另外一台服务器上,那么如何进行在线切换呢?同时,要求切换过程短,对业务的影响
以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。
在日常工作中,会碰到如下的场景,如mysql数据库升级,主服务器硬件升级等,这个时候就需要将写操作切换到另外一台服务器上,那么如何进行在线切换呢?同时,要求切换过程短,对业务的影响比较小。
MHA就提供了这样一种优雅的方式,只会堵塞业务0.5~2s的时间,在这段时间内,业务无法读取和写入。
集群信息
角色 IP地址 ServerID 类型
Master 192.168.244.101 写入
Candicate master 192.168.244.202 读
Slave192.168.244.303 读
Monitor host 192.168.244.40 监控集群组
MHA具体的搭建步骤和原理,可参考另外一篇博客:
MySQL高可用方案MHA的部署和原理
在线切换的步骤
1. 关闭MHA监控
# masterha_stop --conf=/etc/masterha/app1.cnf
2. 在线切换
# /usr/local/bin/masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=192.168.244.20 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
其中,
--orig_master_is_new_slave是将原master切换为新主的slave,默认情况下,是不添加的。
--running_updates_limit默认为1s,即如果主从延迟时间(Seconds_Behind_Master),或master show processlist中dml操作大于1s,则不会执行切换。
在线切换的输出
TueApr::-[]MHA::MasterRotateversion::-[::-[::-[]*Phase::-[::-[warning]Globalconfiguration/etc/::-[]Readingapplicationdefaultconfigurationfrom/etc/masterha/::-[]Readingserverconfigurationfrom/etc/masterha/::-[]GTIDfailovermode=::-[]CurrentAliveMaster:.(.:::-[::-[].(.:)Version=.--bin:enabledTueApr::-[]Replicatingfrom.(.:::-[]Primarycandidate::-[].(.:)Version=.--bin:enabledTueApr::-[]Replicatingfrom.(.:.(:)?(YES/no):yesTueApr::-[]ExecutingFLUSHNO_WRITE_TO_BINLOGTABLES.Thismaytake::-[::-[::-[]Checkingreplicationhealthon.::-[::-[]Checkingreplicationhealthon.::-[::-[].::-[.(.:+--.(.:+--.(.:.(.:+--.(.:+--.(.:.(.:)to.(.:)?(yes/::-[]Checkingwhether.(.:)isok::-[::-[].(.:::-[].(.:::-[]**Phase::-[::-[]*Phase::-[::-[]Executingmasteriponlinechangescripttodisable::-[]/usr/local/bin/master_ip_online_change--command=stop--orig_master_host=.--=.--orig_master_port=--orig_master_user=--orig_master_password=--new_master_host=.--new_master_ip=.--new_master_port=--new_master_user=--new_master_password=--orig_master_ssh_user=root--new_master_ssh_user=root--orig_master_is_new_slaveTueApr::::Setread_only=::::.::-[::-[::-[::-[::-[]Origmasterbinlog:posismysql-bin.:::-[]Waitingtoexecuteallrelaylogson.(.:::-[]master_pos_wait(mysql-bin.:)completedon.(.:).Executed::-[]::-[]GettingnewmasterTueApr::-[]mysql-bin.:::-[=,MASTER_PORT=,MASTER_LOG_FILE=,MASTER_LOG_POS=,MASTER_USER=,MASTER_PASSWORD=;TueApr::-[]Executingmasteriponlinechangescripttoallow::-[]/usr/local/bin/master_ip_online_change--command=start--orig_master_host=.--=.--orig_master_port=--orig_master_user=--orig_master_password=--new_master_host=.--new_master_ip=.--new_master_port=--new_master_user=--new_master_password=--orig_master_ssh_user=root--new_master_ssh_user=root--orig_master_is_new_slaveTueApr::Setread_only=.onthenewmaster:.::-[::-[::-[]*Switchingslaves::-[::-[]--Slaveswitchonhost.(.:)started,pid:::-[::-[]Logmessagesfrom.::-[::-[]Waitingtoexecuteallrelaylogson.(.:::-[]master_pos_wait(mysql-bin.:)completedon.(.:).Executed::-[]::-[]Resettingslave.(.:)andstartingreplicationfromthenewmaster.(.:)..TueApr::-[::-[::-[]Endoflogmessagesfrom.::-[::-[]--Slaveswitchonhost.(.:::-[::-[::-[::-[::-[]Resettingslave.(.:)andstartingreplicationfromthenewmaster.(.:)..TueApr::-[::-[::-[::-[::-[]*Phase::-[::-[].:Resettingslave::-[]Switchingmasterto.(.:)completedsuccessfully.
MHA在线切换的原理
1. 检查当前的配置信息及主从服务器的信息
包括读取MHA的配置文件/etc/masterha/app1.cnf及检查当前slave的健康状态
2. 阻止对当前master的更新
主要通过如下步骤:
1> 等待1.5s($time_until_kill_threads*100ms),等待当前连接断开。
2> 执行read_only=1,阻止新的DML操作
3> 等待0.5s,等待当前DML操作完成。
4> kill掉所有连接。
5> FLUSH NO_WRITE_TO_BINLOG TABLES
6> FLUSH TABLES WITH READ LOCK
3. 等待新master执行完所有的relay log
Waitingtoexecuteallrelaylogson192.168.244.20(192.168.244.20:3306)..
4. 将新master的read_only设置为off,并添加VIP
5. slave切换到新master上。
1> 等待slave(192.168.244.30)应用完原主从复制产生的relay log,然后执行change master操作切换到新master上。
2> 释放原master上加的锁。
3> 因masterha_master_switch命令行中带有--orig_master_is_new_slave参数,故原master也切换为新master的从。
6. 清理新master的相关信息。
主要是执行了reset slave all操作,清除之前的复制信息。
MHA在线切换需满足的条件
MHA在执行在线切换之前,会判断当前的主从复制信息,只有满足了以下条件,才能执行切换动作:
1. 所有SLAVE的IO线程和SQL线程都在运行。
2. 所有slave的Seconds_Behind_Master小于或等于running_updates_limit的值,该参数如果没有显示指定的话,则默认为1s
3. 在master上,通过show processlist输出,没有一个DML操作的时间大于running_updates_limit的值。
在线切换时,打开general log,各个服务器的操作信息
注:在执行masterha_master_switch命令时,会有两次确认操作
1. It is better to execute FLUSH NO_WRITE_TO_BINLOG TABLES on the master before switching. Is it ok to execute on 192.168.244.10(192.168
.244.10:3306)? (YES/no):
2. Starting master switch from 192.168.244.10(192.168.244.10:3306) to 192.168.244.20(192.168.244.20:3306)? (yes/NO):
以下输出中间都有两次空白,其中第一次空白之前的输出对应第一次确认之前,第二次之前的输出对应第二次确认之前。
原master 192.168.244.10
17041216:52:3823Connectmonitor@node4on23Querysetautocommit=123QuerySELECTCONNECTION_ID()ASValue17041216:52:3924Connectmonitor@node4on24Querysetautocommit=124QuerySELECTCONNECTION_ID()ASValue24QuerySETwait_timeout=8640024QuerySELECT@@global.server_idAsValue24QuerySELECTVERSION()ASValue24QuerySELECT@@global.gtid_modeAsValue24QuerySHOWGLOBALVARIABLESLIKE'log_bin'24QuerySHOWMASTERSTATUS24QuerySELECT@@global.datadirASValue24QuerySELECT@@global.slave_parallel_workersASValue24QuerySHOWSLAVESTATUS24QuerySELECT@@global.read_onlyAsValue24QuerySELECT@@global.relay_log_purgeAsValue17041216:54:0624QueryFLUSHNO_WRITE_TO_BINLOGTABLES24QuerySELECTGET_LOCK('MHA_Master_High_Availability_Monitor','0')ASValue24QuerySHOWPROCESSLIST17041216:55:5124QuerySHOWSLAVESTATUS24QueryCHANGEMASTERTOMASTER_HOST='dummy_host'17041216:55:5224QuerySHOWSLAVESTATUS24QueryRESETSLAVE/*!50516ALL*/24QuerySELECTRELEASE_LOCK('MHA_Master_High_Availability_Monitor')AsValue24Quit25Connectmonitor@node4on25Querysetautocommit=125QuerySELECTCONNECTION_ID()ASValue25QuerySETsql_log_bin=025QuerySHOWPROCESSLIST25QuerySELECT@@global.read_onlyAsValue25QuerySETGLOBALread_only=125QuerySELECT@@global.read_onlyAsValue25QuerySHOWPROCESSLIST25QuerySETsql_log_bin=125Quit26Connectmonitor@node4on26Querysetautocommit=126QuerySELECTCONNECTION_ID()ASValue26QuerySETwait_timeout=8640026QueryFLUSHTABLESWITHREADLOCK26QuerySHOWMASTERSTATUS17041216:55:5326QueryUNLOCKTABLES26QueryCHANGEMASTERTOMASTER_HOST='192.168.244.20'MASTER_USER='repl'MASTER_PASSWORD=<secret>MASTER_PORT=3306MASTER_LOG_FILE='mysql-bin.000010'MASTER_LOG_POS=12026QuerySETGLOBALrelay_log_purge=026QuerySTARTSLAVE27ConnectOutrepl@192.168.244.20:330626QuerySHOWSLAVESTATUS26QuerySELECTRELEASE_LOCK('MHA_Master_High_Availability_Failover')AsValue26Quit
新master 192.168.244.20
17041216:52:3823Connectmonitor@node4on23Querysetautocommit=123QuerySELECTCONNECTION_ID()ASValue17041216:52:3924Connectmonitor@node4on24Querysetautocommit=124QuerySELECTCONNECTION_ID()ASValue24QuerySETwait_timeout=8640024QuerySELECT@@global.server_idAsValue24QuerySELECTVERSION()ASValue24QuerySELECT@@global.gtid_modeAsValue24QuerySHOWGLOBALVARIABLESLIKE'log_bin'24QuerySHOWMASTERSTATUS24QuerySELECT@@global.datadirASValue24QuerySELECT@@global.slave_parallel_workersASValue24QuerySHOWSLAVESTATUS24QuerySELECT@@global.read_onlyAsValue24QuerySELECT@@global.relay_log_purgeAsValue24QuerySELECT@@global.relay_log_info_repositoryASValue24QuerySELECT@@global.datadirASValue24QuerySELECT@@global.relay_log_info_fileASValue24QuerySHOWSLAVESTATUS24QuerySELECTRepl_slave_privASValueFROMmysql.userWHEREuser='repl'17041216:54:0624QuerySELECTGET_LOCK('MHA_Master_High_Availability_Failover','0')ASValue24QuerySHOWSLAVESTATUS24QuerySHOWSLAVESTATUS17041216:55:5224QuerySHOWPROCESSLIST25Connectmonitor@node4on25Querysetautocommit=125QuerySELECTCONNECTION_ID()ASValue25QuerySELECT@@global.read_onlyAsValue25QuerySELECT@@global.read_onlyAsValue25Quit24QuerySHOWSLAVESTATUS24QuerySELECTMASTER_POS_WAIT('mysql-bin.000017','120',0)ASResult24QuerySTOPSLAVESQL_THREAD24QuerySHOWSLAVESTATUS24QuerySHOWMASTERSTATUS26Connectmonitor@node4on26Querysetautocommit=126QuerySELECTCONNECTION_ID()ASValue26QuerySETsql_log_bin=026QuerySELECT@@global.read_onlyAsValue26QuerySETGLOBALread_only=026QuerySETsql_log_bin=126Quit24QuerySELECT@@global.read_onlyAsValue27Connectrepl@node3on27QuerySELECTUNIX_TIMESTAMP()27QuerySHOWVARIABLESLIKE'SERVER_ID'27QuerySET@master_heartbeat_period=179999997952027QuerySET@master_binlog_checksum=@@global.binlog_checksum27QuerySELECT@master_binlog_checksum27QuerySELECT@@GLOBAL.GTID_MODE27QuerySHOWVARIABLESLIKE'SERVER_UUID'27QuerySET@slave_uuid='8a1093c8-1d00-11e7-954f-000c299a5715'27BinlogDumpLog:'mysql-bin.000010'Pos:12017041216:55:5328Connectrepl@node1on28QuerySELECTUNIX_TIMESTAMP()28QuerySHOWVARIABLESLIKE'SERVER_ID'28QuerySET@master_heartbeat_period=179999997952028QuerySET@master_binlog_checksum=@@global.binlog_checksum28QuerySELECT@master_binlog_checksum28QuerySELECT@@GLOBAL.GTID_MODE28QuerySHOWVARIABLESLIKE'SERVER_UUID'24QuerySTOPSLAVE28QuerySET@slave_uuid='2a6365e0-1d05-11e7-956d-000c29c64704'28BinlogDumpLog:'mysql-bin.000010'Pos:12024QuerySHOWSLAVESTATUS24QueryRESETSLAVE/*!50516ALL*/24QuerySHOWSLAVESTATUS24QuerySELECTRELEASE_LOCK('MHA_Master_High_Availability_Failover')AsValue24Quit
slave 192.168.244.30
17041216:52:3716Connectmonitor@node4on16Querysetautocommit=116QuerySELECTCONNECTION_ID()ASValue17041216:52:3817Connectmonitor@node4on17Querysetautocommit=117QuerySELECTCONNECTION_ID()ASValue17QuerySETwait_timeout=8640017QuerySELECT@@global.server_idAsValue17QuerySELECTVERSION()ASValue17QuerySELECT@@global.gtid_modeAsValue17QuerySHOWGLOBALVARIABLESLIKE'log_bin'17QuerySHOWMASTERSTATUS17QuerySELECT@@global.datadirASValue17QuerySELECT@@global.slave_parallel_workersASValue17QuerySHOWSLAVESTATUS17QuerySELECT@@global.read_onlyAsValue17QuerySELECT@@global.relay_log_purgeAsValue17QuerySELECT@@global.relay_log_info_repositoryASValue17QuerySELECT@@global.datadirASValue17QuerySELECT@@global.relay_log_info_fileASValue17QuerySHOWSLAVESTATUS17QuerySELECTRepl_slave_privASValueFROMmysql.userWHEREuser='repl'17041216:54:0517QuerySELECTGET_LOCK('MHA_Master_High_Availability_Failover','0')ASValue17QuerySHOWSLAVESTATUS17QuerySHOWSLAVESTATUS17041216:55:5017QuerySHOWSLAVESTATUS17041216:55:5117QuerySHOWSLAVESTATUS17QuerySELECTMASTER_POS_WAIT('mysql-bin.000017','120',0)ASResult17QuerySTOPSLAVESQL_THREAD17QuerySHOWSLAVESTATUS17QuerySTOPSLAVE17QuerySTOPSLAVE17QuerySHOWSLAVESTATUS17QueryRESETSLAVE17QueryCHANGEMASTERTOMASTER_HOST='192.168.244.20'MASTER_USER='repl'MASTER_PASSWORD=<secret>MASTER_PORT=3306MASTER_LOG_FILE='mysql-bin.000010'MASTER_LOG_POS=12017QuerySETGLOBALrelay_log_purge=017QuerySTARTSLAVE18ConnectOutrepl@192.168.244.20:330617QuerySHOWSLAVESTATUS17041216:55:5217QuerySELECTRELEASE_LOCK('MHA_Master_High_Availability_Failover')AsValue17Quit
转自:https://www.cnblogs.com/ivictor/p/6693968.html
11-20
11-19
11-20
11-20
11-20
11-19
11-20
11-20
11-19
11-20
11-19
11-19
11-19
11-19
11-19
11-19