MySQL不停机主从部署
- 引言
- 搭建数据库
- 备份主库数据——XtraBackup工具
- 安装
- 制作全量备份
- 从库恢复全量备份数据
- 设置主从
- 主库操作
- 获取binlog和pos位置
- 从库
引言
在日常开发中,MySQL数据库的使用非常频繁。在MySQL的使用过程中,我们需要面对两个方面的问题:
- 性能问题
- 容灾问题
性能问题指的是随着应用、并发量的增加,原本的一个数据库无法再承受更多的连接和访问,因此需要使用从库,以减轻主库的负载。
容灾问题指的是在极端情况下,主库可能崩溃、无法访问、数据盘异常等等,因此需要从库,用于应对主库发生异常的情形。
以上两个问题可以通过主从部署的方式解决,本文则介绍一种主库不停机、应用正常访问的主从部署方案。
搭建数据库
我们的从库还没搭建,下面先介绍搭建从库的过程。
- 首先进入MySQL下载地址,我使用的是centos,因此下载的是rpm的包。
- 安装:
yum -y install mysql*.rpm
- 启动:
systemctl start mysqld.service
或service mysqld start
- 查看运行状态:
systemctl status mysqld.service
或service mysqld status
,可以看到绿色的Running状态,表示正常运行。 - 查看初始化root用户密码:
grep "password" /var/log/mysqld.log
,使用该密码进入数据库。 - 进入数据库后必须修改密码才能操作:
ALTER USER 'root'@'localhost' IDENTIFIEDBY 'password'
,此时执行其他操作会失败。 - 自此,我们的数据库就搭建好了。
备份主库数据——XtraBackup工具
安装
- 首先在XtraBackup官网下载对应版本的rpm包,注意MySQL5.x,需要安装2.4及以下版本,高版本的MySQL可以安装高版本的XtraBackup。
- 依赖包安装:
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
yum -y install rsync perl l perl-Digest-MD5
rpm -ivh libev-4.15-1.el7.rf.x86_64.rpm
然后安装XtraBackup:rpm -ivh percona-xtrabackup-*.rpm
制作全量备份
执行以下命令:
innobackupex --defaults-file="/etc/my.cnf" --user=root --password='password' --stream tar --socket=/var/lib/mysql/mysql.sock /var/lib/mysqlBackup 2>backup.log |gzip >dbbackup.tar.gz
该命令同样可用于数据库的定时备份。
从库恢复全量备份数据
将全量备份到从库机器上,执行tar -xzf dbbackup.tar.gz
命令解压备份。该命令会把压缩包的内容全部解压到当前目录,建议先mkdir
再执行。
重要!!! 先将从库设置为只读,设置/etc/my.cnf
中read_only = 1
即可,否则可能导致数据不一致,影响从库恢复效果。
接下来正式开始执行从库的恢复过程:
- 执行
innobackupex --apply-log /home/nfuser/dbbackup/
命令,将数据整理成MySQL可用的文件。 - 执行
innobackupex --copy-back /home/nfuser/dbbackup/
命令恢复备份的数据,执行该命令不需要关闭数据库,但需要保证数据库目录为空,数据库目录的配置在/etc/my.cnf
中,否则会失败。如果此时该目录不为空,删除即可,不需要关闭目录。 - 执行上述命令后,使用
service mysqld restart
或systemctl restart mysqld.service
重启数据库。如果无法重启,可能是使用了root
用户恢复数据导致的,把数据库目录的用户更换为mysql
用户即可。
设置主从
主库操作
- 新增复制用户:
grant replication slave on *.* to '用户名'@'ip地址' identified by '密码';
- 授权:
grant all privileges on *.* to '用户名'@'ip地址' identified by '密码';
- 权限刷新:
flush privileges;
获取binlog和pos位置
数据库的备份目录下有一个xtrabackup_info
文件,其中记录了binlog和pos位置。
从库
-
my.cnf
配置文件设置从库为只读 -
my.cnf
配置文件设置server-id为一个唯一值,不可重复。 - 根据binlog和pos文件执行以下命令:
CHANGE MASTER TO MASTER_HOST='主集群IP', MASTER_USER='用户名', MASTER_PASSWORD='密码', MASTER_PORT=3306, MASTER_LOG_FILE='日志文件', MASTER_LOG_POS=日志文件位置;
- 开启同步:
start slave;
- 查看同步状态:
show slave status\G