######################
前提:
1,架构:lvs+kingshard+mysql主从
2,将mysql集群的拓扑结构更改为:旧主库M1<<--新主库M2<<-- 其他从库S1、S2、S3等
一、先将主库设置成只读模式,等新主库完全追上旧主库后,再通过kingshard中间件切换主库:最佳选择方案:优点是简单快速安全:缺点是会有几秒主库不可写:
1,变更kingshard中间件从库的流量:先将中间件配置的从库更换到新主库的所有从库:此时从库就是新主库的所有从库。
2,将旧主库M1配置成只读模式:set global read_only=1; 新主库配置成可读写模式:set global read_only=0; 然后在旧主库上执行show master status\G; 在新主库上执行show slavestatus\G;直到新主库追上旧主库,便可执行下面步骤:
3,变更kingshard中间件的主库流量:将中间件配置的主库更换到新主库:
二、更改旧主库和新主库的步长:其他步骤和一差不多,在步骤2有差异,不同的是,不再将旧主库设置为只读了。优点是主库一直可读写:缺点是麻烦不安全且容易搞出问题:
1,变更kingshard中间件从库的流量:先将中间件配置的从库更换到新主库的所有从库:此时从库就是新主库的所有从库。
2,更改步长:但需要让连接生效:老的连接并不会立马生效,因此需要将sleep的连接杀掉一次:
# ################################
# show variables like '%auto_inc%';
# 旧主库更改为:set global auto_increment_increment=2;set global auto_increment_offset=2;set global read_only=0;
# pt-kill --host=旧主库 --port=3306 --user=UUU --password=XXX --match-command Sleep --kill --victims all --interval 10 --print
# show variables like '%auto_inc%';
################################ 旧主库执行汇总如下:
# set global sync_binlog=1; set global innodb_flush_log_at_trx_commit=1; flush logs; set global long_query_time=0; set global auto_increment_increment=2;set global auto_increment_offset=2;set global read_only=0;
################################### 新主库执行:
# show variables like '%auto_inc%';
# 新主库更改为:set global auto_increment_increment=2;set global auto_increment_offset=1;set global read_only=0;
# pt-kill --host=新主库 --port=3306 --user=UUU --password=XXX --match-command Sleep --kill --victims all --interval 10 --print
# show variables like '%auto_inc%';
################################### 新主库执行汇总:
# set global sync_binlog=1; set global innodb_flush_log_at_trx_commit=1; flush logs;set global auto_increment_increment=2;set global auto_increment_offset=1;set global read_only=0;
3,主从切换。
4,再次更改新主库的步长,恢复原来的步长。
5,执行如下命令让更改步长生效:不然业务那边insert的数据,还是不连续的自增id。目的就是处理自增值offset生效问题。
# flush tables;
# flush logs;
######################