在MySQL生产环境中,遇到维护和极端情况时,进行主从节点的快速且安全的切换,同时确保数据不丢失,是一个至关重要的操作。这样就需要严谨把控各个技术点。
整个切换任务可以遵循以下策略:
1.原主节点无应用操作连接。
- 在进行主从节点切换之前,需要确保所有连接到原主库的应用已经断开连接,以避免在切换过程中发生数据写入操作导致数据不一致。
- 通过设置主库为只读模式来间接实现这一点,虽然这不会强制断开连接,但会阻止新的写入操作。
- 原连接通过数据库命令行来断开所有连接到主节点的会话。
2.切换后验证。包含VIP,只读属性,账号访问权限等。
- 验证VIP(虚拟IP):在主从切换后,需要确保VIP已经正确切换到新的主节点上
- 验证只读属性:如果在切换前将原主节点设置为只读模式,那么在切换后需要验证新主节点是否具有读写权限。
- 验证账号访问权限: 切换后,需要验证用于连接数据库的账号的访问权限是否正确,包括用户名、密码、权限级别等。
3.检查复制状态,切换之后也需要保证高可用场景。
- 检查复制状态:在主从节点切换后,需要使用命令行检查原复制进程是否在运行。
- 保证高可用场景:在切换后,需要确保新的主从节点都具备高可用性,即能够在发生故障时快速切换到备用节点。
4.备份恢复任务的调整。
- 在进行主从节点切换之后,为了不影响生产业务,确保备份任务不在新主节点上。
5.监控配置
- 在进行主从节点切换之后,需要配置好数据库监控工具,能够实时监控数据库的性能和状态。
切换步骤
主从节点的切换可遵循以下步骤。
1.检查配置参数
参数部分基本包含只读属性和MySQL服务自动启动是否启动复制进程。
#主节点设置:
skip_slave_start =ON --禁止从库自动启动
read-only =OFF --取消普通用户只读属性,对于root账号无效,root 账号可进行DML,DDL操作
super_read_only =OFF --取消超级用户只读属性
#从节点
skip_slave_start =ON
read-only =ON
super_read_only =ON
复制
2.切换前确认复制状态和延迟情况
在复制信息中,查看主节点,端口,复制进程运行情况和延迟。
其指标包含:Master_Host, Master_Port, Slave_IO_Running, Slave_SQL_Running, Seconds_Behind_Master
mysql> SHOW SLAVE STATUS \G ; ##从库上执行,主从复制情况
Slave_IO_State: Waiting for master to send event --IO thread的状态
Master_Host: 100.1.1.1 -- 主库的地址
Master_User: repl -- 用于连接主库复制账号(这个账号是在主库上创建)
Slave_IO_Running: Yes -- IO线程是否已启动并已成功连接到主库
Slave_SQL_Running: Yes -- SQL线程是否启动。
Seconds_Behind_Master: 0 -- 主从延迟
复制
备注: 这里需要保证YES状态,延迟基本等于0的情况下,进行切换。
3.检查运行情况
查看当前执行的线程是否存在大事务之类的。还有保留当前切换的时的GTID信息。以便如出现问题,能进行准确的排查。
mysql> SHOW PROCESSLIST; --查看当前进程
mysql> SHOW MASTER STATUS \G ; --主库上执行,查看主库的binlog,position信息
复制
备注: 从节点确保relay log全部落盘到从节点上。
4.进行切换
切换的方式有很多种,可以按照实际情况进行选择。一般常用的方式
1.直接关闭MySQL主节点服务。比较省事,但注意确保不要自动启动即可。
2.存在VIP场景下,进行VIP飘逸。如使用keepalived,主节点priority大于从节点priority,state为BACKUP情况。
3.其他管理组件执行failover操作。
5.切换检查
1)系统层面检查VIP是否进行飘逸,原主和新主都要进行检查,以防止脑裂情况
#Linux下查看IP
shell# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 192.168.122.1/24 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
#原主VIP还存在,很大可能是arp导致。清除命令如下
shell#/sbin/arping -I ens33 -c 5 -s $VIP $GATEWAY &>/dev/null
复制
2)数据库层面检查链接情况
#查看当前进程
mysql> SHOW PROCESSLIST;
#如原主节点,存在大量链接,需要批量KILL掉链接
mysql>SELECT concat('KILL ',id,';') FROM information_schema.processlist
WHERE time>10 and db is not null and command!='sleep' into outfile '/tmp/a.txt';
mysql>SOURCE /tmp/a.txt;
#检查只读属性.如没有设置需要SEG GLOBAL方式设置,同时之前链接会话,要进行KILL操作。
mysql> SHOW VARIABLES LIKE '%READ_ONLY%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| read_only | OFF |
| super_read_only | OFF |
+-----------------------+-------+
2 rows in set (0.00 sec)
复制
3)用户账号链接
使用MySQL客户端连接服务确认是否能正常访问,能显示访问数据库信息。
shell# mysql -h10.10.1.1 -utester -p****** -P3310
复制
到此为止,已完成切换验证。应用可以很好的使用。但还有DBA后续工作。
后续DBA工作
1.新主节点复制通道清理
新主节点停止复制进程。有时大事务会导致复制进程无法停止。需要确认。
mysql> STOP SLAVE;
Query OK, 0 rows affected (0.04 sec)
#确认复制情况,以下两个值 必须达到 NO
mysql> SHOW SLAVE STATUS \G;
Slave_IO_Running: No
Slave_SQL_Running: No
#清除复制进程
mysql> RESET SLAVE FOR CHANNEL '复制频道名称';
复制
2.配置双主
配置双主。这里需要新主保留所有binlog文件条件下,才能成功。
#原主操作,配置主从关系
mysql> CHANGE MASTER TO
MASTER_HOST='100.1.1.2',
MASTER_USER='repl',
MASTER_PASSWORD='******',
MASTER_AUTO_POSITION=1;
Query OK, 0 rows affected (0.05 sec)
mysql> START SLAVE;
Query OK, 0 rows affected (0.04 sec)
#确认复制情况,以下两个值 必须达到 YES
mysql> SHOW SLAVE STATUS \G;
Slave_IO_Running: YES
Slave_SQL_Running: YES
复制
备注: 对于高可用复制关系,这里可以选择两种,一是配置成双主,二是复制通道清理,重新搭建复制通道。
注意事项
- 整个切换过程,应避免原主节点有新数据写入。
- 如设置MySQL的只读属性一定进行检查。
- 对于VIP是否能正常迁移的从库上。需要配置里主库 priority 大于 从库priority,state为BACKUP情况。出现问题,第一时间请确认报错信息 和 相关日志【 mysql-error.log(mysql)信息和 /var/log/messages(keepalived)】
评论

