人称外号大脸猫

MySQL 主从同步的实现原理和运行机制

一、主从同步的核心原理

  1. 二进制日志(Binlog)
    • 作用:主库将所有数据变更操作(如INSERT、UPDATE、DELETE)以事件形式记录到二进制日志中。
    • 日志格式:
      • STATEMENT:记录SQL语句(默认)。
      • ROW:记录数据行的变化(更安全,推荐)。
      • MIXED:混合模式,根据场景自动选择。
  2. 从库的复制线程
    • IO线程:负责从主库拉取Binlog事件,保存到从库的中继日志(Relay Log)。
    • SQL线程:读取中继日志中的事件,并在从库上重放这些操作。
  3. 异步复制(默认模式)
    • 主库提交事务后,不等待从库确认,直接响应客户端。
    • 从库通过IO线程近乎实时拉取Binlog并应用,但可能存在短暂延迟。

二、主从同步的执行流程

  1. 主库写入数据:
    • 用户向主库写入一条数据(例如 INSERT INTO users VALUES (1, 'Alice'))。
    • 主库将操作记录到Binlog中。
  2. 从库拉取Binlog:
    • 从库的IO线程连接到主库,请求Binlog事件。
    • 主库将新的Binlog事件发送给从库的IO线程。
  3. 从库写入中继日志:
    • IO线程将接收到的Binlog事件写入从库的中继日志(Relay Log)。
  4. 从库重放事件:
    • SQL线程读取中继日志中的事件,解析并执行相同的SQL操作(如执行 INSERT 语句)。
    • 数据最终在从库中生成,与主库保持一致。 三、同步频率:是“实时”还是“定时”?
  5. 默认异步复制:近乎实时同步,但并非严格实时。
    • IO线程:会持续请求主库的Binlog,通常延迟在毫秒级。
    • SQL线程:重放速度取决于从库的硬件性能和SQL复杂度。
  6. 半同步复制(需手动配置):
    • 主库提交事务前,需等待至少一个从库确认接收Binlog事件。
    • 数据一致性更强,但性能略有下降。 三、同步频率:是“实时”还是“定时”?
    • 默认异步复制:近乎实时同步,但并非严格实时。
      • IO线程:会持续请求主库的Binlog,通常延迟在毫秒级。
      • SQL线程:重放速度取决于从库的硬件性能和SQL复杂度。
    • 半同步复制(需手动配置):
      • 主库提交事务前,需等待至少一个从库确认接收Binlog事件。
      • 数据一致性更强,但性能略有下降。

MySQL主从数据库的安装与配置步骤,分为主库(Master)和从库(Slave)的配置流程:

一、环境准备

  1. 服务器规划: 主库(Master):IP 192.168.1.100 从库(Slave):IP 192.168.1.101
  2. 确保主从服务器网络互通,防火墙开放MySQL端口(默认3306)。
  3. MySQL版本一致(建议主从版本相同或从库版本不低于主库)。

二、安装MySQL 正常linux命令安装即可

三、配置主库(Master)

  1. 修改MySQL配置文件 编辑主库的配置文件 /etc/mysql/mysql.conf.d/mysqld.cnf(路径可能因系统不同):
[mysqld]
server-id = 1                # 唯一ID,主库设为1
log_bin = /var/log/mysql/mysql-bin.log  # 启用二进制日志
binlog_do_db = my_database   # 可选:指定要复制的数据库(不配置则复制所有库)
# bind-address = 0.0.0.0     # 允许远程连接(按需启用)
  1. 重启MySQL服务
sudo systemctl restart mysql
  1. 创建复制用户 登录MySQL,创建用于复制的用户并授权:
CREATE USER 'repl_user'@'192.168.1.101' IDENTIFIED BY 'SecurePass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.1.101';
FLUSH PRIVILEGES;
  1. 查看主库状态 记录 File 和 Position 值(从库配置时需要):
SHOW MASTER STATUS;

四、配置从库(Slave)

  1. 修改MySQL配置文件 编辑从库的配置文件 /etc/mysql/mysql.conf.d/mysqld.cnf:
[mysqld]
server-id = 2                # 唯一ID,不能与主库相同
relay_log = /var/log/mysql/mysql-relay-bin.log
read_only = 1                # 从库只读(可选)
  1. 重启MySQL服务
sudo systemctl restart mysql
  1. 配置复制链路 登录从库的MySQL,执行:
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repl_user',
MASTER_PASSWORD='SecurePass123!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=107;
  1. 启动复制
 START SLAVE;
  1. 检查从库状态
SHOW SLAVE STATUS\G

确认以下两项为 Yes:

Slave_IO_Running: Yes Slave_SQL_Running: Yes

五、验证主从同步 在主库写入数据:

USE my_database;
CREATE TABLE test (id INT);
INSERT INTO test VALUES (1);

在从库查询数据:

USE my_database;
SELECT * FROM test;

若数据一致,则主从复制成功!

六、常见问题

主从连接失败: 检查防火墙是否开放端口。 确认复制用户的IP权限。 数据不一致: 确保主从库的初始数据一致(可通过 mysqldump 导入)。 复制延迟: 监控 SHOW SLAVE STATUS 中的 Seconds_Behind_Master。

七、扩展配置

GTID复制:简化故障恢复,避免手动管理 File 和 Position。 半同步复制:增强数据一致性(需安装插件)。 多主复制:实现双向同步。 通过以上步骤,您已成功搭建MySQL主从复制环境!

Laravel 中实现数据库的主从(Master-Slave)配置,主要是为了实现读写分离,提高数据库的访问效率和系统的可扩展性。Laravel 提供了灵活的数据库配置选项来支持这种架构。以下是实现步骤:

  1. 配置 config/database.php 你需要编辑 Laravel 项目中的 config/database.php 文件,添加或修改数据库连接设置以支持主从复制。
'mysql' => [
    'read' => [
        'host' => ['slave1_host', 'slave2_host'], // 可以指定多个从数据库
    ],
    'write' => [
        'host' => 'master_host', // 主数据库
    ],
    'driver' => 'mysql',
    'database' => 'your_database',
    'username' => 'your_username',
    'password' => 'your_password',
    'charset'   => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix'   => '',
],

在这个配置中,read 和 write 分别指定了用于读操作和写操作的数据库连接。你可以为 read 设置多个从数据库地址,Laravel 会自动在这几个从库之间进行负载均衡。

  1. 使用 完成上述配置后,你不需要对代码做任何改动。Laravel 的数据库查询构建器和 Eloquent ORM 会根据你是执行读取还是写入操作,自动选择合适的数据库连接。

写入:例如插入、更新或删除数据时,Laravel 会选择 write 连接。 读取:当你执行查询时,Laravel 会选择 read 连接之一。

  1. 扩展与注意事项 确保你的主从数据库已经正确配置,并且数据同步正常工作。 在某些情况下,可能需要处理延迟问题,特别是当从库的数据不是实时同步时。 对于复杂的查询需求或者特定的场景下,你可能需要手动控制使用哪个连接,可以通过 DB::connection('指定的连接名') 来获取特定的数据库连接实例。 通过这种方式,可以轻松地在 Laravel 应用中集成分布式数据库系统,实现高效的读写分离策略。
copyright ©2025 ahimu.com all rights reserved 皖ICP备19021547号-1