MySQL不停机主从部署

  • 引言
  • 搭建数据库
  • 备份主库数据——XtraBackup工具
  • 安装
  • 制作全量备份
  • 从库恢复全量备份数据
  • 设置主从
  • 主库操作
  • 获取binlog和pos位置
  • 从库


引言

在日常开发中,MySQL数据库的使用非常频繁。在MySQL的使用过程中,我们需要面对两个方面的问题:

  1. 性能问题
  2. 容灾问题

性能问题指的是随着应用、并发量的增加,原本的一个数据库无法再承受更多的连接和访问,因此需要使用从库,以减轻主库的负载。
容灾问题指的是在极端情况下,主库可能崩溃、无法访问、数据盘异常等等,因此需要从库,用于应对主库发生异常的情形。
以上两个问题可以通过主从部署的方式解决,本文则介绍一种主库不停机、应用正常访问的主从部署方案。

搭建数据库

我们的从库还没搭建,下面先介绍搭建从库的过程。

  1. 首先进入MySQL下载地址,我使用的是centos,因此下载的是rpm的包。
  2. 安装:yum -y install mysql*.rpm
  3. 启动:systemctl start mysqld.serviceservice mysqld start
  4. 查看运行状态:systemctl status mysqld.serviceservice mysqld status,可以看到绿色的Running状态,表示正常运行。
  5. 查看初始化root用户密码:grep "password" /var/log/mysqld.log,使用该密码进入数据库。
  6. 进入数据库后必须修改密码才能操作:ALTER USER 'root'@'localhost' IDENTIFIEDBY 'password',此时执行其他操作会失败。
  7. 自此,我们的数据库就搭建好了。

备份主库数据——XtraBackup工具

安装

  1. 首先在XtraBackup官网下载对应版本的rpm包,注意MySQL5.x,需要安装2.4及以下版本,高版本的MySQL可以安装高版本的XtraBackup。
  2. 依赖包安装:
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.cnfread_only = 1即可,否则可能导致数据不一致,影响从库恢复效果。
接下来正式开始执行从库的恢复过程:

  1. 执行innobackupex --apply-log /home/nfuser/dbbackup/命令,将数据整理成MySQL可用的文件。
  2. 执行innobackupex --copy-back /home/nfuser/dbbackup/命令恢复备份的数据,执行该命令不需要关闭数据库,但需要保证数据库目录为空,数据库目录的配置在/etc/my.cnf中,否则会失败。如果此时该目录不为空,删除即可,不需要关闭目录。
  3. 执行上述命令后,使用service mysqld restartsystemctl restart mysqld.service重启数据库。如果无法重启,可能是使用了root用户恢复数据导致的,把数据库目录的用户更换为mysql用户即可。

设置主从

主库操作

  1. 新增复制用户:
grant replication slave on *.* to '用户名'@'ip地址' identified by '密码';
  1. 授权:
grant all privileges on *.* to '用户名'@'ip地址' identified by '密码';
  1. 权限刷新:flush privileges;

获取binlog和pos位置

数据库的备份目录下有一个xtrabackup_info文件,其中记录了binlog和pos位置。

从库

  1. my.cnf配置文件设置从库为只读
  2. my.cnf配置文件设置server-id为一个唯一值,不可重复。
  3. 根据binlog和pos文件执行以下命令:
CHANGE MASTER TO MASTER_HOST='主集群IP', MASTER_USER='用户名', MASTER_PASSWORD='密码', MASTER_PORT=3306, MASTER_LOG_FILE='日志文件', MASTER_LOG_POS=日志文件位置;
  1. 开启同步:start slave;
  2. 查看同步状态:show slave status\G