首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

大型 PHP 架構實戰:Memcached 叢集 + MySQL 主從同步的讀寫分離封裝範例

     編輯:MySQL 資料庫相關知識

大流量網站常見架構:「以記憶體當資料庫(Memcached 叢集)+ MySQL 主從複寫實現讀寫分離」。本文提供一套 PHP 5 實戰封裝類別,展示如何在程式碼層面落地此架構。

架構核心概念

  • Memcached 多節點:手動指定鍵值落在哪台記憶體伺服器(如 cn_、en_ 前綴),靈活控制資料分佈,而非依賴一致性雜湊自動分配。
  • MySQL 主從:寫操作(INSERT/UPDATE/DELETE)走 Master,讀操作(SELECT)走 Slave,支援多 Slave 輪詢分流。
  • 快取策略:寫入 Master 後同步更新 Memcached;讀取優先查 Memcached,未命中則查 Slave 並回填快取。

程式碼結構總覽

  1. config.php:集中管理 Memcached 叢集與 MySQL 主從連線參數。
  2. class Memcached:封裝連線、set/get、依鍵值前綴路由到指定節點、支援長連線(pconnect)。
  3. class MySQL:封裝 mysqli,建構子自動建立 Master/Slave 連線,mquery() 寫主庫、squery()/fetArray() 讀從庫,Slave 以 Session 輪詢實現簡易負載均衡。
  4. init.php / 使用範例:示範「寫入 -> 查詢 -> 存快取」完整流程,含 SQL 產生 MD5 作為快取鍵。

關鍵實作細節

Memcached 路由邏輯

private function tag($ser_key) {
    $tag = explode('_', $ser_key);
    return $tag[0]; // 取前綴 'cn' 或 'en' 決定節點
}
public function set($ser_key, $values, $flag='', $expire='') {
    $this->memConnect($this->tag($ser_key));
    return $this->mem->set($ser_key, $values, $flag, $expire);
}

呼叫端:$mem->set('en_'.$key, $data); 明確指定存入 en 節點。

MySQL 讀寫分離與 Slave 輪詢

private function autotranscat($mysql) {
    session_start();
    $_SESSION['SID'] = ($_SESSION['SID'] ?? 0) + 1;
    if ($_SESSION['SID'] >= count($mysql) - 1) $_SESSION['SID'] = 1;
    $key = 'slave_'.$_SESSION['SID'];
    return new mysqli($mysql[$key][0], $mysql[$key][1], $mysql[$key][2], $mysql[$key][3]);
}
public function mquery($sql) { return $this->mysqlmaster->query($sql); } // 寫主
public function squery($sql) { return $this->mysqlslave->query($sql); } // 讀從

業務流程範例

$sql = "INSERT INTO mybb(pid) VALUES(200)";
$mdsql = md5($sql);
if (!$result = $mem->get('cn_'.$mdsql)) {
    $sq->mquery($sql);                    // 1. 寫入 Master
    $result = $sq->fetArray("SELECT * FROM mybb"); // 2. 從 Slave 讀取驗證
    $mem->set('cn_'.$mdsql, $result);     // 3. 回填 Memcached (cn 節點)
}
foreach ($result as $var) echo $var['pid'];

生產環境補強建議

  • 快取一致性:採用「先更新 DB,再刪除/更新快取」模式,並引入延雙刪或訂閱 Binlog 異步淘汰,避免髒讀。
  • Slave 延遲監控:讀從庫前檢查 Seconds_Behind_Master,延遲過大則強制讀主庫或降級提示。
  • 連線池與錯誤重試:生產環境建議改用 mysqli 長連線或 Swoole/Workerman 協程池,並加入指數退避重試。
  • 安全性:配置檔敏感資訊應存環境變數或 Vault,避免硬編碼明文密碼。
  • 擴展性:引入 ProxySQL 或 MyCat 實現中間件級讀寫分離,解耦業務碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved