国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

使用MySQL內(nèi)建復(fù)制功能來最佳化可用性

2024-07-24 12:56:11
字體:
供稿:網(wǎng)友
使用mysql內(nèi)建復(fù)制功能來最佳化可用性
2001-10-05 21:31

發(fā)布者:fei 閱讀次數(shù):142
在soundbreak我們每天24小時不間斷地播放實況音頻和視頻,所以對于mysql的新增的復(fù)制特性,我們不能做出很令人信服的測試。通過測試我們發(fā)現(xiàn),可以使用這個特性來與備份數(shù)據(jù)庫服務(wù)器保持數(shù)據(jù)同步,這樣當主服務(wù)器因為某種原因處理失效時,能夠使用備份機處理所有的查詢。對于這樣的要求,配置兩臺服務(wù)器并不困難。我將詳細討論整個處理過程,同時討論一下當主服務(wù)器失效時,如何使用php來重定向查詢。

  mysql內(nèi)部復(fù)制功能是建立在兩個或兩個以上服務(wù)器之間,通過設(shè)定它們之間的主-從關(guān)系來實現(xiàn)的。其中一個作為主服務(wù)器,其它的作為從服務(wù)器。我將詳細討論如何配置兩臺服務(wù)器,將一個設(shè)為主服務(wù)器,另一個設(shè)為從服務(wù)器。并且描述一下在它們之間進行切換的處理過程。我是在mysql的3.23.23版本上進行的配置設(shè)置過程,并且也是在這個版本上進行的測試。mysql開發(fā)人員建議最好使用最新版本,并且主-從服務(wù)器均使用相同的版本。同時mysql 3.23版本仍然是beta測試版,而且這個版本可能不能向下兼容。所以因為這個原因,在實際的網(wǎng)站中,我現(xiàn)在還沒有使用這個版本。擁有容錯能力具有一個好處是,在不需中斷任何查詢的情況下,對服務(wù)器進行升級。

第一步:配置主服務(wù)器
  在這篇文章的剩下篇幅中,我將指定兩臺服務(wù)器。a(ip為10.1.1.1)作為主服務(wù)器(簡稱為主機)。b(ip為10.1.1.2)作為后備服務(wù)器(簡稱為備機)。

  mysql的復(fù)制功能的實現(xiàn)過程為:備機(b)與主機(a)連接,然后讀出主機的二進制更新日志,再將發(fā)生的變化合并到自已的數(shù)據(jù)庫中。備機需要一個用戶帳號來與主機連接,所以在主機上創(chuàng)建一個帳號,并只給它file權(quán)限,如下操作:

grant file on *.* to [email protected] identified by password;

  為了備機能夠與主機連接,要在主機上運行flush privileges,不過不要擔(dān)心,因為我們將在下面的步驟中停掉服務(wù)器。

  現(xiàn)在我們需要主機數(shù)據(jù)庫的一個快照,并且對主機進行配置,允許生成二進制的更新日志。首先編輯my.cnf文件,以便允許二進制更新日志,所以在[mysqld]部分的下面某個地方增加一行:log-bin。在下一次服務(wù)器啟動時,主機將生成二進制更新日志(名為:<主機名>-bin.<增量序號#>)。為了讓二進制更新日志有效,關(guān)閉mysql服務(wù)程序,然后將主機上的所有數(shù)據(jù)庫目錄到另一個目錄中,接著重新啟動mysqld。
請確定得到了所有數(shù)據(jù)庫,否則在進行復(fù)制時,如果一個表在主機上存在但在備機上不存在,將因為出錯而退出。現(xiàn)在你已經(jīng)得到了數(shù)據(jù)的快照,和一個從建立快照以來的二進制日志,上面記錄著任何對數(shù)據(jù)庫的修改。請注意mysql數(shù)據(jù)文件(*.myd,*.myi和*.frm)是依賴于文件系統(tǒng)的,所以你不能僅僅進行文件傳輸,如從solaris到linux。如果你處于一個異種的服務(wù)器環(huán)境,你將不得不使用mysqldump實用程序或其它的定制腳本來得到數(shù)據(jù)快照。

第二步:配置備機
  讓我們繼續(xù)。停掉備機上的mysql服務(wù)程序,并且把從主機上拷貝來的數(shù)據(jù)庫目錄移到備機上的data目錄下。請確認將目錄的擁有者和屬組改變?yōu)閙ysql用戶相應(yīng)值,并且修改文件模式為660(只對擁有者和屬組可讀、可寫),目錄本身為770(只對擁有者和屬組可讀、可寫和可執(zhí)行)。

  繼續(xù)。在備機上啟動mysql服務(wù)程序,確認mysql工作正常。運行幾個select查詢(不要update或insert查詢),看一看在第一步中得到的數(shù)據(jù)快照是否成功。接著,在測試成功后關(guān)掉mysql服務(wù)程序。

  在備機上配置需要訪問的主機,以便接收主機的更改。所以需要編輯務(wù)機上的my.cnf文件,在[mysqld]部分中增加下面幾行:

