Soundbreak平台需全天候播放直播內容,資料庫單點故障不可接受。採用MySQL 3.23.23+內建復制,構建雙主互備架構,配合PHP連線層自動故障轉移,實現零停機維護與災難恢復。
Server A (Master) ←────────────→ Server B (Master)
10.1.1.1 復制連線 10.1.1.2
↑ ↑
應用寫入/讀取 備份/故障轉移讀取
雙向復制:任一節點寫入變更自動同步至另一節點,任一節點故障另一節點無縫接管。
# 1. 建立復制專用帳號 (僅需FILE權限)
GRANT FILE ON *.* TO 'replicate'@'10.1.1.2' IDENTIFIED BY 'strongpass';
FLUSH PRIVILEGES;
# 2. 啟用二進制日誌
# 編輯 my.cnf [mysqld] 區段新增:
log-bin
# 重啟 mysqld
# 3. 取得一致性資料快照
# 停止寫入 → 複製資料目錄 → 重啟 mysqld (開始產生 binlog)
# 異構環境需用 mysqldump 而非直接複製檔案
# 1. 停止 mysqld,部署 A 的資料快照
# 修正檔案擁有者/權限:chown -R mysql:mysql /var/lib/mysql; chmod -R 660 data files; 770 directories
# 2. 驗證快照完整性 (僅 SELECT 測試)
# 3. 配置復制連線參數 (my.cnf [mysqld])
master-host=10.1.1.1
master-user=replicate
master-password=strongpass
# 4. 啟動 mysqld,觀察 SHOW SLAVE STATUS 確認復制運行
# 在 B 上啟用 binlog
log-bin
# 重啟 mysqld
# 在 B 建立反向復制帳號
GRANT FILE ON *.* TO 'replicate'@'10.1.1.1' IDENTIFIED BY 'strongpass';
FLUSH PRIVILEGES;
# 在 A 配置反向復制 (my.cnf)
master-host=10.1.1.2
master-user=replicate
master-password=strongpass
# 重啟 A 的 mysqld
⚠️ 注意:雙主模式下auto_increment衝突風險,建議設定auto_increment_offset/auto_increment_increment錯開ID空間,或僅單主寫入、雙主備援。
function db_connect() {
$username = "replUser"; $password = "password";
$primary = "10.1.1.1"; $backup = "10.1.1.2";
if (!$link = @mysql_connect($primary, $username, $password)) {
$link = @mysql_connect($backup, $username, $password);
}
return $link;
}
缺點:主機掛掉時mysql_connect無超時參數,會長時間阻塞(TCP SYN重傳)。
function db_connect_plus() {
$username = "username"; $password = "password";
$primary = "10.1.1.1"; $backup = "10.1.1.2";
$timeout = 15; // 秒
// 檢測主庫 3306 端口可達性
if ($fp = @fsockopen($primary, 3306, $errno, $errstr, $timeout)) {
fclose($fp);
return @mysql_connect($primary, $username, $password);
}
// 主庫不可達,檢測備庫
if ($fp = @fsockopen($backup, 3306, $errno, $errstr, $timeout)) {
fclose($fp);
return @mysql_connect($backup, $username, $password);
}
return false; // 雙雙不可達
}
優勢:
SHOW SLAVE STATUS中Seconds_Behind_Master應接近0SLAVE START恢復