一、环境准备
服务器规划
角色 | 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%';
-
查看从库日志确认读取操作。