張暉
摘? 要:在商戶清分批處理作業(yè)中,應(yīng)用程序的高并發(fā)數(shù)和單機(jī)設(shè)備的資源利用率總是有一定上限,數(shù)據(jù)庫(kù)本身的處理能力和通訊帶寬也對(duì)批處理作業(yè)有一定的約束。根據(jù)清分?jǐn)?shù)據(jù)商戶原子性特征,設(shè)計(jì)了一種負(fù)載均衡的分片算法,實(shí)現(xiàn)清分批處理任務(wù)在多應(yīng)用、多數(shù)據(jù)庫(kù)間分布式、高并發(fā)協(xié)同完成,集群節(jié)點(diǎn)還可以線性擴(kuò)展。通過實(shí)驗(yàn)測(cè)試,對(duì)比使用該算法前后的負(fù)載均衡性能,分片算法能夠在保證商戶原子性的情況下有效均衡清分流水,顯著提高清分服務(wù)器集群的并發(fā)讀寫性能,從而證明了該算法的有效性。
關(guān)鍵詞:分布式;高并發(fā);商戶原子性;清分
中圖分類號(hào):TP312? ? ?文獻(xiàn)標(biāo)識(shí)碼:A
Research on Load Balancing Partition Algorithm of Merchant
Sorting based on Multi-database
ZHANG Hui
(China UnionPay Merchant Services Co., Ltd., Shanghai 201203, China)
hz-job@163.com
Abstract: In the merchant sorting batch tasks, high concurrency of applications and resource utilization of single equipment always have a certain upper limit. Processing capacity and communication bandwidth of the database also have certain constraints on batch jobs. According to the atomicity of merchant sorting data, this paper proposes to design a load balancing partition algorithm to realize the distributed and high-concurrency collaborative completion of sorting batch processing tasks among multiple applications and databases. The cluster nodes can also be linearly expanded. Experimental test is made by comparing the load balancing performance before and after using the algorithm. Results verify that the proposed partition algorithm can effectively balance the sorting pipeline under the condition of ensuring the atomicity of merchants, and significantly improve the concurrent read-write performance of the sorting server cluster, which proves its effectiveness.
Keywords: distributed; high concurrency; merchant atomicity; sorting
1? ?引言(Introduction)
數(shù)據(jù)清分系統(tǒng)通常要面對(duì)龐大的、多方的交易數(shù)據(jù),根據(jù)一定的業(yè)務(wù)、勾兌和計(jì)算規(guī)則對(duì)數(shù)據(jù)進(jìn)行清洗、拼接和計(jì)算等處理,從而得到各利益參與方的資金分配結(jié)果,為下游的資金結(jié)算和劃付提供依據(jù)。以上要求決定了清分系統(tǒng)每次處理的數(shù)據(jù)量都是千萬級(jí)別的,大型支付機(jī)構(gòu)甚至達(dá)到億級(jí)的流水處理量,并且通常要勾兌三方以上的源流水,業(yè)務(wù)邏輯復(fù)雜,處理時(shí)效要求高,處理時(shí)間段集中在各方聯(lián)機(jī)交易系統(tǒng)完成日切之后的幾個(gè)小時(shí)內(nèi),還要為異常情況下重跑批的補(bǔ)救工作留有足夠的冗余時(shí)間。在互聯(lián)網(wǎng)數(shù)據(jù)爆炸式增長(zhǎng)的大背景下,傳統(tǒng)的應(yīng)用單機(jī)(IBM小型機(jī))高并發(fā)已經(jīng)凸顯出IO和CPU瓶頸,應(yīng)用和數(shù)據(jù)庫(kù)分離也存在吞吐量[1]和網(wǎng)絡(luò)帶寬[2](千兆網(wǎng)絡(luò)交換機(jī))的性能瓶頸。為此,需要借助一定的負(fù)載均衡算法將龐大的業(yè)務(wù)處理均衡地分散到多節(jié)點(diǎn)(應(yīng)用+數(shù)據(jù)),以便多機(jī)(PC服務(wù)器)集群[3]并行分布式處理,實(shí)現(xiàn)處理能力的線性擴(kuò)展。這種集群技術(shù)可以用最少的投資獲得接近于大型主機(jī)的性能,可以滿足不斷增長(zhǎng)的負(fù)載需求[4]。由于具有橫向擴(kuò)展性,增加PC機(jī)的組合在性價(jià)比上已經(jīng)遠(yuǎn)超IBM小型機(jī)了,該方案的實(shí)施具有較好的經(jīng)濟(jì)效益。
2? 支付公司商戶清分系統(tǒng)一般模型(General model of merchant sorting system of payment company)
商戶清分系統(tǒng)的主要功能是匯聚清算組織(銀聯(lián)、網(wǎng)聯(lián))和其他第三方渠道清算流水,再對(duì)流水進(jìn)行預(yù)處理,根據(jù)商戶/機(jī)構(gòu)結(jié)算、分組規(guī)則,分潤(rùn)計(jì)算規(guī)則,費(fèi)用收取計(jì)算規(guī)則等信息,對(duì)清算數(shù)據(jù)進(jìn)行處理,計(jì)算應(yīng)收發(fā)卡轉(zhuǎn)接機(jī)構(gòu)金額、商戶本金、手續(xù)費(fèi)、分潤(rùn)、費(fèi)用等信息,并按要求生成商戶、機(jī)構(gòu)對(duì)賬報(bào)表、清分結(jié)果等文件。清分系統(tǒng)的功能定位決定了系統(tǒng)的模型如圖1所示。
清分處理的關(guān)鍵步驟是收集各方清算流水,按照設(shè)置的規(guī)則勾兌、計(jì)算,最終按各方要求出具各類明細(xì)和匯總報(bào)表。要在規(guī)定時(shí)間處理千萬甚至上億的流水就需要分布式并發(fā)處理,而并發(fā)處理的前提是流水的分片,合理的分片能達(dá)到良好的負(fù)載均衡效果,充分利用每個(gè)分布式節(jié)點(diǎn)的計(jì)算能力。
3? 清分?jǐn)?shù)據(jù)分片算法研究(Research on partition algorithm of sorting data)
支付領(lǐng)域中商戶清分系統(tǒng)的業(yè)務(wù)特點(diǎn)和清分系統(tǒng)的模型構(gòu)造,天然需要運(yùn)用分片思想來達(dá)到分布式并行處理的效果。分片原理就是要把一個(gè)原始問題分成若干子問題,先遞歸求得子問題的解,然后把這些解合并起來,得出原始問題的解。在確保商戶原子性的前提下,商戶清分業(yè)務(wù)需要分片架構(gòu)和與之適應(yīng)的分片算法協(xié)同完成。
3.1? ?分片算法思想
分片(Sharding)是指將內(nèi)存中的數(shù)據(jù)拆分成不同的塊,分別存儲(chǔ)到不同機(jī)器上的過程[5]。本文的分片是將商戶清分?jǐn)?shù)據(jù)按一定的算法拆分成不同的子文件,分別發(fā)送到不同的機(jī)器上的過程。通過分割數(shù)據(jù)到不同的服務(wù)器,讓數(shù)據(jù)集的不同部分分別由不同的服務(wù)器負(fù)責(zé),使得單個(gè)機(jī)器上的請(qǐng)求數(shù)減少,系統(tǒng)總負(fù)載得到提高,總存儲(chǔ)空間也得到提高[6]。
在商戶清分業(yè)務(wù)中,支付機(jī)構(gòu)給每個(gè)商戶都分配了唯一的商戶編號(hào)。對(duì)同一個(gè)商戶的交易要求在一個(gè)清分處理單元內(nèi)完成,這就是商戶的原子性。商戶原子性是本文負(fù)載均衡算法的出發(fā)點(diǎn),同時(shí)要解決如下幾個(gè)問題:
(1)撤銷交易查找原交易問題、多方文件勾兌問題;
(2)差錯(cuò)交易查找歷史原交易問題;
(3)聯(lián)機(jī)退貨交易查找歷史原交易問題;
(4)特殊商戶按照交易匯總金額清算問題;
(5)商戶檔案信息、配置信息共享問題;
(6)結(jié)果文件合并過程中非商戶維度問題、部分接口文件存在科目匯總問題;
(7)多庫(kù)數(shù)據(jù)中的唯一性沖突和歸集問題。
相應(yīng)的解決方式為:通過改良的倒序貪婪平均分配算法[7]解決(1)中的問題,通過差錯(cuò)交易獨(dú)立文件解決(2)中的問題,通過開發(fā)跨進(jìn)程的歷史庫(kù)查詢服務(wù)解決(3)中的問題,通過特殊商戶分組解決(4)中的問題,通過OGG[8]數(shù)據(jù)同步方式解決(5)中的問題,(6)、(7)中的問題通過在匯總服務(wù)器中二次加工來解決。先快速在流水文件中提取當(dāng)日當(dāng)批次發(fā)生交易的商戶號(hào)及對(duì)應(yīng)的交易筆數(shù),根據(jù)清分流水條數(shù)和服務(wù)器節(jié)點(diǎn)數(shù)來確定每臺(tái)服務(wù)器的負(fù)荷;接著對(duì)數(shù)據(jù)進(jìn)行切片,每個(gè)切片優(yōu)先分配筆數(shù)多的商戶,達(dá)到臨界點(diǎn)時(shí)用交易量少的商戶進(jìn)行微調(diào),確保每個(gè)商戶的完整交易都在一個(gè)切片中,并且每個(gè)節(jié)點(diǎn)設(shè)備的交易筆數(shù)均衡。
該分片方案在確保商戶原子性的基礎(chǔ)上,充分發(fā)揮了清分系統(tǒng)分布式高并發(fā)的計(jì)算效能,在實(shí)踐中達(dá)到了如下目標(biāo):
(1)清分分布式處理可以實(shí)現(xiàn)多臺(tái)設(shè)備交易量的負(fù)載均衡,保證商戶記錄的原子性。通過多臺(tái)機(jī)器的分?jǐn)偅瑢⒖偨灰琢糠诺蕉嗯_(tái)數(shù)據(jù)庫(kù)上分布式執(zhí)行,增加系統(tǒng)的吞吐量;加強(qiáng)了網(wǎng)絡(luò)數(shù)據(jù)處理能力,提升了網(wǎng)絡(luò)的靈活性和可用性;同一商戶的交易在同一個(gè)切片中處理,可以確保流水之間的關(guān)聯(lián)不被破壞。
(2)清分分布式處理可以線性擴(kuò)展處理節(jié)點(diǎn),應(yīng)對(duì)海量數(shù)據(jù)的處理。隨著交易量的增加,可以線性擴(kuò)展數(shù)據(jù)庫(kù)和應(yīng)用服務(wù)器的數(shù)量;單節(jié)點(diǎn)故障可以臨時(shí)替補(bǔ)備份機(jī),也可以重新分配執(zhí)行計(jì)劃,具有高容錯(cuò)性。
(3)清分分布式處理可以提升各類接口、報(bào)表的生成時(shí)效性。
3.2? ?分片集群架構(gòu)
批處理作業(yè)由于在實(shí)時(shí)計(jì)算過程中要傳輸大批量的流水,如果應(yīng)用和數(shù)據(jù)庫(kù)分離就會(huì)出現(xiàn)網(wǎng)絡(luò)傳輸瓶頸;如果應(yīng)用和數(shù)據(jù)庫(kù)不分離,在高并發(fā)下就會(huì)出現(xiàn)CPU、IO瓶頸。為了解決這個(gè)兩難境地,將源數(shù)據(jù)分片,每一片數(shù)據(jù)在一個(gè)應(yīng)用和數(shù)據(jù)庫(kù)共同體節(jié)點(diǎn)下計(jì)算處理,然后將各節(jié)點(diǎn)計(jì)算結(jié)果進(jìn)行合并處理,出具商戶和機(jī)構(gòu)要求結(jié)果報(bào)表。設(shè)計(jì)分片集群邏輯架構(gòu)如圖2所示。
在該架構(gòu)中,清分流水按照一定算法完成分片,每一個(gè)分片在一個(gè)節(jié)點(diǎn)中完成,一個(gè)節(jié)點(diǎn)的應(yīng)用和數(shù)據(jù)庫(kù)部署在一臺(tái)物理服務(wù)器上。計(jì)算規(guī)則通過公共配置庫(kù)實(shí)時(shí)同步到每個(gè)節(jié)點(diǎn)數(shù)據(jù)庫(kù),歷史庫(kù)也作為公共庫(kù),為每個(gè)節(jié)點(diǎn)提供差錯(cuò)交易查找原交易信息之用。當(dāng)所有節(jié)點(diǎn)計(jì)算完成后,接口合并單元匯集每個(gè)節(jié)點(diǎn)的數(shù)據(jù)結(jié)果進(jìn)行匯總計(jì)算,完成最終的清分報(bào)告。本文節(jié)點(diǎn)數(shù)據(jù)庫(kù)選用Oracle,也可以選用其他商用數(shù)據(jù)庫(kù),對(duì)于公共庫(kù)的訪問通過設(shè)計(jì)自定義數(shù)據(jù)庫(kù)訪問服務(wù)來完成,數(shù)據(jù)庫(kù)之間的信息同步使用OGG方式。日初和日終任務(wù)用于系統(tǒng)的監(jiān)控、資源的分配和回收等。
分片集群架構(gòu)中,公共庫(kù)(配置庫(kù)和歷史庫(kù))的數(shù)據(jù)無法放入每個(gè)集群節(jié)點(diǎn)中,本文設(shè)計(jì)了一套高效的訪問機(jī)制,如圖3所示。每個(gè)清分處理單元對(duì)應(yīng)的PC機(jī)上,在需要查詢公共庫(kù)信息時(shí),通過調(diào)用查詢公共庫(kù)client類(DBClient)中的查詢方法來實(shí)現(xiàn)歷史庫(kù)的查詢。考慮到公共庫(kù)中交易數(shù)據(jù)存放的完整性和原始性,DBClient只支持查詢(select),不支持更新(update)和插入(insert)等更改數(shù)據(jù)的操作方法。查詢公共庫(kù)client類(DBClient)中的方法使用短連接方式訪問數(shù)據(jù)庫(kù)。按照目前清分系統(tǒng)查詢公共庫(kù)的要求,DBClient封裝有很多種不同的查詢方法,每次調(diào)用DBClient的一個(gè)查詢方法,返回一條查詢結(jié)果(找到原交易或未找到原交易),若找到原交易,將原交易的查詢結(jié)果返回給查詢方法。
公共庫(kù)所在服務(wù)器上部署訪問數(shù)據(jù)服務(wù)DBServer,它是常駐公共庫(kù)系統(tǒng)的守護(hù)進(jìn)程,通過監(jiān)控指定的訪問端口port,用來響應(yīng)客戶端類DBClient的各種select查詢數(shù)據(jù)庫(kù)訪問方法,并將查詢結(jié)果返回給DBClient??紤]到客戶端類DBClient的并發(fā)查詢,該數(shù)據(jù)服務(wù)DBServer需支持多進(jìn)程訪問數(shù)據(jù)庫(kù)。
各分片節(jié)點(diǎn)完成計(jì)算后,要進(jìn)行文件合并、對(duì)賬單多維度重構(gòu)操作。對(duì)于后續(xù)的結(jié)算劃付文件,通過各子機(jī)器上傳的接口文件追加合并完成;對(duì)于標(biāo)準(zhǔn)化的商戶對(duì)賬單明細(xì)和匯總文件,也可以追加方式進(jìn)行合并,多序號(hào)文件還要進(jìn)行壓縮處理;對(duì)于個(gè)性化的分析報(bào)表,需要將子節(jié)點(diǎn)結(jié)果數(shù)據(jù)導(dǎo)入中間表,輔助公共庫(kù)中的配置信息進(jìn)行二次加工分析。
3.3? ?關(guān)鍵算法分析
首先遍歷清算組織下發(fā)的流水,比如銀聯(lián)下發(fā)的為ACOMN流水文件,統(tǒng)計(jì)出總交易條數(shù)S,發(fā)生交易的商戶數(shù)為m及每個(gè)商戶對(duì)應(yīng)的交易量Li(1≤i≤m)。如果設(shè)備分布式節(jié)點(diǎn)的個(gè)數(shù)為n,a=S/n,則分配給每個(gè)節(jié)點(diǎn)處理的條數(shù)Sj(1≤j≤n)的范圍為[a-d,a+d],d可根據(jù)情況進(jìn)行調(diào)整。在進(jìn)行分片拆分前,將特殊分組的商戶挑出來先分配到一臺(tái)機(jī)器上(假設(shè)是編號(hào)最后的一臺(tái)),對(duì)剩余的商戶可采用快速排序法,按照商戶交易量進(jìn)行降序排序,排序后的商戶交易量序列為L(zhǎng)i(1≤i≤m),Lm最大,L1最小。為了便于取商戶,設(shè)兩個(gè)指針變量,尾巴指針x=1,頭部指針y=m,用二維數(shù)組Qji(1≤j≤n,1≤i≤m)存儲(chǔ)商戶分配結(jié)果,以下是商戶分配算法的偽代碼。
商戶分配完之后,檢查指針x和y的位置,若存在未分配的商戶,需要將剩余商戶分配給Sj最小的節(jié)點(diǎn);然后根據(jù)Qji中的商戶,切割拆分各渠道的清算流水,并把拆分的流水推送到對(duì)應(yīng)的機(jī)器節(jié)點(diǎn)上。通過該算法就將清分系統(tǒng)待處理的數(shù)據(jù)源按照商戶記錄數(shù)切分成多片文件,由每個(gè)獨(dú)立的清分處理單元完成每個(gè)切分文件的數(shù)據(jù)批處理。批處理完成后將每個(gè)單元的批處理結(jié)果發(fā)送到歸集服務(wù)器,經(jīng)歸集服務(wù)器合并和多維重構(gòu)后,還原成下游結(jié)算、劃付需要的各類接口文件、商戶對(duì)賬文件和報(bào)表分析類文件。
在整個(gè)清分批處理的過程中,切片和合并的處理是單節(jié)點(diǎn),各個(gè)切片的清分計(jì)算在多節(jié)點(diǎn)分布式集群下處理。由于本切片算法和合并處理都是基于文件操作,可以在處理前將文件導(dǎo)入內(nèi)存,因?yàn)楹苌偕婕皩?duì)數(shù)據(jù)庫(kù)的訪問,因而切片和合并沒有IO的瓶頸障礙,可以通過應(yīng)用高并發(fā)和擴(kuò)展CPU數(shù)量來提升性能。
4 算法性能評(píng)估(Algorithm performance evaluation)
測(cè)試環(huán)境使用1 臺(tái)分片服務(wù)器,1 臺(tái)報(bào)表合并服務(wù)器,8 臺(tái)分布式計(jì)算服務(wù)器,每臺(tái)服務(wù)器內(nèi)存256 GB,CPU為Intel Xeon E5-2680 v4 14C ,千兆網(wǎng)口。操作系統(tǒng)是Suce Unix,數(shù)據(jù)庫(kù)使用Oracle 11g。分別測(cè)試了在應(yīng)用本分片算法前后清分跑批的時(shí)間消耗,如表1所示。
沒有使用該算法前,由于商戶的原子性,應(yīng)用是8 個(gè)計(jì)算節(jié)點(diǎn),數(shù)據(jù)庫(kù)只能是一個(gè)節(jié)點(diǎn)。這種情況下數(shù)據(jù)庫(kù)的CPU和IO利用率最高只能到達(dá)75%,應(yīng)用和數(shù)據(jù)庫(kù)間帶寬上、下限的流量都達(dá)到800 Mbs時(shí),加大應(yīng)用并發(fā)量也不能提升了,此時(shí)帶寬成了性能瓶頸。而使用本文的分片算法保證商戶原子性后,既能分布式處理,又能把應(yīng)用和數(shù)據(jù)庫(kù)放在一個(gè)物理節(jié)點(diǎn),不存在網(wǎng)絡(luò)傳輸瓶頸,每臺(tái)服務(wù)器的CPU和IO利用率可以壓測(cè)到95%以上,充分使用設(shè)備資源。
通過測(cè)試數(shù)據(jù)比對(duì)也發(fā)現(xiàn),設(shè)備資源得到充分釋放后,性能提升20%以上,并且隨著數(shù)據(jù)量的增加,性能提升效果更加明顯。這是由于分片算法克服了清分業(yè)務(wù)商戶原子性的問題,又能根據(jù)設(shè)備節(jié)點(diǎn)數(shù)負(fù)載均衡地分配任務(wù),將來計(jì)算節(jié)點(diǎn)可以橫向擴(kuò)展,應(yīng)對(duì)億級(jí)的清分流水量。
5? ?結(jié)論(Conclusion)
商戶清分系統(tǒng)作為支付機(jī)構(gòu)的核心業(yè)務(wù)系統(tǒng),是一種典型的批處理系統(tǒng),既不同于實(shí)時(shí)響應(yīng)的聯(lián)機(jī)交易系統(tǒng),也不同于高挖掘價(jià)值的大數(shù)據(jù)分析系統(tǒng)。公有云PASS層雖能提供各種分布式工具,但金融數(shù)據(jù)安全性存疑,搭建私有云又具有較高的成本。本文提供的負(fù)載均衡分片算法能夠靈活自主地實(shí)現(xiàn)商戶清分高效分布式處理,保證了商戶原子性,兼顧了安全性和實(shí)時(shí)性,為業(yè)界千萬級(jí)以上交易量的清分提供了一種思路。由于篇幅所限,本文對(duì)多節(jié)點(diǎn)的調(diào)度管理和個(gè)別節(jié)點(diǎn)異常情況下的恢復(fù)措施不再詳細(xì)探討。
參考文獻(xiàn)(References)
[1] DONG H, SI H, ZONG H, et al. Unstructured mesh generation based on Parallel Virtual Machine in cyber-physical system[J]. EURASIP Journal on Wireless Communications and Networking, 2019(1):1-11.
[2] ZHE S J. Cloud-computing load-balancing mechanism dependent on marine environmental information[J]. Journal of Coastal Research, 2019, 98(sp1):137-140.
[3] SHARMA D. Response time based balancing of load in web server clusters[C]// 2018 International Conference on Reliability. Infocom Technologies and Optimization (Trends and Future Directions) (ICRITO). Noida, India: IEEE, 2018:471-476.
[4] 周瑩蓮,劉甫.服務(wù)器負(fù)載均衡技術(shù)研究[J].計(jì)算機(jī)與數(shù)字工程,2010,38(4):11-14,35.
[5] 陳敬靜,馬明棟,王得玉.MongoDB負(fù)載均衡算法優(yōu)化研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2020,30(03):88-92.
[6] 李朝奎,嚴(yán)雯英,楊武,等.三維城市模型數(shù)據(jù)劃分及分布式存儲(chǔ)方法[J].地球信息科學(xué)學(xué)報(bào),2015,17(12):1442-1449.
[7] 黃景修,劉清堂,吳林靜.一種面向多終端服務(wù)的學(xué)術(shù)會(huì)議管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2016,33(07):68-71,101.
[8] 賈海軍.一種基于OGG方式進(jìn)行數(shù)據(jù)遷移的研究[J].軟件,2015(05):140-144.
作者簡(jiǎn)介:
張? 暉(1981-),男,碩士,高級(jí)工程師/經(jīng)濟(jì)師.研究領(lǐng)域:軟件工程.