張文正 孫知信 宮婧
摘? 要:為了解決物聯(lián)網(wǎng)異構(gòu)數(shù)據(jù)的存儲(chǔ)問題,該文提出了一種混合技術(shù)存儲(chǔ)方案。針對(duì)結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ),該文基于MySQL分布式數(shù)據(jù)庫和Redis緩存,設(shè)計(jì)了結(jié)構(gòu)化數(shù)據(jù)的存儲(chǔ)方案;對(duì)于圖片等非結(jié)構(gòu)化數(shù)據(jù),通過FastDFS分布式文件系統(tǒng)進(jìn)行管理,使用Redis緩存保存文件的索引映射關(guān)系并實(shí)現(xiàn)快讀熱點(diǎn)數(shù)據(jù)的功能。最后對(duì)系統(tǒng)進(jìn)行測(cè)試,測(cè)試結(jié)果表明該方案實(shí)現(xiàn)了性能目標(biāo)。
關(guān)鍵詞:物聯(lián)網(wǎng)? 數(shù)據(jù)存儲(chǔ)? 結(jié)構(gòu)化數(shù)據(jù)? 非結(jié)構(gòu)化數(shù)據(jù)
中圖分類號(hào):TP3? ? ? ? ? ? ? ? ? ? ? ? ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1672-3791(2021)04(b)-0001-04
A Hybrid Heterogeneous Data Storage Scheme
ZHANG Wenzheng? SUN Zhixin*? GONG Jing
(Nanjing University of Posts and Telecommunications, Nanjing, Jiangsu Province, 210023? China)
Abstract: In order to solve the storage problem of heterogeneous data in the Internet of Things, this paper proposes a hybrid technology storage scheme. For structured data storage, this paper designs a structured data storage scheme based on MySQL distributed database and Redis cache; for unstructured data such as pictures, it is managed through the FastDFS distributed file system, and the Redis cache is used to store the index mapping of the file relationship and realize the function of fast reading hot data. Finally, the system is tested, and the test results show that the solution in this paper has achieved the performance goal.
Key Words: Internet of things; Data storage; Structured data; Unstructured data
近年來,國內(nèi)外在物聯(lián)網(wǎng)方面的技術(shù)應(yīng)用水平不斷提升。伴隨著傳感器設(shè)備種類和數(shù)量的不斷增加,物聯(lián)網(wǎng)應(yīng)用系統(tǒng)中的數(shù)據(jù)量也日益龐大且逐漸趨于多樣化[1]。如何高性能地對(duì)各式各樣的物聯(lián)網(wǎng)數(shù)據(jù)進(jìn)行存儲(chǔ),成為當(dāng)前物聯(lián)網(wǎng)領(lǐng)域的一個(gè)熱點(diǎn)問題。為了解決物聯(lián)網(wǎng)數(shù)據(jù)的高性能存儲(chǔ)問題,該文研究了物聯(lián)網(wǎng)數(shù)據(jù)的特點(diǎn),提出了面向異構(gòu)數(shù)據(jù)的混合型存儲(chǔ)方案。
1? 物聯(lián)網(wǎng)數(shù)據(jù)存儲(chǔ)需求分析
物聯(lián)網(wǎng)數(shù)據(jù)的來源是不同的傳感器設(shè)備[2],通常情況下物聯(lián)網(wǎng)數(shù)據(jù)存儲(chǔ)系統(tǒng)應(yīng)滿足以下幾點(diǎn)要求。
1.1 可靠性
要有較好的數(shù)據(jù)備份與恢復(fù)方案,用以保證數(shù)據(jù)丟失狀況下系統(tǒng)的可靠性。
1.2 開放性
提供相應(yīng)數(shù)據(jù)接口,來解決不同場景的數(shù)據(jù)處理或分析。
1.3 實(shí)時(shí)性
針對(duì)實(shí)時(shí)監(jiān)測(cè)的需求,可以實(shí)時(shí)地接收數(shù)據(jù),且可以實(shí)時(shí)地計(jì)算處理。
2? 物聯(lián)網(wǎng)數(shù)據(jù)的分類
考慮到傳感器型號(hào)、屬性差異,物聯(lián)網(wǎng)數(shù)據(jù)的往往沒有一種統(tǒng)一的格式。一般可以分為兩大類:一是結(jié)構(gòu)化數(shù)據(jù),可以很方便地用關(guān)系記錄來表示,可存儲(chǔ)在關(guān)系型數(shù)據(jù)庫。二是非結(jié)構(gòu)化數(shù)據(jù),難以用常規(guī)的關(guān)系記錄來表示,這類數(shù)據(jù)常使用非關(guān)系型數(shù)據(jù)庫或是文件系統(tǒng)來進(jìn)行管理,由于通常沒有固定的格式,組織起來往往具有一定的難度[3]。
此外,這兩類數(shù)據(jù)的性能指標(biāo)是不一樣的。對(duì)于結(jié)構(gòu)化數(shù)據(jù),由于單條數(shù)據(jù)記錄占用空間非常少,一般沒有千字節(jié)大小,所以這些數(shù)據(jù)很適合用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫進(jìn)行管理。至于非結(jié)構(gòu)化數(shù)據(jù),例如圖片、文檔,單個(gè)文件占用空間較少,通常狀況下,占用空間在64 kB~1 MB,在這種情況下讀寫速度較快。
面對(duì)日益增長的各類數(shù)據(jù),利用傳統(tǒng)的存儲(chǔ)方式和管理性能來管理物聯(lián)網(wǎng)數(shù)據(jù)無法滿足現(xiàn)在人們的需求。目前,分布式存儲(chǔ)架構(gòu)已是常見的數(shù)據(jù)管理方案,其原因有3點(diǎn):一是使得管理的數(shù)據(jù)可以具有較好的可擴(kuò)展性;二是能夠顯著提高系統(tǒng)性能;三是能夠降低企業(yè)成本。
該文依據(jù)物聯(lián)網(wǎng)數(shù)據(jù)的上述分類來制訂混合型存儲(chǔ)方案。結(jié)構(gòu)化數(shù)據(jù)通過MySQL分布式數(shù)據(jù)庫來進(jìn)行管理,非結(jié)構(gòu)化數(shù)據(jù)通過分布式文件系統(tǒng)FastDFS結(jié)合Redis緩存來進(jìn)行管理。
3? 數(shù)據(jù)存儲(chǔ)模型
綜合考慮系統(tǒng)的可靠性、事務(wù)處理、緩存策略等關(guān)鍵的影響因素,如圖1所示,該文將存儲(chǔ)模型整體分為應(yīng)用層、服務(wù)層及存儲(chǔ)層[4]。
3.1 結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)
3.1.1 MySQL分布式存儲(chǔ)
分布式關(guān)系數(shù)據(jù)庫即搭建分布式集群,把單一數(shù)據(jù)庫里的多條數(shù)據(jù)按照一定策略劃分,重新放到集群中的不同節(jié)點(diǎn)上,再依靠各節(jié)點(diǎn)的協(xié)同工作來實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)與管理。
對(duì)于大型的數(shù)據(jù)系統(tǒng)來說,若單表中保存的記錄數(shù)量超過百萬或者更高時(shí),對(duì)于讀取和寫入就都會(huì)出現(xiàn)很大的困難。此外,集群中每個(gè)節(jié)點(diǎn)若是都管理同樣的數(shù)據(jù),那么理論上這就還是與單庫容量相比并無不同,還是難以真正實(shí)現(xiàn)海量數(shù)據(jù)的高性能管理。
3.1.2 存儲(chǔ)架構(gòu)設(shè)計(jì)
隨著數(shù)據(jù)采集節(jié)點(diǎn)和數(shù)據(jù)訪問客戶端的日益增加,如果只有一臺(tái)應(yīng)用服務(wù)器就難以容納廣大的數(shù)據(jù)流量,且常常會(huì)出現(xiàn)單點(diǎn)故障。此時(shí)就需要增加服務(wù)器的數(shù)量,并通過Nginx在數(shù)據(jù)流量的入口做負(fù)載均衡,這樣能夠使數(shù)據(jù)流量可以被放到不同的服務(wù)器來進(jìn)行處理,就可以很好地解決上述問題。不過也要考慮到海量數(shù)據(jù)日益擴(kuò)張,倘若數(shù)據(jù)還是在單庫上進(jìn)行讀取和寫入的話,很容易出現(xiàn)性能瓶頸。為了解決出現(xiàn)的性能瓶頸,對(duì)數(shù)據(jù)庫的讀取和寫入操作進(jìn)行了分離,通過主數(shù)據(jù)庫進(jìn)行寫操作,通過從數(shù)據(jù)庫進(jìn)行讀操作。數(shù)據(jù)庫之間則是通過binlog實(shí)現(xiàn)相互的同步。讀寫性能問題可以在很大程度上得以解決。而對(duì)于部分讀取非常多,而寫入?yún)s非常少的數(shù)據(jù),該文使用了Redis緩存[5],且通過緩存失效機(jī)制,可以避免偶爾會(huì)出現(xiàn)的Redis和MySQL之間存在不一致的數(shù)據(jù)的現(xiàn)象[6]。出于更進(jìn)一步提高性能的目的,結(jié)合Mycat分布式數(shù)據(jù)庫中間件,此中間件可以很好地提升關(guān)系數(shù)據(jù)庫在數(shù)據(jù)量較大情況下的存儲(chǔ)性能,使得存儲(chǔ)架構(gòu)靈活、易擴(kuò)展。
數(shù)據(jù)寫入的策略是,使用Nginx來反向代理不同客戶端的訪問請(qǐng)求,接著通過加權(quán)輪詢計(jì)算出當(dāng)前壓力較小的Tomcat的地址。再通過計(jì)算出的地址,將數(shù)據(jù)放到寫隊(duì)列中預(yù)備后續(xù)的寫入,最后再把數(shù)據(jù)寫入到Redis里,并通過系統(tǒng)的數(shù)據(jù)訪問接口也寫入到MySQL中。
讀取數(shù)據(jù)的過程為,客戶端先在Redis緩存中查找數(shù)據(jù),若查找到緩存數(shù)據(jù),則對(duì)失效時(shí)間重置,并且把查到的數(shù)據(jù)提交至客戶端。若Redis中沒有,再到MySQL中查找。若在MySQL中查詢到,則把查詢到的數(shù)據(jù)提交至客戶端,同時(shí)把數(shù)據(jù)同步到Redis;如果在MySQL中也沒有查找到所需的數(shù)據(jù),就表明該數(shù)據(jù)并不存在,將此結(jié)果反饋給客戶端,讀取流程結(jié)束。
3.2 非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)
這里的非結(jié)構(gòu)化數(shù)據(jù)是文本和圖片等占用空間不大的文件。對(duì)于視頻流等特殊格式暫未涉及。物聯(lián)網(wǎng)終端設(shè)備數(shù)據(jù)通常單個(gè)體量小,文件大小為幾千字節(jié)至幾千字節(jié)。結(jié)合前文非結(jié)構(gòu)化數(shù)據(jù)特點(diǎn),對(duì)于單個(gè)體量較小的非結(jié)構(gòu)化數(shù)據(jù),該文選擇了FastDFS。
3.2.1? FastDFS分布式文件系統(tǒng)
FastDFS作為很常用的輕量級(jí)分布式文件系統(tǒng),可以結(jié)合Nginx反向代理服務(wù)器,并在此基礎(chǔ)上可以在線訪問文件,也就是能夠借助HTTP協(xié)議實(shí)現(xiàn)對(duì)文件系統(tǒng)中的各項(xiàng)數(shù)據(jù)進(jìn)行訪問。FastDFS還支持負(fù)載均衡、冗余備份,很適合中小文件[7]。
FastDFS通過文件索引策略,可以顯著地縮小元數(shù)據(jù)需要的存儲(chǔ)空間。它的管理方式是在數(shù)據(jù)服務(wù)器中保存文件,文件保存至數(shù)據(jù)服務(wù)器之后,再返回依據(jù)一定的規(guī)則而生成的針對(duì)于此文件的索引映射信息,并把此映射信息保存至MySQL[3]。
3.2.2 存儲(chǔ)架構(gòu)設(shè)計(jì)
考慮到FastDFS存文件的時(shí)候都會(huì)生成并返回文件的索引信息,當(dāng)訪問數(shù)據(jù)時(shí),就得利用此索引信息重新定位文件在FastDFS中的存儲(chǔ)位置,所以這里文件及其在FastDFS中的索引信息所形成的映射,就得通過另外的工具來管理。為了提高性能,使用Redis緩存對(duì)原文件及其索引信息的映射進(jìn)行管理。非結(jié)構(gòu)化數(shù)據(jù)的存儲(chǔ)架構(gòu)見圖2。
數(shù)據(jù)的寫入過程是先把一份數(shù)據(jù)的副本保存在Redis里,再把數(shù)據(jù)保存在FastDFS里,等到設(shè)置的Redis自動(dòng)失效時(shí)間,Redis中的副本將會(huì)被自動(dòng)地抹去。而在返回文件保存在FastDFS中的索引信息的時(shí)候,將該信息在Redis中保存。再進(jìn)行讀取就可以重新定位文件的位置。
讀FastDFS中管理的數(shù)據(jù)的方法不唯一??梢允褂肏TTP請(qǐng)求,并通過Nginx的反向代理,查找到所需的文件。這種方案較為簡單但失去了Redis緩存對(duì)于熱點(diǎn)數(shù)據(jù)的讀取優(yōu)勢(shì),且難以避免特殊狀況中偶然發(fā)生的緩存穿透問題。因此,可以先在Redis中查找數(shù)據(jù),如查找到,此時(shí)就提交并重新配置緩存失效時(shí)間。若在緩存中并沒有查找到數(shù)據(jù),則利用Redis中的映射關(guān)系,去FastDFS中讀取,并把FastDFS里查找到的相關(guān)數(shù)據(jù)備份至Redis里,并設(shè)置數(shù)據(jù)失效時(shí)間。
4? 系統(tǒng)測(cè)試
為了測(cè)試該文存儲(chǔ)方案與傳統(tǒng)的分布式存儲(chǔ)相比是否更有效降低數(shù)據(jù)寫入時(shí)延,該文基于數(shù)據(jù)存儲(chǔ)模型,進(jìn)行了仿真實(shí)驗(yàn),結(jié)果見圖3。
從圖3中可以看出,當(dāng)數(shù)據(jù)量較小時(shí),該文方案與傳統(tǒng)分布式存儲(chǔ)方案的時(shí)延性能相差不大,隨著任務(wù)量的不斷增加,傳統(tǒng)分布式存儲(chǔ)時(shí)延增加非常明顯,而該文方案依然具有較好的時(shí)延性能。
為進(jìn)一步驗(yàn)證該方案的可靠性,將該方案與原生的FastDFS相比較,記錄文件上傳后能夠成功讀取的次數(shù),將讀取的成功率作為該次測(cè)試的指標(biāo)[8]。仿真測(cè)試中,依次上傳1 000個(gè)、2 000個(gè)、3 000個(gè)等體積為10 MB的文件,記錄文件成功讀取的次數(shù),并計(jì)算成功率。實(shí)驗(yàn)的結(jié)果見圖4。
通過圖4可以看出,該方案讀取成功率接近100%,明顯高于常規(guī)FastDFS的成功率。
5? 結(jié)語
該文研究了物聯(lián)網(wǎng)異構(gòu)數(shù)據(jù)的基本特征,設(shè)計(jì)物聯(lián)網(wǎng)數(shù)據(jù)的存儲(chǔ)模型,其中結(jié)構(gòu)化數(shù)據(jù)通過分布式數(shù)據(jù)庫進(jìn)行管理,文本、圖片等小體量非結(jié)構(gòu)化數(shù)據(jù)通過FastDFS分布式文件系統(tǒng)進(jìn)行管理。在此基礎(chǔ)上又分別結(jié)合了Nginx負(fù)載均衡和Redis緩存更加深入地改善了系統(tǒng)性能。最后通過對(duì)系統(tǒng)進(jìn)行性能方面的測(cè)試,證明了該方案的可行性。
參考文獻(xiàn)
[1] 李道亮,楊昊.農(nóng)業(yè)物聯(lián)網(wǎng)技術(shù)研究進(jìn)展與發(fā)展趨勢(shì)分析[J].農(nóng)業(yè)機(jī)械學(xué)報(bào),2018,49(1):1-20.
[2] Phillip A Laplante,Nancy Laplante. The Internet of Things in Healthcare: Potential Applications and Challenges[J].IT Professional Magazine,2016,18(3):2-4.
[3] 甄凱成.面向物聯(lián)網(wǎng)應(yīng)用的數(shù)據(jù)接入和存儲(chǔ)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].中國科學(xué)技術(shù)大學(xué),2019.
[4] 許鑫,時(shí)雷,何龍,等.基于NoSQL數(shù)據(jù)庫的農(nóng)田物聯(lián)網(wǎng)云存儲(chǔ)系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].農(nóng)業(yè)工程學(xué)報(bào),2019,35(1):172-179.
[5] Alba Pedro-Zapater,Clemente Rodríguez,Juan Segarra,et al.Ideal and Predictable Hit Ratio for Matrix Transposition in Data Caches[J]. Mathematics,2020,8(2):184-206.
[6] 邱書洋.Redis緩存技術(shù)研究及應(yīng)用[D].鄭州大學(xué),2016.
[7] 石珊.云平臺(tái)下基于FastDFS的文件管理系統(tǒng)的研究與實(shí)現(xiàn)[D].電子科技大學(xué),2019.
[8] 叢犁,李銳,王華,等.面向工業(yè)物聯(lián)網(wǎng)的分布式數(shù)據(jù)存儲(chǔ)分配方案[J].電力信息與通信技術(shù),2020,18(7):52-57.