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

FreeBSD 下 MySQL 主從集群負載均衡部署:復制架構、DNS 輪詢、PHP 讀寫分離、故障切換全流程

     編輯:MySQL 資料庫相關知識

架構模型

  • 1 Master(寫入)+ 3 Slave(讀取/備份)
  • Master/Slave 通過 Binlog 復制同步
  • DNS Round-Robin 將查詢分發到 3 Slave
  • PHP 代碼層面實現讀寫分離
  • Master 故障時,提升 1 Slave 為新 Master,其餘 Slave 重新指向

系統部署要點

  • FreeBSD 7.0 最小化安裝,開啟 SSH、禁用 Root 遠程登錄
  • 安裝 GNU Make(gnumake-3.81),源碼編譯 MySQL 5.1.30
  • 配置 /etc/my.cnf:Master log-bin + server-id=1;Slave server-id=2/3/4 + --log-bin 啟動
  • 建立復制用戶 repl,GRANT REPLICATION SLAVE
  • Master FLUSH TABLES WITH READ LOCK → SHOW MASTER STATUS → tar 備份數據 → UNLOCK TABLES
  • Slave 解壓數據 → CHANGE MASTER TO → START SLAVE → SHOW SLAVE STATUS\G 驗證

DNS 負載均衡配置

sqlslave IN CNAME sqlslave1
sqlslave IN CNAME sqlslave2
sqlslave IN CNAME sqlslave3

客戶端查詢 sqlslave.yourdomain 隨機解析到 3 台 Slave。

PHP 讀寫分離代碼

// mysql_connect_master.php
$link = @mysql_connect("sqlmaster.yourdomain", "user", "pass");
@mysql_select_db("repl_db");

// mysql_connect_slave.php
$link = @mysql_connect("sqlslave.yourdomain", "user", "pass");
@mysql_select_db("repl_db");

// 業務邏輯
if (stripos($sql, "SELECT")) {
    include_once("./mysql_connect_slave.php");
} else {
    include_once("./mysql_connect_master.php");
}
mysql_query($sql);
mysql_close();

故障切換演練

  1. Master 掛掉
  2. 選一 Slave 執行:STOP SLAVE; GRANT REPLICATION SLAVE ...; RESET MASTER;
  3. 修改其主機名/IP/server-id 為原 Master 值,重啟 MySQL
  4. 其餘 Slave 執行 CHANGE MASTER TO 指向新 Master
  5. DNS、應用代碼無需變更,服務不中斷
  6. 舊 Master 修復後降級為 Slave 加入集群

性能估算

假設寫 10%、讀 90%、寫耗時 2× 讀,3 Slave 理論吞吐提升 2.2 倍(11:5),扣除應用層開銷仍提升 ~1 倍。

關鍵注意事項

  • 主從版本、字符集必須一致
  • FLUSH PRIVILEGES 不復制,需手動同步權限變更
  • 生產環境 Slave 配置 slave-skip-errors=all 防複製中斷
  • 團隊協作:網絡組管 DNS,開發組管代碼路由,運維組管監控切換
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved