尹向東 王 娜 楊夢瑤
基于農業物聯網的數據庫集群系統優化設計
尹向東a王 娜b楊夢瑤a
(湖南科技學院 a.信息工程學院;b.傳媒學院,湖南 永州 425199)
設計一個適用于農業物聯網管理系統的數據庫集群系統優化方法,通過對實際農業生產環境中高訪問量、高峰值的應用特征分析,負載均衡模塊通過采用LVS算法來實現流量分發,代理模塊采用MyCat中間件實現寫讀分離以及Keepalived實現高可用保障服務安全穩定運行,最后數據庫服務器集群通過使用GTID數據復制形式來保障數據的一致性。通過測試表明,系統優化后性能與穩定性都得到了提高。
農業物聯網;數據庫集群;負載均衡
隨著物聯網技術的發展,數據采集量呈現指數級增長,這些數據不斷將數據庫存儲容量逼至上限,傳統的數據庫解決方案擴展性不夠高、彈性伸縮不足、硬件成本頗高的問題逐漸凸顯出來[1]。在實際農業物聯網環境中數據讀寫請求比例相差較大,為解決數據流量分發的問題,數據庫集群技術順勢而生。
現在國內許多行業都開發了有自身行業背景的數據庫集群技術,比較知名的有奇虎360的Atlas數據庫集群技術、華為的DDM數據庫集群技術等。因為其特殊的行業特色,其應用范圍受到很多限制。而國外的Oracle開發的MySQL集群中間件雖然應用很廣,但是價格比較昂貴[1],在這種背景下,MyCat應運而生,國內很多用戶使用MyCat,受到廣大開源數據庫集群用戶青睞。但是因為MyCat的開發時間不長,存在許多需要改進和優化的地方。總的來說國內數據庫集群技術的研究正處于發展階段,在農業物聯網領域可供研究和探索的空間還很大。
在數據庫集群中選用合理的負載均衡算法非常重要,Polepally等[2]通過選擇各項任務的關鍵參數,使用約束度量的方法實現集群負載均衡。王關政[3]使用采集集群中后臺服務器負載評價標準的方法,實現了服務器自定義動態權值負載均衡。朱莉[4]提出一種多模式融合服務器集群架構動態調整下負載均衡的同步方法。申澤星等[5]建立了一類基于動態調節的閉環負載分配策略。這些算法各有各的優勢與不足,與特定業務場景結合的程度不是很好。
依據農業物聯網管理系統的業務場景,分散在廣大區域的傳感器采集到海量數據,經過匯總集中后由代理節點統一發送到對應服務器,這時候就經常會出現大規模寫入數據庫集群的場景,對寫性能要求較高,而從服務器讀取數據的場景比寫入操作就要少很多。用MyCat中間件技術實現數據寫讀分離,選擇合理的負載均衡算法,將數據壓力分散存儲到各節點,設計實現一種優化的、高可用性數據庫集群系統是很有研究價值的。
負載均衡方案要根據具體的使用場景、業務環境來選取,該方案能夠支持3種算法:服務器集群加權輪詢算法;集群最少服務器連接數算法;緩存集群中局部最少鏈接算法。
1)服務器集群加權輪詢算法
加權輪詢給每臺服務器附加一定程度上的權重算法,可以依據服務器節點處理能力高低來選擇合適的權重值。
2)集群最少服務器連接數算法
根據服務器當前活躍連接數,動態選取當前狀況下連接數最少的服務器來響應客戶端請求并合理分發到服務器上,調度服務器可以依據真實服務器負載情況動態調整其權值。
3)緩存集群中局部最少鏈接算法
該算法是針對請求報文的目標地址的調度請求,由于在緩存集群中,客戶請求報文的目標IP地址是變化的,所以目前主要用于緩存集群。
現在市場上使用最為廣泛的負載均衡方案包括HAproxy、Nginx和LVS,其中LVS(linux virtual server)是一種開源的負載均衡方案,除了能支持上述三種算法外,另外還支持近十種負載均衡算法,采用Keepalived+LVS技術使得自身具有熱備方案,具有良好的可靠性、可擴展性和可操作性[6]。
通過對農業物聯網實際開發環境、實際業務使用對象規模以及軟件會話并發能力等方面的需求分析,本文決定采用LVS來實現負載均衡。
為了保障數據的可靠穩定,就要運用到高可用技術。其中業務切換是高可用軟件能夠保障系統安全穩定運行的核心技術,即如果集群中節點發生故障,其備用節點將在幾秒內接管它的職責,對外提供透明服務,從而降低由節點性能故障等所導致的損失。
Keepalived使用VRRP協議方式,與LVS完美兼容,是用于實現LVS服務高可用方案。除了可以對服務器進行健康狀況檢測和故障隔離功能之外,還具有高可用集群的功能。其中健康檢測是Keepalived的核心功能之一,就是利用TCP三次握手、HTTP請求、ICMP請求等方式對后端真實服務器進行檢測,而故障節點自動切換主要應用于2個高可用節點之上,且配置了主備模式的負載均衡服務器。通過VRRP協議,當master出現問題時,master心跳檢測不到,此時就會把流量分發到Slave節點繼續提供相應業務,保障服務的安全穩定運行。
數據庫集群比較常用的兩種體系結構為共享存儲結構、無共享存儲結構。共享存儲結構就是讓集群中所有節點共同使用同一數據資源,從根源上避免數據不一致引起的問題。而對于沒有使用共享存儲的集群來說,確保數據的一致性就成了整個集群的關鍵要素。從這一關鍵要素就引出了數據復制技術,通過各種數據復制技術來確保集群中各節點之間數據一致性。
GTID是MySQL5.6后出現的新的復制協議,分為UUID、TID兩個部分。即以事務為基礎,通過在主服務器上提交事務或者slave上接收master二進制日志,就可精準定位到某個事務。當復制開始執行時,GTID和事務都會一同保存到二進制日志中,有效保證數據的一致性。
為了對數據庫集群進行優化設計,首要分析影響集群性能的幾個關鍵要素。
第一,集群的可用性,它要求集群穩定可靠、及時響應,即使集群中某個節點出現故障,集群仍可對外提供服務。
第二,集群需要提供統一的系統鏡像。因為用戶并不關心系統是集群系統還是單機系統,為了有效避免單節點故障,就需要用到集群。
第三,負載均衡。負載均衡是根據一定的調度策略,將不同強度的客戶請求分配到性能不等的節點上。節點負載力度會與其本身的性能水平成正相關的關系。
第四,數據的復制。集群系統中為了保證數據冗余性,不同節點之間需要進行數據復制。只有當集群中多個節點之間數據一致時,才能為負載分發提供基礎條件,進而為用戶提供服務。
一般傳統數據庫架構分為三層,最上層是客戶層,第二層是代理層,最底層是數據庫集群。代理層是起到對外提供單一的集群鏡像入口的作用,對外接受來自客戶的請求,之后再將這些請求分發給數據庫集群,數據庫集群層通過數據同步技術實現集群節點間數據一致。本文在這個基礎架構之上對其進行優化,使其更加適應實際復雜的農業物聯網生產環境。優化后的MySQL數據庫集群系統架構如圖1所示。

