2011-11-22 104 views
0

我正在使用PHP與複製的MySQL數據庫。數據庫複製:PHP中的智能數據庫選擇?

我想做一些數據庫負載平衡。目前我有比較簡陋:

$ran = rand(1,10); 
if ($ran < 5) { 
    $db = '10.0.0.2:3306'; 
} else { 
    $db = '10.0.0.3:3306'; 
} 
// connect to the database 
$con = mysql_connect($db,'elastic1','oag4Chai') 
    or die('Could not connect to the server!'); 

但是很顯然,如果數據庫的人下來,那麼我們的網頁會顯示錯誤消息,一半的時間。

是否有一個更強大的方法來做到這一點 - 即檢查連接之前數據庫是否已啓動?

它可能只是一個try/catch語句,我猜,或者我可以做一些更復雜的負載平衡 - 感激地收到建議。

+0

可能相關:http://stackoverflow.com/questions/7278163/how-to-code-php-mysql-class-換主和從站 - 設置 – simshaun

回答

2

它不是網頁顯示錯誤,它的你

die('Could not connect to the server!') 

die()無關,在「真正的代碼」做時下。

$ran = rand(1,10); 
if ($ran < 5) { 
    $db = '10.0.0.2:3306'; 
} else { 
    $db = '10.0.0.3:3306'; 
} 
// connect to the database 
$con = mysql_connect($db,'elastic1','oag4Chai'); 
if (!$con) { /* Connect to the other one */ } 
0

這是非常簡陋......但如果你的數據庫服務器聯機,並在某種自動化過程的下線,我想有一個過程創建/刪除某種鎖定文件的Web服務器上在某個地點。只需要腳本檢查是否存在鎖定文件,然後再決定將哪個數據庫服務器發送給用戶。這會減少向DB服務器發出網絡請求的開銷,以便在每次發出請求時檢查它是否在線。

如果您的數據庫服務器在您不知情的情況下實際崩潰並且您的鎖定文件仍然表明服務器處於聯機狀態,那麼您運氣不佳並且可能會遇到一些問題。也許每分鐘cronjob測試數據庫服務器是否聯機,然後相應地操作鎖定文件。

1

首先 - 我個人認爲這不是一個PHP腳本的好主意。

如果你能買得起,我會考慮以下幾點:服務器

  • 監控可用性(SNMP,Nagios的?)
  • 使用DNS輪循你讀的奴隸(低TTL,便於根據監測

更新時,一個向下)

  • 直視mysql-proxy並更新其配置如果你想有一個PHP-搜索解決方案n,我會實現斷路器模式:

    1. 異步進程檢查MySQL服務器的可用性(例如,它是mysqli_connect()'s)。這可以是通過cron運行的腳本(每分鐘或更短的時間間隔)。
    2. 此進程的狀態保存到緩存中(單服務器:APC,多個:memcached或redis)
    3. 您的PHP代碼首先檢查緩存,然後連接。如果您願意,您可以隨機選擇(或使用基於會話ID或用戶ID等的算法)跨越可用服務器。

    我個人很喜歡DNS的想法。