php实现mysql读写分离
实现 MySQL 读写分离的方法
MySQL 读写分离可以通过多种方式实现,以下是一些常见的方法:
使用 MySQL 主从复制
配置 MySQL 主从复制,主库负责写入操作,从库负责读取操作。在 PHP 中可以通过判断 SQL 语句类型来选择连接主库或从库。
使用中间件
可以使用 ProxySQL、MySQL Router 等中间件来实现读写分离,这些中间件会自动将读写请求路由到不同的数据库实例。
手动实现读写分离
在 PHP 代码中手动实现读写分离,根据 SQL 语句类型选择连接主库或从库。
手动实现读写分离的示例代码
以下是一个简单的 PHP 示例代码,展示如何手动实现 MySQL 读写分离:
<?php
class DBConnection {
private $master;
private $slave;
public function __construct() {
$this->master = new mysqli('master_host', 'username', 'password', 'database');
$this->slave = new mysqli('slave_host', 'username', 'password', 'database');
}
public function query($sql) {
if (preg_match('/^SELECT/i', $sql)) {
return $this->slave->query($sql);
} else {
return $this->master->query($sql);
}
}
public function close() {
$this->master->close();
$this->slave->close();
}
}
$db = new DBConnection();
$result = $db->query("SELECT * FROM users");
$db->query("INSERT INTO users (name) VALUES ('John')");
$db->close();
?>
使用 ProxySQL 实现读写分离
ProxySQL 是一个高性能的 MySQL 代理,可以自动将读写请求路由到不同的数据库实例。
安装和配置 ProxySQL:
-
安装 ProxySQL:
sudo apt-get install proxysql -
配置 ProxySQL:
sudo vi /etc/proxysql.cnf -
启动 ProxySQL:
sudo systemctl start 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.*',20,1); INSERT INTO mysql_query_rules (rule_id,active,match_pattern,destination_hostgroup,apply) VALUES (2,1,'^INSERT.*',10,1); INSERT INTO mysql_query_rules (rule_id,active,match_pattern,destination_hostgroup,apply) VALUES (3,1,'^UPDATE.*',10,1); INSERT INTO mysql_query_rules (rule_id,active,match_pattern,destination_hostgroup,apply) VALUES (4,1,'^DELETE.*',10,1); LOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK; LOAD MYSQL QUERY RULES TO RUNTIME; SAVE MYSQL QUERY RULES TO DISK;
使用 MySQL Router 实现读写分离
MySQL Router 是 MySQL 官方提供的轻量级中间件,可以自动将读写请求路由到不同的数据库实例。
安装和配置 MySQL Router:
-
安装 MySQL Router:
sudo apt-get install mysql-router -
配置 MySQL Router:
sudo vi /etc/mysqlrouter/mysqlrouter.conf -
启动 MySQL Router:
sudo systemctl start mysqlrouter
注意事项
- 确保主从复制配置正确,数据同步正常。
- 监控主从延迟,避免读取到旧数据。
- 考虑使用连接池提高性能。
- 在高并发场景下,可能需要多个从库分担读取压力。







