




摘要:隨著互聯(lián)網(wǎng)的飛速發(fā)展,網(wǎng)絡(luò)用戶量呈現(xiàn)爆炸式增長,各應(yīng)用系統(tǒng)的數(shù)據(jù)量正在急劇增加。海量的數(shù)據(jù)對于批處理程序的效率提出了更高的要求,原始的基于單實例數(shù)據(jù)庫單節(jié)點應(yīng)用部署的處理方式已經(jīng)無法滿足需求。因此,在底層數(shù)據(jù)存儲方面,技術(shù)人員可以根據(jù)業(yè)務(wù)特點,使用分布式數(shù)據(jù)庫并按照特定字段進行分片存儲;在應(yīng)用程序的算法設(shè)計方面,技術(shù)人員則可以利用分布式服務(wù)多節(jié)點多線程并發(fā)處理優(yōu)勢,并基于生產(chǎn)者消費者模型優(yōu)化異步處理模式。
關(guān)鍵詞:大數(shù)據(jù);分布式數(shù)據(jù)庫;分布式服務(wù);批處理
一、引言
近年來,隨著信息化的不斷發(fā)展,應(yīng)用軟件積累下來的數(shù)據(jù)總量呈指數(shù)級增長,數(shù)據(jù)資產(chǎn)越來越被重視,并構(gòu)建出了基于大數(shù)據(jù)的批處理程序進行數(shù)據(jù)挖掘分析。然而,互聯(lián)網(wǎng)領(lǐng)域數(shù)據(jù)挖掘從某些方面來說仍然處于萌芽起步階段,依然存在制約和深化數(shù)據(jù)挖掘應(yīng)用的困境和瓶頸問題[1]。在初期,對數(shù)據(jù)量估算以及技術(shù)架構(gòu)滯后會導(dǎo)致批處理程序運行時間過長,而長期占用數(shù)據(jù)庫連接會導(dǎo)致數(shù)據(jù)庫對外服務(wù)能力降低。因此,如何整體優(yōu)化批處理,以提高運行效率,并降低運行時間,就顯得尤為重要。
本文利用分布式的MySQL數(shù)據(jù)庫替代單實例的Oracle數(shù)據(jù)庫,在充分梳理業(yè)務(wù)邏輯的基礎(chǔ)上,根據(jù)關(guān)鍵字段進行分庫分片處理,以提高SQL執(zhí)行的并發(fā)性。同時,考慮到單節(jié)點服務(wù)器的劣勢,本文使用多節(jié)點多進程的處理模式,形成了一個批處理計算集群,同時引入了消息隊列機制,對批處理任務(wù)進行拆分,以便更好地發(fā)揮分布式處理的優(yōu)勢。
二、系統(tǒng)設(shè)計
(一)數(shù)據(jù)庫設(shè)計
在關(guān)系型數(shù)據(jù)庫中,Oracle憑借其較好的性能和多樣的功能得到了眾多軟件開發(fā)者的認(rèn)可。曾經(jīng)IT部署大多依靠EMC高端存儲、Oracle數(shù)據(jù)庫以及IBM服務(wù)器,只能通過提高服務(wù)器單機性能的方式來提升服務(wù)能力。然而,在數(shù)據(jù)規(guī)模驟增后,IOE模式具有的成本高、反應(yīng)遲鈍、靈活性差等缺點也愈發(fā)明顯。
MySQL既是一款開源的數(shù)據(jù)庫,也是一個穩(wěn)定可靠的數(shù)據(jù)管理系統(tǒng),經(jīng)常被定制來管理數(shù)據(jù)庫[2],作為一個比較成熟的DBMS,其底層的實現(xiàn)是比較完善的[3]。MySQL的存儲引擎和數(shù)據(jù)庫是分離的,提供了多種存儲引擎供用戶選擇,以實現(xiàn)不同的功能需求[4],同時低耦合性使得開發(fā)者可以根據(jù)需要選擇合適的存儲引擎。MySQL Cluster是專門為分布式集群環(huán)境所提供的解決方案,MySQL NDB Cluster能夠讓多個MySQL服務(wù)器以集群模式同時運行。MySQL Cluster的無共享體系結(jié)構(gòu)降低了對硬件的要求,每個節(jié)點有獨立的內(nèi)存和磁盤,提高了系統(tǒng)的容災(zāi)性。MySQL所提供的replication技術(shù)可以滿足各種集群化應(yīng)用的需求,典型的有:雙機熱備、垂直或者水平拆分表、讀寫分離集群。通過使用該技術(shù),人們可以提高數(shù)據(jù)庫的服務(wù)性能和安全性、方便進行數(shù)據(jù)分析等[5]。
本文所研究的案例是在IOE的模式下對多個地市用戶數(shù)據(jù)進行分析的批處理服務(wù),數(shù)據(jù)量也由前期的以萬計增長到如今的以億計,因此批處理程序亟待優(yōu)化。在數(shù)據(jù)存儲方面,需要在MySQL集群分庫存儲的基礎(chǔ)上進行水平拆分并形成分片表,以最大限度地降低單表數(shù)據(jù)量。在可靠性方面,依托MySQL提供的replication技術(shù)保障數(shù)據(jù)庫集群的高可用性以及高并發(fā)。在SEDA架構(gòu)下,整合多個MySQL數(shù)據(jù)庫對外提供統(tǒng)一的服務(wù),并結(jié)合zookeeper中間件進行集群同步,以全面提升數(shù)據(jù)庫的存儲和運算能力。
(二)應(yīng)用層設(shè)計
大數(shù)據(jù)的批處理是讓有界源數(shù)據(jù)(如本文中使用到的分布式MySQL數(shù)據(jù)庫)進行大批量數(shù)據(jù)的處理任務(wù)。大數(shù)據(jù)下的批處理涉及的數(shù)據(jù)量大,傳統(tǒng)的單進程模式難以在短時間內(nèi)完成。
隨著數(shù)據(jù)量的增加,前期曾引入過多線程模式,雖然在一定程度上緩解了處理效率低下的問題,但是受限于單機性能瓶頸,急需拓寬優(yōu)化思路。因此,如何將大任務(wù)拆分成多個小任務(wù),并分配到多個機器上實現(xiàn)并行處理,同時考慮到數(shù)據(jù)同步各任務(wù)間互不干擾,成為批處理優(yōu)化的重點。
當(dāng)前,隨著網(wǎng)絡(luò)的發(fā)展以及其在大數(shù)據(jù)處理方面的深入研究,分布式計算開始與計算理論相融合。例如,云計算和網(wǎng)格計算的核心思想是利用好網(wǎng)絡(luò)中的計算資源,分?jǐn)偞髷?shù)據(jù)的處理工作,從而發(fā)揮分布式計算的長處。當(dāng)前關(guān)注的科研轉(zhuǎn)化率需要將理論應(yīng)用到生產(chǎn)實踐中,從而為社會創(chuàng)造價值。在軟件的實際應(yīng)用中,并行計算和分布式計算的優(yōu)點是能夠充分發(fā)揮“集體的力量”,將大任務(wù)分解成小任務(wù),并分配給多個計算節(jié)點同時計算[6]。
分布式計算的優(yōu)勢主要體現(xiàn)在以下幾個方面:
面向服務(wù):分布式處理集群對用戶透明,用戶只需要提交任務(wù)請求,平臺就可以在處理完成后將結(jié)果返回給用戶。
降低成本:在單機處理模式下,運行大數(shù)據(jù)量的批處理需要相當(dāng)高的服務(wù)器配置,推高了軟件使用的成本。而分布式集群模式降低了對單個服務(wù)器的性能要求,可以根據(jù)實際需求平衡好成本和性能。
提高可用性:在單機處理模式下,單臺服務(wù)器的故障會導(dǎo)致系統(tǒng)直接宕機,給用戶帶來不良的體驗。在分布式集群模式下,多個計算節(jié)點可以互為熱備,單個服務(wù)器異常可以自動將其移除集群,并且不影響任務(wù)的繼續(xù)執(zhí)行。
在服務(wù)器集群分布式計算模式下,還需要考慮利用好每一個單機。因此,本文設(shè)計了多進程和多線程并發(fā)的模型,如圖1所示。在單進程多線程模式下,線程間共享主進程資源,當(dāng)線程數(shù)量超過合適的閾值后,會加劇資源的占用,造成系統(tǒng)性能的下降。而在多進程模式下,進程間的資源是獨立的,減少了資源爭用帶來的損耗。
在并發(fā)處理模型中使用了基于Kafka架構(gòu)的分布式消息中間件,其主要優(yōu)勢特點包括解耦、異步、削峰[7],其重要組成部分有:
Topic(主題):可以對消息進行區(qū)分,農(nóng)民畫按照批處理任務(wù)類型劃分Topic。
Producer(生產(chǎn)者):生產(chǎn)者即消息的創(chuàng)建者,在接收到任務(wù)后,生產(chǎn)者需要對任務(wù)進行拆分,隨后將子任務(wù)根據(jù)Topic放入對應(yīng)的消息隊列中。在消費者集群完成業(yè)務(wù)處理后,生產(chǎn)者則需要對結(jié)果數(shù)據(jù)進行整合并返回給客戶端。
Consummer(消費者):Kafka集群管理所有的消費者節(jié)點,而消費者節(jié)點監(jiān)聽訂閱的主題,在有任務(wù)到來時,從對應(yīng)的消息隊列中拉取子任務(wù)信息,以完成子業(yè)務(wù)邏輯處理。
三、技術(shù)實現(xiàn)
(一)數(shù)據(jù)庫層面的優(yōu)化
本文所研究的案例中,舊系統(tǒng)是基于Oracle的單實例數(shù)據(jù)庫,數(shù)據(jù)采用了集中式存儲,批處理的查詢處理速度非常緩慢。在業(yè)務(wù)方面,系統(tǒng)涉及的用戶數(shù)據(jù)的核心字段為地市(City_ID)和用戶ID(Acct_id),根據(jù)主鍵字段用戶ID統(tǒng)計有幾億用戶量。按照業(yè)務(wù)特點,可以根據(jù)City_ID進行分片。
由于各個城市用戶量分布極其不均衡,對于數(shù)據(jù)量大的城市(如:一線城市),規(guī)劃一個或多個片區(qū),再根據(jù)主鍵Acct_ID進行二次的水平拆分;對于數(shù)據(jù)量小的城市(如:縣級市),可以多地市合并到一個片區(qū)。此外,依托MySQL Cluster組合成MySQL集群可以為應(yīng)用層提供統(tǒng)一的服務(wù)。在拆分任務(wù)時,生產(chǎn)者需要充分利用分片數(shù)據(jù)庫特性,按照分片維度劃分子任務(wù),任務(wù)表結(jié)構(gòu)如表1所示。
(二)應(yīng)用層優(yōu)化
該系統(tǒng)舊批處理程序受限于單次處理的數(shù)據(jù)量,需要人為控制批處理的參數(shù),以減少單次處理的用戶量。例如,單次只處理一個地市的部分用戶,程序效率低下耗費了大量的人力。而經(jīng)過優(yōu)化后,可以采用分布式集群處理模式,處理方式如下:
1.在生產(chǎn)者進程接收到命令之后,完成任務(wù)的拆分入庫如圖2所示。首先,獲取用戶表的分片信息;其次,根據(jù)分片拆分子任務(wù),再次將子任務(wù)入庫后發(fā)送任務(wù)消息通知消費者;最后,等待消費者處理完畢后進行結(jié)果匯總。
2.在監(jiān)聽的主題上被喚醒后,消費者拉取子任務(wù)信息進行多線程處理并更新任務(wù)狀態(tài),如圖3所示。
(三)結(jié)果展示
為了驗證優(yōu)化方案的效率,本實驗采用了MySQL集群,按照每個分片表賬戶信息不超過10000條的原則進行水平拆分,共拆分了500個分片表。
實驗選用的環(huán)境為32核CPU、128G內(nèi)存的Linux服務(wù)器,使用JAVA語言進行代碼層實現(xiàn);利用ZooKeeper分布式調(diào)度框架,部署了1個生產(chǎn)者節(jié)點和8個消費者節(jié)點,每個消費者節(jié)點2個進程,每個進程包含12個并發(fā)線程。
當(dāng)client端發(fā)起批處理服務(wù)時,根據(jù)入侵命令處理了200個片區(qū)約60萬用戶的數(shù)據(jù),各節(jié)點的處理用戶量和處理時長如圖4所示。在舊有的單節(jié)點的批處理模式下,60萬用戶量需要人為控制拆分成多個串行批次,并執(zhí)行2個多小時。而經(jīng)過優(yōu)化后,60萬用戶的處理時長可以降低到15分鐘以內(nèi)。由此可見,通過分布式架構(gòu)優(yōu)化數(shù)據(jù)庫和應(yīng)用程序的方式是可行的,并且效果顯著。
四、結(jié)束語
在大數(shù)據(jù)背景下,通過數(shù)據(jù)庫集群化以及應(yīng)用系統(tǒng)處理的并行化,使得分布式架構(gòu)得到了更好地利用,不僅壓縮了批處理的處理時長,還能夠充分地利用已有服務(wù)器資源,以節(jié)約成本。在實際應(yīng)用中,本實驗可以根據(jù)情況調(diào)整生產(chǎn)者和消費者部署的節(jié)點個數(shù)以及單節(jié)點的并發(fā)線程數(shù),系統(tǒng)的靈活性、穩(wěn)定性得到了很好地驗證,因此以上方案在生產(chǎn)實踐中是完全可行的。
作者單位:郭俊 武漢工程大學(xué)網(wǎng)絡(luò)信息中心
參考文獻(xiàn)
[1]李建明.數(shù)據(jù)挖掘技術(shù)在互聯(lián)網(wǎng)中的應(yīng)用[J].集成電路應(yīng)用,2021,38(09):198-199.
[2]SIYOMVO SYLDIE.基于MySQL分布式數(shù)據(jù)庫系統(tǒng)同步分析與實現(xiàn)[J].微型電腦應(yīng)用,2015,31(02):61-64.
[3]張飛,姜進磊,李慶虎.利用MySQL構(gòu)建分布式應(yīng)用[J].計算機工程與應(yīng)用,2001(18):102-104,112.
[4]高見斌.基于MYSQL數(shù)據(jù)庫存儲引擎的研究[J].數(shù)字通信世界,2018(05):41,56.
[5]MySQL5.1Reference Manual:Chapter16[EB/OL].http://dev.mysql.com/doc/refman/5.1/en/replication.html.
[6]段孝國.分布式計算技術(shù)介紹[J].電腦知識與技術(shù),2011,7(22):5463-5465.
[7]Neha Narkhede,Gwen Shapira等著,薛命燈譯.Kafka權(quán)威指南[M].北京:人民郵電出版社,2018:12-54.