暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

线上环境MySQL 8.0硬件故障导致的主备切换一例

GrowthDBA 2022-02-18
857

已经开工一周了,大家工作状态恢复的怎么样了?反正我的心还有一少部分没有从休假状态里“收”回来,哈哈,你是不是也一样啊

这应该是农历2022年的第一篇文章,开工的这段时间,正好遇到一个MySQL 8.0线上环境因硬件故障导致的主备切换问题。今天这篇文章就来记录一下问题发生后的整个修复思路和过程。Let's GO!

问题定位和环境介绍




故障环境概况及部分参数

发生故障环境的概况如下:
MySQL Version:8.0.21MySQL Port:3386Xtrabackup Version:percona-xtrabackup-8.0.22-15数据同步方式:ROW + GTID + 增强半同步复制高可用架构:Keepalived + M-S(经典常见架构)一些参数配置:binlog_transaction_dependency_tracking = WRITESETtransaction_write_set_extraction = XXHASH64binlog_row_image = MINIMALinnodb_flush_log_at_trx_commit = 2sync_binlog = 0

问题发现与定位

正月十五元宵节15:46 PM,接到一个IO_Thread not running报警

初步判断,主从之间同步出了问题,排除数据库自身问题,第一种可能就是主、从库之间网络通信出现问题,第二种可能就是主库服务器出现问题,总之问题的“症结”就是从库无法与主库正常通信了。熟悉MySQL的小伙伴都知道下面这张图。

这是一张MySQL主从同步原理图,由图可知大概的同步原理是:I/O thread负责接收主库DUMP thread发送过来的binbog,并将其保存至自己的relay-log中,SQL thread再应用relay-log到从库,从而实现同步。因为知道了I/O thread的作用,所以有了上述的初步猜测。
首先,登录到出问题的从库确认一下同步状态:
show slave status\G;

可以看到Slave_IO_Running为Connecting,Last_IO_Error也显示了尝试与主库连接,但无法连接到主库,Retrieved_Gtid_Set、Executed_Gtid_Set一致,表示从库不再继续接受主库的binlog并回放了。至此,应该是主库出了问题。
其次,为保证业务没有出现问题,抓紧确认VIP情况,在从库执行ip a命令后发现,VIP已经漂移到从库上了,从库已经提升为主库开始承载业务,执行命令进行确认。
show master status\G;

接着,尝试连接主库服务器,连不上且ping不通,将机器发给SA(系统工程师)同事帮忙确认机器问题,最终定位:磁盘阵列卡故障(扩展:磁盘阵列卡是用于制作磁盘阵列的硬件设备,阵列卡和磁盘头部都会记录阵列元数据信息,如果阵列卡和磁盘只损坏一方的话,数据是不会丢失的,如果两方都损坏,就会造成数据丢失的情况)。

基于我们的高可用架构:Keepalived + M-S,自VIP漂移到从库,从库提升为主库承载业务的那一刻起,即使原主库数据没有丢失,但原主库已存在的数据也就成了历史数据了,对整个业务来说已经没有意义了。所以,目前的情况就剩下一个单独的新主库承载业务了。接着,需要在新主库(原从库上)执行清空slave信息的操作。

stop slave;reset slave all;

小结

至此,高可用架构在本次故障中生效,VIP漂移的的过程对业务无感知(业务方没有反馈数据库相关问题)。同时,问题定位到的同时也调整了提升为新主库的配置。

但是目前生产环境属于单实例的状态,并非高可用。所以,下一步的工作就是修复高可用架构。




高可用架构重建修复




重建修复高可用架构的思路

Keepalived + M-S的高可用架构组合,一般情况从库只作为备库进行故障时的主备切换使用,不承载任何业务流量。同时从库还有一个更重要的功能就是备份。目前我们的生产环境是每天晚上21点做一次全备。

