MYSQL-主从复制

38 阅读2分钟

一、概述

  • 核心逻辑:主库通过 二进制日志(Binlog)  记录 DDL/DML 操作,从库拉取日志并「重做」,实现数据一致。

  • 支持架构:一主多从、链式复制(从库作为其他从库的主库)。

  • 核心优势:

    1. 故障切换:主库故障时,从库可快速补位。

    2. 读写分离:主库负责写(增删改),从库负责读,分摊压力。

    3. 备份不影响主库:从库执行备份操作。

二、复制原理(三步法)

  1. 主库:事务提交时,将数据变更记录到 Binlog。

  2. 从库:IO 线程读取主库 Binlog,写入本地中继日志(Relay Log)。

  3. 从库:SQL 线程解析中继日志,执行相同操作,同步数据。

三、搭建步骤(精简版)

1. 前置准备(主从库均执行)

  • 开放 3306 端口:firewall-cmd --zone=public --add-port=3306/tcp --permanent

  • 重载防火墙:firewall-cmd --reload

2. 主库配置

  1. 编辑 /etc/my.cnf

    • server-id=1(集群内唯一,1-2³²-1)

    • read-only=0(主库可读可写)

    • 可选:binlog-ignore-db=xxx(忽略同步库)/ binlog-do-db=xxx(仅同步指定库)

  2. 重启 MySQL:systemctl restart mysqld

  3. 登录 MySQL,创建复制账号并授权:

    CREATE USER 'repl'@'从库IP' IDENTIFIED WITH mysql_native_password BY '密码';
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'从库IP';
    
  4. 查看 Binlog 坐标(需记录):show master status; → 记录 File(日志文件名)和 Position(起始位置)

3. 从库配置

  1. 编辑 /etc/my.cnf

    • server-id=2(集群内唯一,与主库不同)

    • read-only=1(从库只读)

  2. 重启 MySQL:systemctl restart mysqld

  3. 登录 MySQL,配置主库信息:

    CHANGE MASTER TO
    MASTER_HOST='主库IP',
    MASTER_USER='repl',  # 主库创建的复制账号
    MASTER_PASSWORD='密码',
    MASTER_LOG_FILE='主库File值',  # 主库第4步记录
    MASTER_LOG_POS=主库Position值;  # 主库第4步记录
    
  4. 启动同步:start slave;

  5. 验证状态:show slave status; → 核心看两项均为 Yes

    • Replica_IO_Running(IO 线程正常)

    • Replica_SQL_Running(SQL 线程正常)