主从复制

101 阅读3分钟

概述

主从复制是把主数据库的DDL(数据定义语言)和DML(数据操纵语言)操作通过二进制日志传到从库,在从库重新执行这些日志,让从库和主库数据同步 。MySQL支持一台主库向多台从库复制,从库也能作为其他从服务器的主库,实现链状复制。

主从复制优点

  1. 主库故障时,可快速切换到从库继续提供服务。
  2. 实现读写分离,减轻主库访问压力。
  3. 可在从库执行备份,避免影响主库服务。

MySQL主从复制原理步骤

  1. 主库记录:主库(Master)在事务提交时,将数据变更记录到二进制日志文件(Binlog) 。
  2. 从库读取写入:从库(Slave)的IO线程读取主库的二进制日志文件内容,写入到从库的中继日志(Relay Log)。
  3. 从库重放:从库的SQL线程重放中继日志中的事件,将变更应用到自身数据。

搭建

服务器准备

主库IP为192.168.200.200 ,从库IP为192.168.200.201 ,需进行以下网络相关操作:

  • 开放端口(推荐)
    1. 执行firewall-cmd --zone=public --add-port=3306/tcp -permanent ,永久开放3306端口(MySQL默认端口) 。
    2. 执行firewall-cmd -reload ,重新加载防火墙规则使配置生效。
  • 关闭防火墙(不推荐,有安全风险)
    1. 执行systemctl stop firewalld ,停止防火墙服务。
    2. 执行systemctl disable firewalld ,禁止防火墙开机自启。

主库配置

  1. 修改配置文件:编辑/etc/my.cnf ,添加或修改以下配置项:
# MySQL服务ID,在集群中需唯一,取值1 - 2³² - 1 ,默认为1 。
server-id=1
# 设置读写模式,0代表读写,1代表只读。
read-only=0
# (可选)指定不需要同步的数据库,如mysql系统库。
binlog-ignore-db=mysql
# (可选)指定需要同步的数据库,如db01
binlog-do-db=db01
  1. 重启MySQL服务:执行systemctl restart mysqld ,使配置生效。

  2. 创建账号并授权

  • 登录MySQL,执行CREATE USER 'itcast'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123456'; ,创建itcast用户,允许从任意主机连接,设置密码为Root@123456
  • 执行GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%'; ,为itcast用户授予主从复制权限。
  1. 查看二进制日志坐标 执行show master status; ,可获取二进制日志相关信息:
  • file :起始推送日志文件。
  • position :起始推送日志位置。
  • binlog_ignore_db :指定不同步的数据库。 这些信息后续配置从库时会用到。

从库配置

从库配置前两步与主库类似,不同的是要设置与主库不同的server-id,并且read-only一般设置为1表示只读

  1. 从库设置主库配置
  • MySQL 8.0.23及之后版本CHANGE REPLICATION SOURCE TO SOURCE_HOST='xxx.xxx',SOURCE_USER='xxx',SOURCE_PASSWORD='xxx',SOURCE_LOG_FILE='xxx', SOURCE_LOG_POS=xxx;
  • MySQL 8.0.23之前版本CHANGE MASTER TO MASTER_HOST='xxx.xxx.xxx.xxx', MASTER_USER='xxx', MASTER_PASSWORD='xxx', MASTER_LOG_FILE='xxx', MASTER_LOG_POS=xxx;
  • 相关参数含义
参数名含义8.0.23之前对应参数
SOURCE_HOST主库IP地址MASTER_HOST
SOURCE_USER连接主库的用户名MASTER_USER
SOURCE_PASSWORD连接主库的密码MASTER_PASSWORD
SOURCE_LOG_FILEbinlog日志文件名MASTER_LOG_FILE
SOURCE_LOG_POSbinlog日志文件位置MASTER_LOG_POS
  1. 从库开启同步及查看状态操作
  • 开启同步
    • MySQL 8.0.22及之后版本:执行start replica;
    • MySQL 8.0.22之前版本:执行start slave;
  • 查看主从同步状态
    • MySQL 8.0.22及之后版本:执行show replica status;
    • MySQL 8.0.22之前版本:执行show slave status;

正常情况下,Replica_IO_RunningReplica_SQL_Running (8.0.22之前是Slave_IO_RunningSlave_SQL_Running )的值都应为Yes ,表示主从同步正常运行。