數據庫中實現負載均衡功能的注意事項和故障分析
通過負載均衡功能在MySQL數據庫中的實現,我們在此在為大家補充一些知識。我們在部署服務器負載均衡功能時,需要注意一些問題,以及在部署過程和實現過程中常遇到的故障問題進行了分析。
注意事項
正確部署實現具有負載均衡功能的MySQL服務器集群必須注意以下事項:
(1). MySQL數據庫復制(replication)特性是核心
此處的復制不是簡單的copy,從屬服務器啟動兩個線程(thread):I/O線程和SQL線程,I/O線程接收主服務器對參與復制數據庫的更新操作事件(event),并記入自己的中繼二進制更新日志文件(hostname-relay-bin.00000n),由SQL線程將更新操作寫入自己的數據庫表項。主從服務器之間復制的不是具體的數據內容,而是具體的以二進制格式記錄的操作事件,因而在一定程度上實現主從服務器之間的數據同步。(這種復制類似于生物學意義上的按基因復制,在英語中replication的主要詞義就是指該種復制。)
(2). 復制的復雜性
主從數據庫服務器間的replication要求Master與Slave上的MySQL版本最好一致,主從服務器必須設置相同的字符集,否則很容易造成復制失敗。主服務器上更新權限表內容的FLUSH語句不會被復制[8]。
(3). 按照范式化要求設計數據庫
生產環境下基于MySQL服務器的應用系統要想穩定運行,按范式化設計系統數據庫是基本要求,具體內容可參考相關書籍。
(4). 打開數據庫服務器的遠程用戶連接功能
打開主從服務器的遠程用戶連接是實現更新、查詢操作分別定向的必要條件,否則,來自應用服務器的連接請求失敗,影響系統應用正常運行。
(5). 負載均衡功能的實現需要良好的團隊合作
BIND DNS服務器實現了從屬服務器Slave之間的負載均衡,Slave和Master之間的負載均衡則由應用系統開發人員在程序代碼級實現。整個系統的性能提升和冗余容錯需要網絡管理和應用系統開發團隊之間的良好合作,否則負載均衡功能的實現就會失敗。
常見問題
(1). 如何估算MySQL服務器集群的性能提升量?
針對本文采用的結構模式,可對應用系統整體性能提升做出大致估算。假設應用系統寫操作占10%,讀操作占90%,寫操作耗時是讀操作的2倍,系統的吞吐量(throughput)為T(用reads/s讀操作次數/秒來衡量)。把寫操作線性轉換為讀操作,則有:
T= 2Xwrites + 9Xwrites ==>writes=T/11① (不采用主從復制模式,讀寫操作集中到一個服務器上)
T= 2Xwrites + 9Xwrites/N ==> writes=T/(2+9/N)② (采用一對多的主從復制模式,讀操作在從屬服務器,寫操作在主服務器)
其中,writes為系統單位時間內所能承受的最大寫操作次數,N為從屬服務器個數,N大于等于2。在不采用主從復制模式時,系統性能writes=T/11;采用本文一對三的復制模式時,系統性能writes=T/5。采用負載均衡模式與不采用系統性能之比為11:5,即2.2:1,考慮到應用服務器的額外開銷,系統整體性能提升了整整1倍!從②式可以看出,系統整體性能理論極限為T/2,當然在實際生產環境中不可能達到。具體部署時用戶可以根據自己的實際情況估算出合理的從屬服務器數量,主要影響因素是網絡帶寬和機器整體性能[9]。
(2). 如何應對主從服務器崩潰?
當某臺從屬服務器崩潰時,修復故障重啟后重新連接到主服務器,根據其master.info文件更新其數據,保持與主服務器的數據同步。如果主服務器崩潰,在某一從屬服務器上執行STOP SLAVES; GRANT REPLICATION SLAVE ON *.* repl_db TO ‘repl'@'%' IDENTIFIED BY‘g00r002b';RESET MASTER;這三個SQL語句,由于從屬服務器已啟動了二進制更新日志功能,因此具備了角色轉換的必要條件。更改其主機名、IP地址及server-id與Master一樣,重啟MySQL服務器,系統開始正常對外提供服務。其它兩臺從屬服務器則不需執行任何操作,繼續執行replication過程。BIND DNS服務器和應用程序也不需做任何調整,繼續對系統用戶提供不間斷服務。主服務器排除故障恢復正常后,將其網絡配置改為與現有Master轉換角色之前一樣的配置,重啟MySQL服務,將其角色轉換為從屬服務器。也就是說,整個集群機器的角色可以相互循環轉換,提高系統的冗余性和可靠性。在此需要注意的是,在應用系統調試運行正常之后,在Slave角色服務器的/etc/my.cnf文件[mysqld]段加入slave-skip-errors=all,保證集群之間復制(replication)的正常運行。
結束語
部署與實現具有負載均衡功能的MySQL服務器集群是一項復雜的系統工程,需要多方面良好的協同合作才能做好。服務器的搭建配置、BIND DNS服務器的配置部署,以及應用系統程序的開發都要緊緊圍繞實現MySQL服務器集群負載均衡功能這個目標。必須對主服務器的運行狀態進行動態監控,如果發生故障,立即執行角色轉換過程,確保為終端用戶提供可靠、不間斷的服務。可以針對具體系統環境寫出監控腳本或程序,確保系統的可靠性與穩定性。