提示:MySQL內部復制功能是建立在兩個或兩個以上服務器之間,通過設定它們之間的主-從關系來實現的。其中一個作為主服務器,其它的作為從服務器。我將詳細討論如何配置兩台服務器,將一個設為主服務器,另一個設為從服務器。並且描述一下在它們之間進行切換的處理過程。我是
第三步:創建相互的主從關系
首先在B機上的my.cnf文件中,在[mysqld]部分中加入log-bin,接著重新啟動MySQLd,然後創建可在它的上面執行復制功能的用戶帳號,使用:
GRANT FILE ON *.* TO [email protected] IDENTIFIED BY passWord;
在B機上運行FLUSH PRIVILEGES命令,以便裝入在加入復制用戶後的新的授權表,接著回到A機上,在它的my.cnf中加入下面幾行:
master-host=10.1.1.2
master-user=replicate
master-password=passWord
在重啟A機的服務程序之後,現在我們一擁有了在A機與B機之間的相互主-從關系。不管在哪個服務器上更新一條記錄或插入一條記錄,都將被復制到另一台服務器上。要注意的是:我不敢確定一個備機合並二進制日志變化的速度有多快,所以用這種方法來進行插入或更新語句的負載平衡可能不是一個好辦法。
第四步:修改你的數據庫連接程序
既然你已經在A機和B機之間建立了一個相互的關系,你需要修改數據庫連接程序,以便從這種方式中得到好處。下面的函數首先試圖與A機連接,如果不能建立連接則與B機連接。
/********************************************************
function db_connect()
returns a link identifIEr on success, or false on error
********************************************************/
function db_connect(){
?$username = "replUser";
?$password = "passWord";
?$primary = "10.1.1.1";
?$backup = "10.1.1.2";
# attempt connection to primary
if(!?$link_id = @MySQL_connect(?$primary, ?$username, ?$passWord))
# attempt connection to secondary
?$link_id = @MySQL_connect(?$secondary, ?$username, ?$passWord)
return ?$link_id;
}
?>
我在兩種情況下對使用了上面技術的數據庫連接建立過程進行了測試,一種是主MySQL服務程序關閉了,但是服務器還在運行,另一種情況是主服務器關閉了。如果只是MySQLd關閉了,連接會馬上轉向備機;但是如果整個服務器關閉了,就出現了無限地等待(兩分鐘後我放棄了跟蹤 -- 很短的注意跨度),因為PHP在查找一個不存在的服務器。不幸地是,不象fsockopen函數,MySQL_connect函數沒有一個超時參數,然而我們可以使用fsockopen來模擬一個超時處理。