数据库主从配置

一、环境准备

服务器规划

 
角色IP 地址说明
MySQL 主库 192.168.1.10 负责写入操作
MySQL 从库 192.168.1.11 负责只读操作
Hyperf 应用 192.168.1.12 业务服务(连接主从库)

软件版本

  • MySQL: 8.0+(主从版本需一致)

  • Hyperf: 3.0+

  • 操作系统: Linux(Ubuntu/CentOS)

二、MySQL 主从复制配置

1. 主库配置(192.168.1.10)

步骤 1:修改 MySQL 配置文件
编辑 /etc/mysql/my.cnf(路径可能因安装方式不同而变化):

[mysqld]
server-id = 1                # 唯一ID,主从不能重复
log_bin = mysql-bin          # 开启二进制日志
binlog_format = ROW          # 推荐使用 ROW 格式
expire_logs_days = 7         # 日志保留天数
max_binlog_size = 100M       # 单个日志文件大小
binlog_do_db = your_db       # 同步的数据库(可选,不配置则同步所有库)

步骤 2:重启 MySQL 服务

systemctl restart mysql

步骤 3:创建主从同步账户
登录 MySQL 执行:

CREATE USER 'repl'@'192.168.1.11' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.11';
FLUSH PRIVILEGES;

步骤 4:获取主库状态
记录 File 和 Position 值(从库配置需要):

SHOW MASTER STATUS;

输出示例:

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 756      | your_db      |                  |
+------------------+----------+--------------+------------------+

2. 从库配置(192.168.1.11)

步骤 1:修改 MySQL 配置文件
编辑 /etc/mysql/my.cnf

[mysqld]
server-id = 2                # 唯一ID,不同于主库
relay_log = mysql-relay-bin  # 中继日志
read_only = 1                # 从库只读(超级用户可写)

步骤 2:重启 MySQL 服务

systemctl restart mysql

步骤 3:配置主从复制链路
登录 MySQL 执行:

CHANGE MASTER TO
MASTER_HOST = '192.168.1.10',
MASTER_USER = 'repl',
MASTER_PASSWORD = 'repl_password',
MASTER_LOG_FILE = 'mysql-bin.000001', -- 替换为主库的 File 值
MASTER_LOG_POS = 756;                 -- 替换为主库的 Position 值

步骤 4:启动复制进程

START SLAVE;

步骤 5:检查复制状态
确认 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes

SHOW SLAVE STATUS\G

三、Hyperf 读写分离配置

1. 修改 Hyperf 数据库配置

编辑 config/autoload/databases.php

return [
    'default' => [
        'driver' => Hyperf\DB\DB::class,
        'host' => env('DB_HOST', 'localhost'),
        'database' => env('DB_DATABASE', 'your_db'),
        'username' => env('DB_USERNAME', 'root'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'pool' => [
            'min_connections' => 1,
            'max_connections' => 32,
            'connect_timeout' => 10.0,
            'wait_timeout' => 3.0,
        ],
        'read' => [  // 从库列表(读操作)
            'host' => ['192.168.1.11'],
        ],
        'write' => [ // 主库列表(写操作)
            'host' => ['192.168.1.10'],
        ],
        'mode' => MODE_READ_WRITE, // 读写分离模式
        'load_balancer' => 'random', // 负载均衡策略(random/round-robin)
    ],
];

2. 验证读写分离

代码测试

// 写入操作(应路由到主库)
Db::table('users')->insert(['name' => 'Hyperf']);
// 读取操作(应路由到从库)
$users = Db::table('users')->get();

日志验证

  • 查看主库的 general_log 确认写入操作:

  • SET GLOBAL general_log = 'ON';
    SHOW VARIABLES LIKE 'general_log%';
  • 查看从库日志确认读取操作。

 

四、常见问题排查

1. 主从同步失败

  • 检查网络:确保主从服务器之间的 3306 端口互通。

  • 账户权限:确认 repl 用户权限是否正确。

  • 日志位置:主库的 File 和 Position 是否与从库配置一致。

2. Hyperf 未正确路由

  • 配置检查:确认 databases.php 中的 read 和 write 配置。

  • 负载均衡策略:若使用多个从库,检查 load_balancer 策略。


五、总结

  • MySQL 主从配置:通过二进制日志实现数据异步复制,需确保主从 server-id 唯一。

  • Hyperf 读写分离:通过 read 和 write 配置自动路由请求,提升读性能。

  • 验证要点

    • 主从数据一致性(手动插入验证)。

    • Hyperf 读写操作是否按预期路由。

posted @ 2025-03-20 09:20  三七、  阅读(45)  评论(0)    收藏  举报