说明:以下截图涉及的服务器IP信息做了打码脱敏处理。为方便大家区分服务器,截图粉色显示出的部分主机名prod-0001为原主库/高可用架构修复后的新从库,prod-0002为原从库/故障切换后提升为新主库。

因为原主库的数据对业务没有意义了,但新生产库单实例跑不放心,还是以尽快恢复高可用架构为原则,所以直接将前一天晚上的备份恢复到原主库,将原主库拉起成新高可用架构的从库是最快的办法。但是,又遇到了2个问题:

1、原主库硬件故障,无法直接使用。

2、没有相同配置的物理机可以补位,同时重新搭建系统、初始化环境、MySQL、备份软件的安装也需要一定时间。

工作中就是会遇到各种各样的棘手问题。因为没有补位的机器,所以只能等待原主库服务器修复,好在机房那边同事给力,有阵列卡备件,整个机器在2小时内修复了,因为只坏了阵列卡,数据库软件、原主库的数据都在,没有丢失,那这就好办了,节省了初始化环境的时间,下面就抓紧时间恢复数据拉起新从库。(PS:团队的力量是巨大的,出现突发状况时,就会显现出来,每个人都是团队不可或缺的一部分

数据恢复准备工作

因为原主库的binlog是放在datadir下的,为了防止业务侧需要,暂时保留原数据目录。要恢复的目标机器是原主库,未安装xtrabackup、qpress工具,首先安装所需工具,具体过程如下。

# 安装适应MySQL 8.0版本的Xtrabackup工具1、mkdir -p /opt/scripts2、cd /opt/scripts将安装包mysqlbackup8.tar.gz上传至/opt/scripts目录下3、解压:tar -xvf mysqlbackup8.tar.gz# 安装解压备份文件的qpress工具1、cd /root将安装包qpress-11-linux-x64.tar上传至/root2、解压:tar xvf qpress-11-linux-x64.tar3、chmod 775 qpress4、cp qpress /usr/bin

从库备份数据的方式是将备份文件流式存放至中间备机上,且目标新从库磁盘空间有限(需要同时保留了一份原始的数据目录),所以使用挂载中间备机盘符的方式直接进行恢复(中间备机的磁盘空间非常大)。

准备工作完成,下面就正式开始恢复操作。

数据恢复

1、解压备份文件
为了占用较少的中间备机存储空间,备份脚本中,配置了压缩参数,数据恢复时,需要先将备份文件进行解压。
/opt/scripts/mysqlbackup8/percona-xtrabackup-8.0.22-15-Linux-x86_64.glibc2.17-minimal/bin/xtrabackup --defaults-file=/usr/local/mysql3386/etc/my.cnf --decompress --target-dir=/backup

解压中。。。

备份文件解压完成。

2、Prepare。

Xtrabackup备份原理就是拷贝数据文件和追加拷贝redo log的变化写入到xtrabackup_logfile文件中。Prepare步骤就是将以"重做"的方式回放xtrabackup_log日志至备份集(拷贝的数据文件)中,实现数据恢复。

这里需要注意:MySQL 8.0的Xtrabackup工具和MySQL 5.7 xtrabackup-2.4.20工具回放日志命令的差异,MySQL 5.7--apply-logMySQL 8.0--prepare,这个差别需要注意。

回放应用xtrabackup_log中。。。

回放应用xtrabackup_log的过程也会有进度百分比显示,之前MySQL 5.7版本好像没有。

继续回放应用xtrabackup_log。。。

Prepare过程完成。
3、Copy-Back。
经过前两步骤的“折腾”准备,最后得到的就是当时做备份时完整的数据文件,最后一步就是将恢复的完整文件拷贝到要还原的目标服务器datadir即可。
(1)确保MySQL实例是停止状态。
/etc/init.d/mysql3386 stop

(2)因为恢复过程要求必须保证原始目录不存在&无数据且我们要保留原始的数据和binlog,所以,将原datadir重命名留存。
cd /mysql/ls -almv mysql3386 mysql3306_bak`date +%Y-%m-%d_%H-%M-%S`ls -al

(3)copy-back拷贝备份目录成为新的datadir。

拷贝中。。。

拷贝完成。
(4)将新的datadir赋予mysql.mysql属主和属组。
chown -R mysql:mysql /mysql/mysql3386

备份文件恢复到的新datadir目录中,还存在一个Xtrabackup工具记录的文件,里面留存着备份时的一些信息可供查看。
cat /mysql/mysql3386/xtrabackup_info

至此,数据恢复工作完成。

高可用架构的恢复

1、启动实例。

因为原主库服务器数据未发生丢失,但是,在启动MySQL实例前,还是需要仔细检查my.cnf等各种检查项(如新主库同步账户&权限、新从库的server-id是否和新主库冲突、是否需要设置skip-start-slave、各参数配置项等)。确认无误后,启动实例:

/etc/init.d/mysql3386 start

2、搭建新主从。

将刚恢复的新从库实例指向新主库,搭建新的主从关系。(因为我们使用的是ROW+GTID的同步方式,所以直接指定master_auto_position=1让MySQL自己识别同步信息吧

stop slave;CHANGE MASTER TO MASTER_HOST='xx.x.xxx.xx',MASTER_USER='repl',MASTER_PASSWORD='xxxxxxxx',MASTER_PORT=3386,master_auto_position=1;start slave;

查看一下同步状态:

show slave status\G;

嗯,不错,同步状态正常,从库开始接收、回放主库的binlog event了。
“延迟,延迟毕竟还是要有的,等、等、等......让延迟追一会。”——张路路
过段时间再查看一下同步状态:
show slave status\G;

你看,这才是同步该有的样子吗!~
3、恢复新从库的Keepalived。
确保新从库的Keepalived配置文件没有问题(重点关注nopreempt配置-不抢占模式和权重),就可以将Keepalived服务启动起来了。
启动Keepalived服务并检查、防止VIP发生抢占。
systemctl start keepalivedps -ef | grep keepalivedip a

从库Keepalived服务、IP正常,未发生抢占问题,再检查一下主库。

主库Keepalived服务、VIP、IP都正常。

4、收尾工作。

因为原来的主库成为新架构的从库了,所以配置好备份&定时任务,保险起见,临时做一次备份保证备份相关配置正确。

/opt/scripts/mysqlbackup8/mysqlbackup8.sh mysqlbackup8 fullcrontab -lmore /backup/backup_result.log

临时备份执行成功。
至此,所有的工作大功告成


小结




以上就是今天的全部内容了,本文也说明了备份和高可用架构的重要性。不管是高可用架构还是备份,都是为了预防突发情况下数据库层面对业务造成的影响,我们的职责就是在发生突发情况时,保质保量、高效地对数据库层面故障进行修复,尽量不影响、减少对业务的冲击。

Keepalived + M-S的高可用架构是一种比较简单、常见且易维护的架构,也存在缺陷和弊端,如果业务允许,可以使用Keepalived + M-M的架构,但是,世上没有完美的事物(包括高可用架构),如MHA、MGR也都同样存在不足。同时,公司会出于成本、业务可承受风险范围等因素的考虑,也会对高可用架构进行评估选型。虽然没有完美的高可用架构,但是在能满足公司业务、自己技术能力可达的前提下,选择最适合自己的高可用架构就好,没有必要争取更高的技术,维稳才是王道。

最后,最为重要的还是部门同事间的团队协作。如果没有补位机器、没有同事配合,自己单打独斗的情况下,就会拖慢整个修复进程。正因有我们系统工程师、机房同事的相互配合,才有了高效率的修复过程。

又是收获满满的一天,每天进步一点点。大道至简,贵在坚持,与君共勉!~



扫描二维码关注

获取更多精彩

GrowthDBA


end


文章转载自 GrowthDBA,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论