尹向東 王 娜 楊夢瑤
基于農(nóng)業(yè)物聯(lián)網(wǎng)的數(shù)據(jù)庫集群系統(tǒng)優(yōu)化設(shè)計(jì)
尹向東a王 娜b楊夢瑤a
(湖南科技學(xué)院 a.信息工程學(xué)院;b.傳媒學(xué)院,湖南 永州 425199)
設(shè)計(jì)一個(gè)適用于農(nóng)業(yè)物聯(lián)網(wǎng)管理系統(tǒng)的數(shù)據(jù)庫集群系統(tǒng)優(yōu)化方法,通過對實(shí)際農(nóng)業(yè)生產(chǎn)環(huán)境中高訪問量、高峰值的應(yīng)用特征分析,負(fù)載均衡模塊通過采用LVS算法來實(shí)現(xiàn)流量分發(fā),代理模塊采用MyCat中間件實(shí)現(xiàn)寫讀分離以及Keepalived實(shí)現(xiàn)高可用保障服務(wù)安全穩(wěn)定運(yùn)行,最后數(shù)據(jù)庫服務(wù)器集群通過使用GTID數(shù)據(jù)復(fù)制形式來保障數(shù)據(jù)的一致性。通過測試表明,系統(tǒng)優(yōu)化后性能與穩(wěn)定性都得到了提高。
農(nóng)業(yè)物聯(lián)網(wǎng);數(shù)據(jù)庫集群;負(fù)載均衡
隨著物聯(lián)網(wǎng)技術(shù)的發(fā)展,數(shù)據(jù)采集量呈現(xiàn)指數(shù)級增長,這些數(shù)據(jù)不斷將數(shù)據(jù)庫存儲容量逼至上限,傳統(tǒng)的數(shù)據(jù)庫解決方案擴(kuò)展性不夠高、彈性伸縮不足、硬件成本頗高的問題逐漸凸顯出來[1]。在實(shí)際農(nóng)業(yè)物聯(lián)網(wǎng)環(huán)境中數(shù)據(jù)讀寫請求比例相差較大,為解決數(shù)據(jù)流量分發(fā)的問題,數(shù)據(jù)庫集群技術(shù)順勢而生。
現(xiàn)在國內(nèi)許多行業(yè)都開發(fā)了有自身行業(yè)背景的數(shù)據(jù)庫集群技術(shù),比較知名的有奇虎360的Atlas數(shù)據(jù)庫集群技術(shù)、華為的DDM數(shù)據(jù)庫集群技術(shù)等。因?yàn)槠涮厥獾男袠I(yè)特色,其應(yīng)用范圍受到很多限制。而國外的Oracle開發(fā)的MySQL集群中間件雖然應(yīng)用很廣,但是價(jià)格比較昂貴[1],在這種背景下,MyCat應(yīng)運(yùn)而生,國內(nèi)很多用戶使用MyCat,受到廣大開源數(shù)據(jù)庫集群用戶青睞。但是因?yàn)镸yCat的開發(fā)時(shí)間不長,存在許多需要改進(jìn)和優(yōu)化的地方。總的來說國內(nèi)數(shù)據(jù)庫集群技術(shù)的研究正處于發(fā)展階段,在農(nóng)業(yè)物聯(lián)網(wǎng)領(lǐng)域可供研究和探索的空間還很大。
在數(shù)據(jù)庫集群中選用合理的負(fù)載均衡算法非常重要,Polepally等[2]通過選擇各項(xiàng)任務(wù)的關(guān)鍵參數(shù),使用約束度量的方法實(shí)現(xiàn)集群負(fù)載均衡。王關(guān)政[3]使用采集集群中后臺服務(wù)器負(fù)載評價(jià)標(biāo)準(zhǔn)的方法,實(shí)現(xiàn)了服務(wù)器自定義動態(tài)權(quán)值負(fù)載均衡。朱莉[4]提出一種多模式融合服務(wù)器集群架構(gòu)動態(tài)調(diào)整下負(fù)載均衡的同步方法。申澤星等[5]建立了一類基于動態(tài)調(diào)節(jié)的閉環(huán)負(fù)載分配策略。這些算法各有各的優(yōu)勢與不足,與特定業(yè)務(wù)場景結(jié)合的程度不是很好。
依據(jù)農(nóng)業(yè)物聯(lián)網(wǎng)管理系統(tǒng)的業(yè)務(wù)場景,分散在廣大區(qū)域的傳感器采集到海量數(shù)據(jù),經(jīng)過匯總集中后由代理節(jié)點(diǎn)統(tǒng)一發(fā)送到對應(yīng)服務(wù)器,這時(shí)候就經(jīng)常會出現(xiàn)大規(guī)模寫入數(shù)據(jù)庫集群的場景,對寫性能要求較高,而從服務(wù)器讀取數(shù)據(jù)的場景比寫入操作就要少很多。用MyCat中間件技術(shù)實(shí)現(xiàn)數(shù)據(jù)寫讀分離,選擇合理的負(fù)載均衡算法,將數(shù)據(jù)壓力分散存儲到各節(jié)點(diǎn),設(shè)計(jì)實(shí)現(xiàn)一種優(yōu)化的、高可用性數(shù)據(jù)庫集群系統(tǒng)是很有研究價(jià)值的。
負(fù)載均衡方案要根據(jù)具體的使用場景、業(yè)務(wù)環(huán)境來選取,該方案能夠支持3種算法:服務(wù)器集群加權(quán)輪詢算法;集群最少服務(wù)器連接數(shù)算法;緩存集群中局部最少鏈接算法。
1)服務(wù)器集群加權(quán)輪詢算法
加權(quán)輪詢給每臺服務(wù)器附加一定程度上的權(quán)重算法,可以依據(jù)服務(wù)器節(jié)點(diǎn)處理能力高低來選擇合適的權(quán)重值。
2)集群最少服務(wù)器連接數(shù)算法
根據(jù)服務(wù)器當(dāng)前活躍連接數(shù),動態(tài)選取當(dāng)前狀況下連接數(shù)最少的服務(wù)器來響應(yīng)客戶端請求并合理分發(fā)到服務(wù)器上,調(diào)度服務(wù)器可以依據(jù)真實(shí)服務(wù)器負(fù)載情況動態(tài)調(diào)整其權(quán)值。
3)緩存集群中局部最少鏈接算法
該算法是針對請求報(bào)文的目標(biāo)地址的調(diào)度請求,由于在緩存集群中,客戶請求報(bào)文的目標(biāo)IP地址是變化的,所以目前主要用于緩存集群。
現(xiàn)在市場上使用最為廣泛的負(fù)載均衡方案包括HAproxy、Nginx和LVS,其中LVS(linux virtual server)是一種開源的負(fù)載均衡方案,除了能支持上述三種算法外,另外還支持近十種負(fù)載均衡算法,采用Keepalived+LVS技術(shù)使得自身具有熱備方案,具有良好的可靠性、可擴(kuò)展性和可操作性[6]。
通過對農(nóng)業(yè)物聯(lián)網(wǎng)實(shí)際開發(fā)環(huán)境、實(shí)際業(yè)務(wù)使用對象規(guī)模以及軟件會話并發(fā)能力等方面的需求分析,本文決定采用LVS來實(shí)現(xiàn)負(fù)載均衡。
為了保障數(shù)據(jù)的可靠穩(wěn)定,就要運(yùn)用到高可用技術(shù)。其中業(yè)務(wù)切換是高可用軟件能夠保障系統(tǒng)安全穩(wěn)定運(yùn)行的核心技術(shù),即如果集群中節(jié)點(diǎn)發(fā)生故障,其備用節(jié)點(diǎn)將在幾秒內(nèi)接管它的職責(zé),對外提供透明服務(wù),從而降低由節(jié)點(diǎn)性能故障等所導(dǎo)致的損失。
Keepalived使用VRRP協(xié)議方式,與LVS完美兼容,是用于實(shí)現(xiàn)LVS服務(wù)高可用方案。除了可以對服務(wù)器進(jìn)行健康狀況檢測和故障隔離功能之外,還具有高可用集群的功能。其中健康檢測是Keepalived的核心功能之一,就是利用TCP三次握手、HTTP請求、ICMP請求等方式對后端真實(shí)服務(wù)器進(jìn)行檢測,而故障節(jié)點(diǎn)自動切換主要應(yīng)用于2個(gè)高可用節(jié)點(diǎn)之上,且配置了主備模式的負(fù)載均衡服務(wù)器。通過VRRP協(xié)議,當(dāng)master出現(xiàn)問題時(shí),master心跳檢測不到,此時(shí)就會把流量分發(fā)到Slave節(jié)點(diǎn)繼續(xù)提供相應(yīng)業(yè)務(wù),保障服務(wù)的安全穩(wěn)定運(yùn)行。
數(shù)據(jù)庫集群比較常用的兩種體系結(jié)構(gòu)為共享存儲結(jié)構(gòu)、無共享存儲結(jié)構(gòu)。共享存儲結(jié)構(gòu)就是讓集群中所有節(jié)點(diǎn)共同使用同一數(shù)據(jù)資源,從根源上避免數(shù)據(jù)不一致引起的問題。而對于沒有使用共享存儲的集群來說,確保數(shù)據(jù)的一致性就成了整個(gè)集群的關(guān)鍵要素。從這一關(guān)鍵要素就引出了數(shù)據(jù)復(fù)制技術(shù),通過各種數(shù)據(jù)復(fù)制技術(shù)來確保集群中各節(jié)點(diǎn)之間數(shù)據(jù)一致性。
GTID是MySQL5.6后出現(xiàn)的新的復(fù)制協(xié)議,分為UUID、TID兩個(gè)部分。即以事務(wù)為基礎(chǔ),通過在主服務(wù)器上提交事務(wù)或者slave上接收master二進(jìn)制日志,就可精準(zhǔn)定位到某個(gè)事務(wù)。當(dāng)復(fù)制開始執(zhí)行時(shí),GTID和事務(wù)都會一同保存到二進(jìn)制日志中,有效保證數(shù)據(jù)的一致性。
為了對數(shù)據(jù)庫集群進(jìn)行優(yōu)化設(shè)計(jì),首要分析影響集群性能的幾個(gè)關(guān)鍵要素。
第一,集群的可用性,它要求集群穩(wěn)定可靠、及時(shí)響應(yīng),即使集群中某個(gè)節(jié)點(diǎn)出現(xiàn)故障,集群仍可對外提供服務(wù)。
第二,集群需要提供統(tǒng)一的系統(tǒng)鏡像。因?yàn)橛脩舨⒉魂P(guān)心系統(tǒng)是集群系統(tǒng)還是單機(jī)系統(tǒng),為了有效避免單節(jié)點(diǎn)故障,就需要用到集群。
第三,負(fù)載均衡。負(fù)載均衡是根據(jù)一定的調(diào)度策略,將不同強(qiáng)度的客戶請求分配到性能不等的節(jié)點(diǎn)上。節(jié)點(diǎn)負(fù)載力度會與其本身的性能水平成正相關(guān)的關(guān)系。
第四,數(shù)據(jù)的復(fù)制。集群系統(tǒng)中為了保證數(shù)據(jù)冗余性,不同節(jié)點(diǎn)之間需要進(jìn)行數(shù)據(jù)復(fù)制。只有當(dāng)集群中多個(gè)節(jié)點(diǎn)之間數(shù)據(jù)一致時(shí),才能為負(fù)載分發(fā)提供基礎(chǔ)條件,進(jìn)而為用戶提供服務(wù)。
一般傳統(tǒng)數(shù)據(jù)庫架構(gòu)分為三層,最上層是客戶層,第二層是代理層,最底層是數(shù)據(jù)庫集群。代理層是起到對外提供單一的集群鏡像入口的作用,對外接受來自客戶的請求,之后再將這些請求分發(fā)給數(shù)據(jù)庫集群,數(shù)據(jù)庫集群層通過數(shù)據(jù)同步技術(shù)實(shí)現(xiàn)集群節(jié)點(diǎn)間數(shù)據(jù)一致。本文在這個(gè)基礎(chǔ)架構(gòu)之上對其進(jìn)行優(yōu)化,使其更加適應(yīng)實(shí)際復(fù)雜的農(nóng)業(yè)物聯(lián)網(wǎng)生產(chǎn)環(huán)境。優(yōu)化后的MySQL數(shù)據(jù)庫集群系統(tǒng)架構(gòu)如圖1所示。
圖1 優(yōu)化后的MySQL數(shù)據(jù)庫集群系統(tǒng)架構(gòu)
首先,將集群中數(shù)據(jù)庫節(jié)點(diǎn)分為只讀節(jié)點(diǎn)和只寫節(jié)點(diǎn),再利用數(shù)據(jù)庫中間件實(shí)現(xiàn)數(shù)據(jù)庫的寫讀分離功能。在大多數(shù)業(yè)務(wù)情況統(tǒng)計(jì)下,數(shù)據(jù)庫讀寫的比例大概是1:9,也就是說寫的比例遠(yuǎn)遠(yuǎn)大于讀,在寫讀都同時(shí)進(jìn)行的情況下,數(shù)據(jù)庫面臨著很大的壓力,甚至?xí)霈F(xiàn)宕機(jī)問題,導(dǎo)致數(shù)據(jù)丟失。所以為了減輕寫服務(wù)器壓力,在整個(gè)數(shù)據(jù)庫集群中加入寫讀分離是很有必要的。
其次,在傳統(tǒng)的數(shù)據(jù)庫集群架構(gòu)中,代理是客戶端與數(shù)據(jù)庫集群連接的直接橋梁。如果代理服務(wù)器宕機(jī)將會直接導(dǎo)致客戶訪問不到集群,這是最不能接受的缺陷。Keepalived工作時(shí),一臺為主服務(wù)器,另一臺為備服務(wù)器,但是對外表現(xiàn)為一個(gè)Virtual IP。主節(jié)點(diǎn)會不間斷向備節(jié)點(diǎn)發(fā)送心跳監(jiān)測消息讓備節(jié)點(diǎn)認(rèn)為主節(jié)點(diǎn)還處于運(yùn)行狀態(tài)。當(dāng)備節(jié)點(diǎn)檢測不到來自主節(jié)點(diǎn)的心跳監(jiān)測消息時(shí),就會調(diào)用自身的接管程序,接管主節(jié)點(diǎn)的IP資源和服務(wù),保障系統(tǒng)對外提供穩(wěn)定的服務(wù)。
再次,在MySQL數(shù)據(jù)庫層上對系統(tǒng)進(jìn)行優(yōu)化,采用基于GTID的復(fù)制方法與主從復(fù)制的結(jié)構(gòu)來實(shí)現(xiàn)數(shù)據(jù)一致性。
對優(yōu)化后的MySQL數(shù)據(jù)庫集群的服務(wù)器關(guān)鍵參數(shù)進(jìn)行規(guī)劃,具體數(shù)值列于表1。
表1 優(yōu)化后的MySQL數(shù)據(jù)庫集群服務(wù)器規(guī)劃表
目前市場上使用占比較多的是Keepalived和Heartbeat。兩者的主要區(qū)別在于Keepalived的目的是模擬路由器的雙機(jī),而Heartbeat的目的是用戶服務(wù)的雙機(jī)。針對農(nóng)業(yè)物聯(lián)網(wǎng)的業(yè)務(wù)環(huán)境,采用Keepalived的解決方案,可以與LVS配合協(xié)同工作,使用LVS的默認(rèn)工作模式即DR模式來實(shí)現(xiàn)[6]。具體實(shí)現(xiàn)過程主要配置如下:
1)LVS安裝
//調(diào)度器上直接yum安裝
#yum install -y ipvsadm
2)配置過程
//調(diào)度器上配置腳本
# 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
//服務(wù)器上配置腳本
# vim /usr/local/sbin/lvs_dr_rs.sh
#! /bin/bash
vip=192.168.209.127
由于MyCat是由Java語言編寫,所以在安裝MyCat前需要安裝jdk的依賴環(huán)境且需確保Java環(huán)境為jdk1.7以上,本文采用自定義安裝的方式:
#cd /usr/local/mysql5.6
#cmake -DMYSQL_USER=mysql
#make&&make install
基于 GTID 的復(fù)制方式是MySQL5.6版本之后出現(xiàn)的功能,通過 GTID可以確保每個(gè)在主庫上提交的事務(wù)在集群中擁有唯一可以識別的id。在原有復(fù)制手段中,從庫需告知主庫偏移量的位置,而且需要人為進(jìn)行確認(rèn),若偏移量指定錯(cuò)誤會造成數(shù)據(jù)遺漏。而借助GTID,MySQL的從庫可以在無需
人為指定偏移量的情況下,主動找到主庫上的正確復(fù)制位置,這就極大程度上減少了人為設(shè)置復(fù)制位置發(fā)生誤操作的風(fēng)險(xiǎn)也可以忽略已經(jīng)執(zhí)行過的事務(wù)。本文采用Linux搭建一主一從的服務(wù)器架構(gòu)模型[7],具體實(shí)現(xiàn)過程的關(guān)鍵代碼如下:
//配置主從服務(wù)器my.cnf文件
log-bin=/data/mysqlLog/logs/mysql-bin binlog_format = row
//在主數(shù)據(jù)庫上創(chuàng)建復(fù)制用戶
mysql> max_binlog_size= 128M
binlog_cache_size= 2M
expire-logs-days=5
log-slave-updates=true
//啟動從數(shù)據(jù)庫上的復(fù)制線程
mysql>start slave
本文采用了sysbench來進(jìn)行性能測試,測試結(jié)果可知:通過直接連接與優(yōu)化連接相比較,優(yōu)化后的Tps、Qps和平均耗時(shí)都減少了6%左右,表明服務(wù)器集群通過優(yōu)化連接時(shí),系統(tǒng)更穩(wěn)定、性能更好。
本文詳細(xì)介紹了適用于農(nóng)業(yè)物聯(lián)網(wǎng)的數(shù)據(jù)庫集群系統(tǒng)的設(shè)計(jì)與優(yōu)化,主要分為三個(gè)部分來進(jìn)行,分別是代理層、負(fù)載均衡模塊、數(shù)據(jù)層。代理層使用寫讀分離和雙機(jī)熱備技術(shù);負(fù)載均衡模塊采用LVS算法進(jìn)行調(diào)度,將請求依據(jù)調(diào)度算法分發(fā)給服務(wù)器,并結(jié)合Keepalived方法實(shí)現(xiàn)高可用性;通過GTID的復(fù)制方法實(shí)現(xiàn)數(shù)據(jù)的一致性。通過系統(tǒng)實(shí)現(xiàn)和測試,發(fā)現(xiàn)優(yōu)化系統(tǒng)有更好的性能,穩(wěn)定性也更高。
[1]宣振國.基于Mysql的數(shù)據(jù)庫集群設(shè)計(jì)與實(shí)現(xiàn)[D].北京:北京郵電大學(xué),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]王關(guān)政.基于Tengine的服務(wù)器集群動態(tài)均衡算法的研究與實(shí)現(xiàn)[D].廣州:華南理工大學(xué),2018.
[4]朱莉.云計(jì)算服務(wù)器集群的時(shí)間同步方法[J].指揮信息系統(tǒng)與技術(shù),2018,9(4):63-67.
[5]申澤星,彭云建,岳喜順.集群服務(wù)器在混合請求下的負(fù)載均衡優(yōu)化算法[J].計(jì)算機(jī)工程與應(yīng)用,2018,54(18): 99-104,241.
[6]李偉,盧捷,馬軍.基于linux的高可用負(fù)載均衡集群系統(tǒng)的應(yīng)用[J].河北聯(lián)合大學(xué)學(xué)報(bào)(自然科學(xué)版),2013,35(2): 73-77.
[7]高俊峰.高性能Linux服務(wù)器構(gòu)建實(shí)戰(zhàn):運(yùn)維監(jiān)控、性能調(diào)優(yōu)與集群應(yīng)用[M].北京:機(jī)械工業(yè)出版社,2012:442-445.
TP392
A
1673-2219(2021)05-0059-03
2021-05-18
2020年度湖南科技學(xué)院科學(xué)研究項(xiàng)目(20XKY057);永州市2019年指導(dǎo)性科技計(jì)劃項(xiàng)目(2019-yzkj-10);湖南省2019年大學(xué)生創(chuàng)新創(chuàng)業(yè)大學(xué)生能力培養(yǎng)項(xiàng)目(湘科人〔2019〕9號);2017年湖南省科技廳重點(diǎn)研發(fā)項(xiàng)目(2017NK2391)。
尹向東(1976-),男,湖南永州人,教授,研究方向?yàn)槲锫?lián)網(wǎng)及大數(shù)據(jù)技術(shù)。
(責(zé)任編校:宮彥軍)