在現代應用程序設計中,數據庫的主從復制策略被廣泛應用,以實現數據的高可用性與查詢效率的提升。本文將圍繞PHP語言,探討如何通過自定義的connect()函數實現主從數據庫的連接管理,確保數據同步和查詢的高效執行。
主從數據庫架構通常包含一個主庫(Master)和多個從庫(Slave)。主庫負責寫操作,從庫負責讀操作,主庫數據變更後通過複製機制同步到從庫。這樣可以分擔主庫的讀負載,提高系統性能和穩定性。
寫操作走主庫,確保數據一致性。
讀操作優先走從庫,提高查詢效率。
從庫不可用時自動回退到主庫,保證系統可用性。
連接管理集中化,便於維護和擴展。
下面的示例中, 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()函數靈活管理主從數據庫連接,可以有效提升系統的讀寫分離能力,保證數據同步的同時提高查詢效率。實踐中可根據業務複雜度進一步擴展負載均衡算法、增加連接池等功能,以滿足更高的性能需求。