您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“如何用MySQL內(nèi)建復(fù)制功能來優(yōu)化可用性”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
MySQL內(nèi)部復(fù)制功能是建立在兩個(gè)或兩個(gè)以上服務(wù)器之間,通過設(shè)定它們之間的主-從關(guān)系來實(shí)現(xiàn)的。其中一個(gè)作為主服務(wù)器,其它的作為從服務(wù)器。我將詳細(xì)討論如何配置兩臺(tái)服務(wù)器,將一個(gè)設(shè)為主服務(wù)器,另一個(gè)設(shè)為從服務(wù)器。并且描述一下在它們之間進(jìn)行切換的處理過程。
怎樣用MySQL內(nèi)建復(fù)制功能來優(yōu)化可用性
第一步:配置主服務(wù)器
在這篇文章的剩下篇幅中,我將指定兩臺(tái)服務(wù)器。A(IP為10.1.1.1)作為主服務(wù)器(簡稱為主機(jī))。B(IP為10.1.1.2)作為后備服務(wù)器(簡稱為備機(jī))。
MySQL的復(fù)制功能的實(shí)現(xiàn)過程為:備機(jī)(B)與主機(jī)(A)連接,然后讀出主機(jī)的二進(jìn)制更新日志,再將發(fā)生的變化合并到自已的數(shù)據(jù)庫中。備機(jī)需要一個(gè)用戶帳號(hào)來與主機(jī)連接,所以在主機(jī)上創(chuàng)建一個(gè)帳號(hào),并只給它FILE權(quán)限,如下操作:
GRANT FILE ON *.* TO replicate@10.1.1.2 IDENTIFIED BY 'password';
為了備機(jī)能夠與主機(jī)連接,要在主機(jī)上運(yùn)行'FLUSH PRIVILEGES',不過不要擔(dān)心,因?yàn)槲覀儗⒃谙旅娴牟襟E中停掉服務(wù)器。
現(xiàn)在我們需要主機(jī)數(shù)據(jù)庫的一個(gè)快照,并且對主機(jī)進(jìn)行配置,允許生成二進(jìn)制的更新日志。首先編輯'my.cnf'文件,以便允許二進(jìn)制更新日志,所以在[mysqld]部分的下面某個(gè)地方增加一行:'log-bin'。在下一次服務(wù)器啟動(dòng)時(shí),主機(jī)將生成二進(jìn)制更新日志(名為:<主機(jī)名>-bin.<增量序號(hào)#>)。為了讓二進(jìn)制更新日志有效,關(guān)閉MySQL服務(wù)程序,然后將主機(jī)上的所有數(shù)據(jù)庫目錄到另一個(gè)目錄中,接著重新啟動(dòng)mysqld。
請確定得到了所有數(shù)據(jù)庫,否則在進(jìn)行復(fù)制時(shí),如果一個(gè)表在主機(jī)上存在但在備機(jī)上不存在,將因?yàn)槌鲥e(cuò)而退出?,F(xiàn)在你已經(jīng)得到了數(shù)據(jù)的快照,和一個(gè)從建立快照以來的二進(jìn)制日志,上面記錄著任何對數(shù)據(jù)庫的修改。請注意MySQL數(shù)據(jù)文件(*.MYD,*.MYI和*.frm)是依賴于文件系統(tǒng)的,所以你不能僅僅進(jìn)行文件傳輸,如從Solaris到Linux。如果你處于一個(gè)異種的服務(wù)器環(huán)境,你將不得不使用mysqldump實(shí)用程序或其它的定制腳本來得到數(shù)據(jù)快照。
第二步:配置備機(jī)
讓我們繼續(xù)。停掉備機(jī)上的MySQL服務(wù)程序,并且把從主機(jī)上拷貝來的數(shù)據(jù)庫目錄移到備機(jī)上的data目錄下。請確認(rèn)將目錄的擁有者和屬組改變?yōu)镸ySQL用戶相應(yīng)值,并且修改文件模式為660(只對擁有者和屬組可讀、可寫),目錄本身為770(只對擁有者和屬組可讀、可寫和可執(zhí)行)。
繼續(xù)。在備機(jī)上啟動(dòng)MySQL服務(wù)程序,確認(rèn)MySQL工作正常。運(yùn)行幾個(gè)select查詢(不要update或insert查詢),看一看在第一步中得到的數(shù)據(jù)快照是否成功。接著,在測試成功后關(guān)掉MySQL服務(wù)程序。
在備機(jī)上配置需要訪問的主機(jī),以便接收主機(jī)的更改。所以需要編輯務(wù)機(jī)上的'my.cnf'文件,在[mysqld]部分中增加下面幾行:
master-host=10.1.1.1
master-user=replicate
master-password=password
在啟動(dòng)備機(jī)服務(wù)程序后,備機(jī)服務(wù)程序?qū)⒉榭丛?#39;my.cnf'文件中所指定的主機(jī),查看是否有改變,并且將這些改變合并到自已的數(shù)據(jù)庫中。備機(jī)保持了主機(jī)的更新記錄,這些記錄是從主機(jī)的'master.info'文件中接收下來的。備機(jī)線程的狀態(tài)可以通過sql命令'SHOW SLAVE-STATUS'看到。在備機(jī)上處理二進(jìn)制日志中如果
發(fā)生錯(cuò)誤,都將導(dǎo)致備機(jī)線程的退出,并且在*.err的日志文件中生成一條信息。然后錯(cuò)誤可以被改正,接著可以使用sql語句'SLAVE START'來重新啟動(dòng)備機(jī)線程。線程將從主機(jī)二進(jìn)制日志處理中斷的地方繼續(xù)處理。
至此,在主機(jī)上所發(fā)生的數(shù)據(jù)改變應(yīng)該已經(jīng)復(fù)制到備機(jī)上了,要測試它,你可以在主機(jī)上插入或更新一條記錄,而在備機(jī)上選擇這條記錄。
現(xiàn)在我們擁有了從A機(jī)到B機(jī)的這種主-從關(guān)系,這樣當(dāng)A機(jī)可能當(dāng)機(jī)的時(shí)候,允許我們將所有的查詢重定向到B機(jī)上去,但是當(dāng)A機(jī)恢復(fù)時(shí),我們沒有辦法將發(fā)生的改變恢復(fù)到A機(jī)中去。為了解決這個(gè)問題,我們創(chuàng)建從B機(jī)到A機(jī)的主-從關(guān)系。
怎樣用MySQL內(nèi)建復(fù)制功能來優(yōu)化可用性
第三步:創(chuàng)建相互的主從關(guān)系
首先在B機(jī)上的my.cnf文件中,在[mysqld]部分中加入'log-bin',接著重新啟動(dòng)mysqld,然后創(chuàng)建可在
它的上面執(zhí)行復(fù)制功能的用戶帳號(hào),使用:
GRANT FILE ON *.* TO replicate@10.1.1.1 IDENTIFIED BY 'password';
在B機(jī)上運(yùn)行'FLUSH PRIVILEGES'命令,以便裝入在加入復(fù)制用戶后的新的授權(quán)表,接著回到A機(jī)上,在
它的'my.cnf'中加入下面幾行:
master-host=10.1.1.2
master-user=replicate master-password=password
在重啟A機(jī)的服務(wù)程序之后,現(xiàn)在我們一擁有了在A機(jī)與B機(jī)之間的相互主-從關(guān)系。不管在哪個(gè)服務(wù)器上 更新一條記錄或插入一條記錄,都將被復(fù)制到另一臺(tái)服務(wù)器上。要注意的是:我不敢確定一個(gè)備機(jī)合并二進(jìn) 制日志變化的速度有多快,所以用這種方法來進(jìn)行插入或更新語句的負(fù)載平衡可能不是一個(gè)好辦法。
第四步:修改你的數(shù)據(jù)庫連接程序
既然你已經(jīng)在A機(jī)和B機(jī)之間建立了一個(gè)相互的關(guān)系,你需要修改數(shù)據(jù)庫連接程序,以便從這種方式中得 到好處。下面的函數(shù)首先試圖與A機(jī)連接,如果不能建立連接則與B機(jī)連接。
/ 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ù)庫連接建立過程進(jìn)行了測試,一種是主MySQL服務(wù)程序關(guān)閉了, 但是服務(wù)器還在運(yùn)行,另一種情況是主服務(wù)器關(guān)閉了。如果只是mysqld關(guān)閉了,連接會(huì)馬上轉(zhuǎn)向備機(jī);但是 如果整個(gè)服務(wù)器關(guān)閉了,就出現(xiàn)了無限地等待(兩分鐘后我放棄了跟蹤 -- 很短的注意跨度),因?yàn)镻HP在查 找一個(gè)不存在的服務(wù)器。不幸地是,不象fsockopen函數(shù),mysql_connect函數(shù)沒有一個(gè)超時(shí)參數(shù),然而我們 可以使用fsockopen來模擬一個(gè)超時(shí)處理。
第五步:一個(gè)改進(jìn)的數(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; }
>
這個(gè)新改進(jìn)的函數(shù)向我們提供了一個(gè)可調(diào)的超時(shí)特性,這正是mysql_connect函數(shù)所缺少的。如果連接 立即失敗,這種情況如機(jī)器"活"著,但mysqld"當(dāng)"掉了,函數(shù)立即移到第二個(gè)服務(wù)器。上面的函數(shù)相當(dāng)健壯, 在試圖進(jìn)行連接之前先測試一下,查看服務(wù)程序是否在指定端口進(jìn)行監(jiān)聽,讓你的腳本在一段可接受的時(shí)間 段后超時(shí),允許你適當(dāng)?shù)貙Τ鲥e(cuò)情況進(jìn)行處理。如果你修改了缺省端口3306,請保證對端口號(hào)進(jìn)行修改。
結(jié)論和意見
首先,要確定得到了一個(gè)完整的數(shù)據(jù)快照。如果忘記拷貝一個(gè)表或數(shù)據(jù)庫將導(dǎo)致備機(jī)線程序停止。生成 快照的時(shí)刻是很關(guān)健的。你應(yīng)該確保在拷貝數(shù)據(jù)文件之前二進(jìn)制日志功能是無效的。如果在得到快照之前就 允許了二進(jìn)制日志功能,備機(jī)的線程可能會(huì)停止,原因就是當(dāng)線程試圖導(dǎo)入重要的記錄時(shí),可能會(huì)由于主鍵 重復(fù)而停止。最好就是接照第二部分所討論的處理辦法來做:關(guān)閉-拷貝-允許二進(jìn)制日志功能重啟。
你可能想要按照最初的一種方式來配制復(fù)制處理,并且在合適的時(shí)間關(guān)注備機(jī),確保備機(jī)與主機(jī)保持同 步。
“如何用MySQL內(nèi)建復(fù)制功能來優(yōu)化可用性”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。