數(shù)據(jù)庫(kù)負(fù)載均衡功能優(yōu)化代碼
通過(guò)MySQL負(fù)載均衡功能的設(shè)置文章,相信大家已經(jīng)基本上對(duì)一些設(shè)置有所了解了,那么現(xiàn)在我們?cè)趯?duì)網(wǎng)絡(luò)域名服務(wù)器和數(shù)據(jù)庫(kù)優(yōu)化做一下詳細(xì)介紹。其中包括了相關(guān)內(nèi)容的代碼配置。
配置網(wǎng)絡(luò)DNS服務(wù)器
在BIND DNS服務(wù)器中,為三臺(tái)從屬服務(wù)器Slave配置同一個(gè)名字,客戶端的查詢檢索操作將由DNS服務(wù)器定向到其中的一臺(tái)Slave。因此,對(duì)于同一名字,不同的客戶端會(huì)定向到不同的地址,訪問(wèn)不同的MySQL服務(wù)器,從而達(dá)到負(fù)載均衡功能實(shí)現(xiàn)的目的。假設(shè)用戶為三臺(tái)Slave分配的DNS名字為mysqlslave.yourdomain,DNS服務(wù)器區(qū)域文件/var/named/yourdomain.zone中應(yīng)包含如下數(shù)據(jù)項(xiàng):
sqlmaster.yourdomain. IN A 192.168.1.100
sqlslave1.yourdomain. IN A 192.168.1.101
sqlslave2.yourdomain. IN A 192.168.1.102
sqlslave3.yourdomain. IN A 192.168.1.103
sqlslave IN CNAME sqlslave1
sqlslave IN CNAME sqlslave2
sqlslave IN CNAME sqlslave3
當(dāng)客戶端進(jìn)行查詢操作時(shí),提交給主機(jī)sqlslave.yourdomain的請(qǐng)求將由DNS服務(wù)器隨機(jī)定向到三臺(tái)Slave中的一臺(tái),由其執(zhí)行查詢作業(yè),返回結(jié)果。從而在三臺(tái)Slave之間實(shí)現(xiàn)查詢級(jí)別的負(fù)載均衡功能。
應(yīng)用系統(tǒng)程序代碼優(yōu)化
實(shí)際應(yīng)用中,對(duì)數(shù)據(jù)庫(kù)的寫入操作相對(duì)查詢操作少得多,因此,優(yōu)化應(yīng)用程序的數(shù)據(jù)庫(kù)連接代碼,把寫入操作定向到Master服務(wù)器,查詢操作定向到Slave服務(wù)器,提供主服務(wù)器和從屬服務(wù)器之間更新、查詢的負(fù)載均衡功能。本文以PHP數(shù)據(jù)庫(kù)連接代碼為例,簡(jiǎn)要介紹代碼優(yōu)化方法。
(1).準(zhǔn)備不同的數(shù)據(jù)庫(kù)連接配置文件
準(zhǔn)備兩個(gè)數(shù)據(jù)庫(kù)連接文件mysql_connect_master.php和mysql_connect_slave.php,其文件內(nèi)容如下:
mysql_connect_master.php文件的內(nèi)容:
// Connect to the Database Server
$linkID = @mysql_connect("sqlmaster.yourdomain", "user", "password") or die("Sorry, could not connect to the database!");
// Select the Database
@mysql_select_db("repl_db") or die("Sorry, Could not select database!");
?>
mysql_connect_slave.php文件的內(nèi)容:
// Connect to the Database Server
$linkID = @mysql_connect("sqlslave.yourdomain", "user", "password") or die("Sorry, could not connect to the database!");
// Select the Database
@mysql_select_db("repl_db") or die("Sorry, Could not select database!");
?>
(2).優(yōu)化程序SQL語(yǔ)句代碼
對(duì)應(yīng)用程序中訪問(wèn)數(shù)據(jù)庫(kù)的代碼段做出如下優(yōu)化:
- ...
- // $sql is the query string to be committed to MySQL server.
- if ( stripos( $sql, " SELECT" ) )
- {
- include_once("./mysql_connect_slave.php");
- ...
- mysql_close();
- }
- else
- {
- include_once("./mysql_connect_master.php");
- ...
- mysql_close();
- }
- ...
- ?>
說(shuō)明:每當(dāng)向MySQL服務(wù)器提交數(shù)據(jù)庫(kù)操作時(shí),加入一個(gè)if-else判斷語(yǔ)句對(duì)變量$sql進(jìn)行判斷定向,如果是SELECT查詢操作,將其定向到從屬服務(wù)器Slave中的一個(gè);如果是其它更新語(yǔ)句,則將其定向到主服務(wù)器Master。此處代碼段是應(yīng)用系統(tǒng)實(shí)現(xiàn)負(fù)載均衡的關(guān)鍵,用戶務(wù)必根據(jù)自己實(shí)際情況,寫出準(zhǔn)確無(wú)誤的代碼。每次對(duì)數(shù)據(jù)庫(kù)操作完畢都要及時(shí)釋放數(shù)據(jù)庫(kù)連接,以免更新、查詢操作分別定向失敗,影響系統(tǒng)負(fù)載均衡功能。這樣做雖然在一定程度上增加Web服務(wù)器或應(yīng)用服務(wù)器的開銷,但與MySQL服務(wù)器集群負(fù)載均衡功能帶來(lái)的大幅性能提升及冗余容錯(cuò)特性相比,這個(gè)開銷絕對(duì)是物超所值!