圖1 優化后的MySQL數據庫集群系統架構
首先,將集群中數據庫節點分為只讀節點和只寫節點,再利用數據庫中間件實現數據庫的寫讀分離功能。在大多數業務情況統計下,數據庫讀寫的比例大概是1:9,也就是說寫的比例遠遠大于讀,在寫讀都同時進行的情況下,數據庫面臨著很大的壓力,甚至會出現宕機問題,導致數據丟失。所以為了減輕寫服務器壓力,在整個數據庫集群中加入寫讀分離是很有必要的。
其次,在傳統的數據庫集群架構中,代理是客戶端與數據庫集群連接的直接橋梁。如果代理服務器宕機將會直接導致客戶訪問不到集群,這是最不能接受的缺陷。Keepalived工作時,一臺為主服務器,另一臺為備服務器,但是對外表現為一個Virtual IP。主節點會不間斷向備節點發送心跳監測消息讓備節點認為主節點還處于運行狀態。當備節點檢測不到來自主節點的心跳監測消息時,就會調用自身的接管程序,接管主節點的IP資源和服務,保障系統對外提供穩定的服務。
再次,在MySQL數據庫層上對系統進行優化,采用基于GTID的復制方法與主從復制的結構來實現數據一致性。
對優化后的MySQL數據庫集群的服務器關鍵參數進行規劃,具體數值列于表1。