master-host=10.1.1.1
master-user=replicate
master-password=password

  在啟動備機服務(wù)程序后,備機服務(wù)程序?qū)⒉榭丛趍y.cnf文件中所指定的主機,查看是否有改變,并且將這些改變合并到自已的數(shù)據(jù)庫中。備機保持了主機的更新記錄,這些記錄是從主機的master.info文件中接收下來的。備機線程的狀態(tài)可以通過sql命令show slave-status看到。在備機上處理二進制日志中如果
發(fā)生錯誤,都將導(dǎo)致備機線程的退出,并且在*.err的日志文件中生成一條信息。然后錯誤可以被改正,接著可以使用sql語句slave start來重新啟動備機線程。線程將從主機二進制日志處理中斷的地方繼續(xù)處理。

  至此,在主機上所發(fā)生的數(shù)據(jù)改變應(yīng)該已經(jīng)復(fù)制到備機上了,要測試它,你可以在主機上插入或更新一條記錄,而在備機上選擇這條記錄。

  現(xiàn)在我們擁有了從a機到b機的這種主-從關(guān)系,這樣當a機可能當機的時候,允許我們將所有的查詢重定向到b機上去,但是當a機恢復(fù)時,我們沒有辦法將發(fā)生的改變恢復(fù)到a機中去。為了解決這個問題,我們創(chuàng)建從b機到a機的主-從關(guān)系。

第三步:創(chuàng)建相互的主從關(guān)系
  首先在b機上的my.cnf文件中,在[mysqld]部分中加入log-bin,接著重新啟動mysqld,然后創(chuàng)建可在它的上面執(zhí)行復(fù)制功能的用戶帳號,使用:

grant file on *.* to [email protected] identified by password;

  在b機上運行flush privileges命令,以便裝入在加入復(fù)制用戶后的新的授權(quán)表,接著回到a機上,在它的my.cnf中加入下面幾行:

master-host=10.1.1.2
master-user=replicate
master-password=password

  在重啟a機的服務(wù)程序之后,現(xiàn)在我們一擁有了在a機與b機之間的相互主-從關(guān)系。不管在哪個服務(wù)器上更新一條記錄或插入一條記錄,都將被復(fù)制到另一臺服務(wù)器上。要注意的是:我不敢確定一個備機合并二進制日志變化的速度有多快,所以用這種方法來進行插入或更新語句的負載平衡可能不是一個好辦法。

第四步:修改你的數(shù)據(jù)庫連接程序
  既然你已經(jīng)在a機和b機之間建立了一個相互的關(guān)系,你需要修改數(shù)據(jù)庫連接程序,以便從這種方式中得到好處。下面的函數(shù)首先試圖與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;
}

?>

  我在兩種情況下對使用了上面技術(shù)的數(shù)據(jù)庫連接建立過程進行了測試,一種是主mysql服務(wù)程序關(guān)閉了,但是服務(wù)器還在運行,另一種情況是主服務(wù)器關(guān)閉了。如果只是mysqld關(guān)閉了,連接會馬上轉(zhuǎn)向備機;但是如果整個服務(wù)器關(guān)閉了,就出現(xiàn)了無限地等待(兩分鐘后我放棄了跟蹤 -- 很短的注意跨度),因為php在查找一個不存在的服務(wù)器。不幸地是,不象fsockopen函數(shù),mysql_connect函數(shù)沒有一個超時參數(shù),然而我們可以使用fsockopen來模擬一個超時處理。

第五步:一個改進的數(shù)據(jù)庫連接程序

