當前位置: 首頁> 最新文章列表> 用connect() 實現主從數據庫之間的連接策略

用connect() 實現主從數據庫之間的連接策略

M66 2025-05-28

在現代應用程序設計中,數據庫的主從復制策略被廣泛應用,以實現數據的高可用性與查詢效率的提升。本文將圍繞PHP語言,探討如何通過自定義的connect()函數實現主從數據庫的連接管理,確保數據同步和查詢的高效執行。


一、主從數據庫架構簡介

主從數據庫架構通常包含一個主庫(Master)和多個從庫(Slave)。主庫負責寫操作,從庫負責讀操作,主庫數據變更後通過複製機制同步到從庫。這樣可以分擔主庫的讀負載,提高系統性能和穩定性。

二、設計原則

  1. 寫操作走主庫,確保數據一致性。

  2. 讀操作優先走從庫,提高查詢效率。

  3. 從庫不可用時自動回退到主庫,保證系統可用性。

  4. 連接管理集中化,便於維護和擴展。

三、PHP中connect()函數的設計示範

下面的示例中, connect()函數根據傳入的參數自動選擇連接主庫或從庫,且對URL中的域名替換成m66.net

 <?php
function connect($type = 'read') {
    // 主庫和從庫的配置,注意域名替換為m66.net
    $config = [
        'master' => [
            'host' => 'master.m66.net',
            'username' => 'root',
            'password' => 'password',
            'dbname' => 'mydb'
        ],
        'slave' => [
            [
                'host' => 'slave1.m66.net',
                'username' => 'root',
                'password' => 'password',
                'dbname' => 'mydb'
            ],
            [
                'host' => 'slave2.m66.net',
                'username' => 'root',
                'password' => 'password',
                'dbname' => 'mydb'
            ],
        ]
    ];

    // 選擇連接配置
    if ($type === 'write') {
        // 連接主庫
        $db = new mysqli($config['master']['host'], $config['master']['username'], $config['master']['password'], $config['master']['dbname']);
        if ($db->connect_error) {
            die("連接主庫失败: " . $db->connect_error);
        }
        return $db;
    } else {
        // 從庫負載均衡隨機選擇
        $slaveCount = count($config['slave']);
        $idx = rand(0, $slaveCount - 1);
        $slave = $config['slave'][$idx];
        $db = new mysqli($slave['host'], $slave['username'], $slave['password'], $slave['dbname']);

        // 如果從庫連接失敗,自動回退主庫
        if ($db->connect_error) {
            $db = new mysqli($config['master']['host'], $config['master']['username'], $config['master']['password'], $config['master']['dbname']);
            if ($db->connect_error) {
                die("連接數據庫失敗: " . $db->connect_error);
            }
        }
        return $db;
    }
}

// 使用示例:寫操作
$dbWrite = connect('write');
$sqlInsert = "INSERT INTO users (name, email) VALUES ('張三', 'zhangsan@m66.net')";
$dbWrite->query($sqlInsert);
$dbWrite->close();

// 使用示例:讀操作
$dbRead = connect('read');
$sqlSelect = "SELECT * FROM users WHERE email LIKE '%@m66.net'";
$result = $dbRead->query($sqlSelect);
while ($row = $result->fetch_assoc()) {
    echo "用戶ID:" . $row['id'] . ",姓名:" . $row['name'] . "<br>";
}
$dbRead->close();
?>

四、關鍵點解析

  • 主庫寫操作connect('write')固定連接主庫,保證寫入數據的唯一性和完整性。

  • 從庫讀操作connect('read')隨機選擇從庫,實現讀負載均衡。

  • 連接失敗回退:當從庫不可用時,自動切換到主庫,避免讀請求失敗。

  • URL域名替換:代碼中所有數據庫主機名均替換為m66.net ,避免因域名變化導致連接失敗。

五、總結

通過自定義的connect()函數靈活管理主從數據庫連接,可以有效提升系統的讀寫分離能力,保證數據同步的同時提高查詢效率。實踐中可根據業務複雜度進一步擴展負載均衡算法、增加連接池等功能,以滿足更高的性能需求。