表1 優化后的MySQL數據庫集群服務器規劃表
目前市場上使用占比較多的是Keepalived和Heartbeat。兩者的主要區別在于Keepalived的目的是模擬路由器的雙機,而Heartbeat的目的是用戶服務的雙機。針對農業物聯網的業務環境,采用Keepalived的解決方案,可以與LVS配合協同工作,使用LVS的默認工作模式即DR模式來實現[6]。具體實現過程主要配置如下:
1)LVS安裝
//調度器上直接yum安裝
#yum install -y ipvsadm
2)配置過程
//調度器上配置腳本
# vim /usr/local/sbin/lvs_dr.sh
#! /bin/bash
echo 1> /proc/sys/net/ipv4/ip_forward
ipv=/sbin/ipvsadm
vip=192.168.209.127
//服務器上配置腳本
# vim /usr/local/sbin/lvs_dr_rs.sh
#! /bin/bash
vip=192.168.209.127
由于MyCat是由Java語言編寫,所以在安裝MyCat前需要安裝jdk的依賴環境且需確保Java環境為jdk1.7以上,本文采用自定義安裝的方式:
#cd /usr/local/mysql5.6
#cmake -DMYSQL_USER=mysql
#make&&make install
基于 GTID 的復制方式是MySQL5.6版本之后出現的功能,通過 GTID可以確保每個在主庫上提交的事務在集群中擁有唯一可以識別的id。在原有復制手段中,從庫需告知主庫偏移量的位置,而且需要人為進行確認,若偏移量指定錯誤會造成數據遺漏。而借助GTID,MySQL的從庫可以在無需
人為指定偏移量的情況下,主動找到主庫上的正確復制位置,這就極大程度上減少了人為設置復制位置發生誤操作的風險也可以忽略已經執行過的事務。本文采用Linux搭建一主一從的服務器架構模型[7],具體實現過程的關鍵代碼如下:
//配置主從服務器my.cnf文件
log-bin=/data/mysqlLog/logs/mysql-bin binlog_format = row
//在主數據庫上創建復制用戶
mysql> max_binlog_size= 128M
binlog_cache_size= 2M
expire-logs-days=5
log-slave-updates=true
//啟動從數據庫上的復制線程
mysql>start slave
本文采用了sysbench來進行性能測試,測試結果可知:通過直接連接與優化連接相比較,優化后的Tps、Qps和平均耗時都減少了6%左右,表明服務器集群通過優化連接時,系統更穩定、性能更好。
本文詳細介紹了適用于農業物聯網的數據庫集群系統的設計與優化,主要分為三個部分來進行,分別是代理層、負載均衡模塊、數據層。代理層使用寫讀分離和雙機熱備技術;負載均衡模塊采用LVS算法進行調度,將請求依據調度算法分發給服務器,并結合Keepalived方法實現高可用性;通過GTID的復制方法實現數據的一致性。通過系統實現和測試,發現優化系統有更好的性能,穩定性也更高。
[1]宣振國.基于Mysql的數據庫集群設計與實現[D].北京:北京郵電大學,2013.
[2]POLEPALLY V, CHATRAPATI K S. Dragonfly Optimization and Constraint Measure-based Load Balancing in Cloud Computing[J]. Cluster Computing, 2019, 22(1):1099-1111.
[3]王關政.基于Tengine的服務器集群動態均衡算法的研究與實現[D].廣州:華南理工大學,2018.
[4]朱莉.云計算服務器集群的時間同步方法[J].指揮信息系統與技術,2018,9(4):63-67.
[5]申澤星,彭云建,岳喜順.集群服務器在混合請求下的負載均衡優化算法[J].計算機工程與應用,2018,54(18): 99-104,241.
[6]李偉,盧捷,馬軍.基于linux的高可用負載均衡集群系統的應用[J].河北聯合大學學報(自然科學版),2013,35(2): 73-77.
[7]高俊峰.高性能Linux服務器構建實戰:運維監控、性能調優與集群應用[M].北京:機械工業出版社,2012:442-445.
TP392
A
1673-2219(2021)05-0059-03
2021-05-18
2020年度湖南科技學院科學研究項目(20XKY057);永州市2019年指導性科技計劃項目(2019-yzkj-10);湖南省2019年大學生創新創業大學生能力培養項目(湘科人〔2019〕9號);2017年湖南省科技廳重點研發項目(2017NK2391)。
尹向東(1976-),男,湖南永州人,教授,研究方向為物聯網及大數據技術。
(責任編校:宮彥軍)