在MySQL复制中有很多种结构,目前只介绍两种(主主,主从),事实上MySQL还有其他拓扑,例如金字塔,主库-分发主库-备库等等。这些拓扑在解决带宽瓶颈表现也非常优秀,这些拓扑结构先略过。今天先讨论一些关于主主拓扑结构和主从拓扑结构切换主库的方式。
一般来说,切换主库的思路就是
先停止主库的写入
备库赶上主库
选择一台备库作为主库
将备库的写操作指向新主库,开启新主库
主从拓扑(计划内切换主库)
停止当前主库上的所有写操作,如果可以,最好能够将所有客户端程序关闭。如果使用虚拟ip,直接关闭所有客户端连接。
通过flush tables with read lock在主库上停止所有的活跃写入,这一步也是可选的。也可以在主库上设置read_only选项。这时候应该禁止向即将被替换的主库写入数据。因为一旦它不是主库,写入就意味着数据丢失。
选择一个备库作为新的主库,并确保他已经完全跟上主库
检查新主库和就主库的数据一致性
在新主库上执行stop slave
在新主库上执行change master to master_host='',然后在执行reset slave;断开与老主库的连接,并丢弃master.info的记录信息。
执行show master status记录新主库的二进制日志位置
确保在其他备库已经刚上了(如果没有赶上,后期操作比较麻烦,需要计算新主库的偏移量)
关闭旧数据库
在MySQL5.1以上的版本中,如果需要,激活新主库上时间。
将客户端连接到新主库
在备库上改变主库的ip。change master to
主从拓扑(计划外切换主库)
找到备库数据最新的服务器。检查每台备库上show slave status命令的输出,选择其中master_log_file/read_master_log_pos的值最新的那个。
让所有备库执行完成所有其从崩溃前的旧主库那获得的中继日志。如果在未完成前修改备库的主库,它会抛弃剩下的日志事件,从而无法获知改备库在上面地方停止。
在新主库上执行stop slave
在新主库上执行change master to master_host='',然后在执行reset slave;断开与老主库的连接,并丢弃master.info的记录信息。
执行show master status记录新主库的二进制日志位置
比较每台备库和新主库上的master_log_file/read_master_log_pos的值。
在MySQL5.1以上的版本中,如果需要,激活新主库上时间。
将客户端连接到新主库
在备库上改变主库的ip。change master to
主主拓扑结构
停止主动服务器上的所有写入
通过flush tables with read lock在主库上停止所有的活跃写入,否则需要kill所有客户端的连接。
在主动服务器上执行show master status,记录二进制偏移量。
使用主动服务器上的二进制日志坐标在移动服务器上执行select master_pos_wait().改语句将阻塞住,知道复制跟上主动服务器。
在被动服务器上执行set global read_only=0,这样就变成主动服务器
修改应用程序的配置,使其写入到新的主动服务器中。
通过以上的对比,可以看出主主结构在切换主库会比主备拓扑结构切换主库方便。因此如果是需要高可用的场景,选择主主拓扑主-被结构(配合keepalive,haproxy or lvs)。如果是需要实现读写分离来提升系统的性能,那么主备拓扑结构是一个很不错的选择(前提是写不是整个架构的瓶颈,因为写容量不能通过复制在提升)