/********************************************************
function db_connect_plus()

returns a link identifier on success, or false on error
********************************************************/
function db_connect_plus(){
$username = "username";
$password = "password";
$primary = "10.1.1.1";
$backup = "10.1.1.2";
$timeout = 15; // timeout in seconds

if($fp = fsockopen($primary, 3306, &$errno, &$errstr, $timeout)){
fclose($fp);
return $link = mysql_connect($primary, $username, $password);
}
if($fp = fsockopen($secondary, 3306, &$errno, &$errstr, $timeout)){
fclose($fp);
return $link = mysql_connect($secondary, $username, $password);
}

return 0;
}

?>

  這個新改進的函數(shù)向我們提供了一個可調(diào)的超時特性,這正是mysql_connect函數(shù)所缺少的。如果連接立即失敗,這種情況如機器"活"著,但mysqld"當"掉了,函數(shù)立即移到第二個服務(wù)器。上面的函數(shù)相當健壯,在試圖進行連接之前先測試一下,查看服務(wù)程序是否在指定端口進行監(jiān)聽,讓你的腳本在一段可接受的時間段后超時,允許你適當?shù)貙Τ鲥e情況進行處理。如果你修改了缺省端口3306,請保證對端口號進行修改。

結(jié)論和意見
  首先,要確定得到了一個完整的數(shù)據(jù)快照。如果忘記拷貝一個表或數(shù)據(jù)庫將導(dǎo)致備機線程序停止。生成快照的時刻是很關(guān)健的。你應(yīng)該確保在拷貝數(shù)據(jù)文件之前二進制日志功能是無效的。如果在得到快照之前就允許了二進制日志功能,備機的線程可能會停止,原因就是當線程試圖導(dǎo)入重要的記錄時,可能會由于主鍵重復(fù)而停止。最好就是接照第二部分所討論的處理辦法來做:關(guān)閉-拷貝-允許二進制日志功能重啟。

  你可能想要按照最初的一種方式來配制復(fù)制處理,并且在合適的時間關(guān)注備機,確保備機與主機保持同步。

  我沒有測試過一個使用了復(fù)制特性的系統(tǒng)的負載平衡處理性能,但是我會靈活地使用這樣系統(tǒng)來平衡插入和更新。例如,如果在兩臺服務(wù)器上兩條記錄都給出了同一個auto_increment值,這種情況備機線程會在哪一條記錄上停掉呢?象這樣的問題將會讓負載平衡作為只讀的處理,一臺服務(wù)器處理所有的插入和更新,同時一組備機(是的,你可以有多個與主機分離的備機)處理所有的選擇。

  我非常高興,mysql已經(jīng)具備了復(fù)制系統(tǒng)的某些功能,并且配置很簡單。使用它,你就可以開始針對失控的事件提供額外的安全措施了。我僅僅涉及了復(fù)制特性,這個我已經(jīng)測試并且使用了,但是在mysql的在線文檔中的第11部分有中更詳細的說明。



--------------------------------------------------------------------------------

譯者的話:

  由于我原來使用的是3.22版的mysql,所以為了測試一下我只好下載了3.23.24版的最新程序。而且因為只有一臺機器,我只是增加了二進制日志的設(shè)置。不過,正如本文所說,的確有文件生成。如果大家對此感興趣只好請自行測試了。另外,在最新的mysql的使用手冊中,我發(fā)現(xiàn)這個復(fù)制功能是在3.23.15版以后才有的,請大家檢查自已的mysql的版本。同時,文中關(guān)于二進制日志的設(shè)置是說在my.cnf中設(shè)置的。在我使用的3.23.24版本中,手冊上說可以有三個文件進行參數(shù)設(shè)置,分別為windows目錄下的my.ini文件,c:my.cnf和c:mysqldatamy.cnf中可以設(shè)置。我在設(shè)置log-bin時(不需要先設(shè)log參數(shù))是使用mysql自帶的
winmysqladmin軟件進行設(shè)置的,并且在my.ini中設(shè)定的,與文中不同,請大家自行測試。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 汕尾市| 德兴市| 玉屏| 农安县| 古蔺县| 罗江县| 加查县| 岳普湖县| 兰西县| 漠河县| 阿尔山市| 碌曲县| 闽清县| 尖扎县| 海丰县| 高青县| 台中县| 金阳县| 缙云县| 阳山县| 临沭县| 金山区| 济阳县| 乌鲁木齐市| 开封县| 通化市| 南木林县| 钟祥市| 镇坪县| 来凤县| 志丹县| 永吉县| 新绛县| 大石桥市| 桃江县| 安溪县| 五家渠市| 兴义市| 曲周县| 潮安县| 渭源县|