php实现mysql读写分离实现
实现MySQL读写分离的方法
MySQL读写分离是一种常见的数据库优化策略,通过将读操作和写操作分配到不同的数据库服务器上,减轻主库的负载。以下是几种实现方式:
使用MySQL主从复制
MySQL主从复制是实现读写分离的基础。主库负责写操作,从库负责读操作。
配置主库的my.cnf文件:
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=ROW
配置从库的my.cnf文件:
[mysqld]
server-id=2
relay-log=mysql-relay-bin
read-only=1
在主库上创建复制用户并授权:
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
在从库上配置主库信息:
CHANGE MASTER TO
MASTER_HOST='master_host',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0;
START SLAVE;
PHP代码实现读写分离
在PHP代码中手动实现读写分离逻辑:
class DBConnection {
private $writeConn;
private $readConn;
public function __construct() {
$this->writeConn = new mysqli('master_host', 'user', 'password', 'db');
$this->readConn = new mysqli('slave_host', 'user', 'password', 'db');
}
public function query($sql) {
if (preg_match('/^SELECT/i', $sql)) {
return $this->readConn->query($sql);
} else {
return $this->writeConn->query($sql);
}
}
}
使用中间件实现
MySQL Proxy、ProxySQL等中间件可以自动实现读写分离:
安装ProxySQL后配置读写分离规则:
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (10,'master_host',3306);
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (20,'slave_host',3306);
INSERT INTO mysql_query_rules (rule_id,active,match_pattern,destination_hostgroup,apply) VALUES (1,1,'^SELECT.*FOR UPDATE',10,1);
INSERT INTO mysql_query_rules (rule_id,active,match_pattern,destination_hostgroup,apply) VALUES (2,1,'^SELECT',20,1);
INSERT INTO mysql_query_rules (rule_id,active,match_pattern,destination_hostgroup,apply) VALUES (3,1,'^INSERT',10,1);
INSERT INTO mysql_query_rules (rule_id,active,match_pattern,destination_hostgroup,apply) VALUES (4,1,'^UPDATE',10,1);
INSERT INTO mysql_query_rules (rule_id,active,match_pattern,destination_hostgroup,apply) VALUES (5,1,'^DELETE',10,1);
使用框架内置功能
许多PHP框架内置了读写分离支持,例如Laravel:
在config/database.php中配置:
'mysql' => [
'read' => [
'host' => ['slave_host'],
],
'write' => [
'host' => 'master_host',
],
'sticky' => true,
'driver' => 'mysql',
// 其他配置...
],
注意事项
读写分离会导致主从同步延迟问题,对于强一致性要求的场景需要考虑解决方案。
事务中的查询默认会使用写连接,确保数据一致性。
定期监控主从同步状态,避免因同步延迟导致数据不一致。
读写分离并不能解决所有性能问题,需要结合其他优化手段如索引优化、查询优化等。







