數據庫負載均衡功能優化代碼
通過MySQL負載均衡功能的設置文章,相信大家已經基本上對一些設置有所了解了,那么現在我們在對網絡域名服務器和數據庫優化做一下詳細介紹。其中包括了相關內容的代碼配置。
配置網絡DNS服務器
在BIND DNS服務器中,為三臺從屬服務器Slave配置同一個名字,客戶端的查詢檢索操作將由DNS服務器定向到其中的一臺Slave。因此,對于同一名字,不同的客戶端會定向到不同的地址,訪問不同的MySQL服務器,從而達到負載均衡功能實現的目的。假設用戶為三臺Slave分配的DNS名字為mysqlslave.yourdomain,DNS服務器區域文件/var/named/yourdomain.zone中應包含如下數據項:
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
當客戶端進行查詢操作時,提交給主機sqlslave.yourdomain的請求將由DNS服務器隨機定向到三臺Slave中的一臺,由其執行查詢作業,返回結果。從而在三臺Slave之間實現查詢級別的負載均衡功能。
應用系統程序代碼優化
實際應用中,對數據庫的寫入操作相對查詢操作少得多,因此,優化應用程序的數據庫連接代碼,把寫入操作定向到Master服務器,查詢操作定向到Slave服務器,提供主服務器和從屬服務器之間更新、查詢的負載均衡功能。本文以PHP數據庫連接代碼為例,簡要介紹代碼優化方法。
(1).準備不同的數據庫連接配置文件
準備兩個數據庫連接文件mysql_connect_master.php和mysql_connect_slave.php,其文件內容如下:
mysql_connect_master.php文件的內容:
// 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文件的內容:
// 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).優化程序SQL語句代碼
對應用程序中訪問數據庫的代碼段做出如下優化:
- ...
- // $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();
- }
- ...
- ?>
說明:每當向MySQL服務器提交數據庫操作時,加入一個if-else判斷語句對變量$sql進行判斷定向,如果是SELECT查詢操作,將其定向到從屬服務器Slave中的一個;如果是其它更新語句,則將其定向到主服務器Master。此處代碼段是應用系統實現負載均衡的關鍵,用戶務必根據自己實際情況,寫出準確無誤的代碼。每次對數據庫操作完畢都要及時釋放數據庫連接,以免更新、查詢操作分別定向失敗,影響系統負載均衡功能。這樣做雖然在一定程度上增加Web服務器或應用服務器的開銷,但與MySQL服務器集群負載均衡功能帶來的大幅性能提升及冗余容錯特性相比,這個開銷絕對是物超所值!