溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP中如何實(shí)現(xiàn)MySQL的讀寫分離

發(fā)布時(shí)間:2024-09-22 09:30:25 來源:億速云 閱讀:81 作者:小樊 欄目:編程語言

在 PHP 中實(shí)現(xiàn) MySQL 讀寫分離,可以采用以下幾種方法:

  1. 使用 MySQL 的主從復(fù)制 (Master-Slave Replication):

主從復(fù)制是一種通過將數(shù)據(jù)從一個(gè) MySQL 服務(wù)器(主服務(wù)器)復(fù)制到另一個(gè) MySQL 服務(wù)器(從服務(wù)器)的技術(shù)。你可以將讀操作分發(fā)到從服務(wù)器上,從而降低主服務(wù)器的負(fù)載。

步驟如下:

a. 配置主服務(wù)器(Master):

  • 修改 my.cnf 配置文件,開啟二進(jìn)制日志(binlog)功能:
log-bin=mysql-bin
  • 在主服務(wù)器上創(chuàng)建一個(gè)專門用于復(fù)制的用戶:
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
  • 獲取主服務(wù)器的二進(jìn)制日志坐標(biāo)(文件名和位置):
SHOW MASTER STATUS;

b. 配置從服務(wù)器(Slave):

  • 修改從服務(wù)器的 my.cnf 配置文件,開啟二進(jìn)制日志(binlog)功能,并指定主服務(wù)器的 IP 地址、端口、用戶名和密碼:
server-id=1
relay-log=relay-bin
log-bin=mysql-bin
binlog-do-db=your_database_name
replicate-do-db=your_database_name
  • 在從服務(wù)器上創(chuàng)建一個(gè)專門用于復(fù)制的用戶:
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
  • 使用從服務(wù)器連接主服務(wù)器,開始復(fù)制:
CHANGE MASTER TO
  MASTER_HOST='master_ip_address',
  MASTER_PORT=3306,
  MASTER_USER='repl_user',
  MASTER_PASSWORD='your_password',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=  107;
START SLAVE;

c. 在 PHP 代碼中實(shí)現(xiàn)讀寫分離:

$read_host = 'slave_ip_address';
$write_host = 'master_ip_address';

// 連接讀數(shù)據(jù)庫
$read_conn = new mysqli($read_host, 'username', 'password', 'database');

// 連接寫數(shù)據(jù)庫
$write_conn = new mysqli($write_host, 'username', 'password', 'database');
  1. 使用代理中間件(Proxy Middleware):

代理中間件如 ProxySQL 可以在應(yīng)用層實(shí)現(xiàn) MySQL 讀寫分離。它們通常提供負(fù)載均衡、故障轉(zhuǎn)移和連接池等功能。

a. 安裝并配置 ProxySQL:

  • 參考 ProxySQL 官方文檔(https://proxysql.com/doc/)進(jìn)行安裝和配置。

b. 在 PHP 代碼中使用 ProxySQL 連接數(shù)據(jù)庫:

$dsn = "mysql:host=127.0.0.1;port=3306;dbname=your_database_name;charset=utf8mb4";
$username = 'username';
$password = 'password';

$proxy = new ProxySQL();
$proxy->connect('localhost', 3306, $username, $password);
$proxy->set_read_timeout(5);
$proxy->set_write_timeout(5);

// 設(shè)置讀寫分離策略
$query_rules = [
    ['pattern' => '^SELECT', 'target' => 'read'],
    ['pattern' => '^INSERT|UPDATE|DELETE', 'target' => 'write'],
];
$proxy->add_query_rule($query_rules);

// 獲取連接
$conn = $proxy->get_connection();

這樣,你就可以在 PHP 代碼中使用配置好的主從服務(wù)器或代理中間件實(shí)現(xiàn) MySQL 讀寫分離了。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI