《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 設(shè)計應(yīng)用 > 低成本分布式郵件備份系統(tǒng)的設(shè)計和實現(xiàn)
低成本分布式郵件備份系統(tǒng)的設(shè)計和實現(xiàn)
來源:微型機(jī)與應(yīng)用2012年第5期
劉 波,楊 強(qiáng)
(趨勢科技中國研發(fā)中心,江蘇 南京 210012)
摘要: 為了利用廉價的普通桌面電腦構(gòu)建高性能、高可靠、低成本的電子郵件備份系統(tǒng),設(shè)計了基于SOA的對等網(wǎng)絡(luò)存儲架構(gòu),貫徹了低耦合、無狀態(tài)、異步通信和自適應(yīng)的設(shè)計原則。系統(tǒng)將輸入數(shù)據(jù)流和輸出數(shù)據(jù)流分開處理,分別將郵件數(shù)據(jù)和索引信息保存在磁盤文件和數(shù)據(jù)庫中,兼顧了高容量和快速查找的的要求。
Abstract:
Key words :

摘  要: 為了利用廉價的普通桌面電腦構(gòu)建高性能、高可靠、低成本電子郵件備份系統(tǒng),設(shè)計了基于SOA的對等網(wǎng)絡(luò)存儲架構(gòu),貫徹了低耦合、無狀態(tài)、異步通信和自適應(yīng)的設(shè)計原則。系統(tǒng)將輸入數(shù)據(jù)流和輸出數(shù)據(jù)流分開處理,分別將郵件數(shù)據(jù)和索引信息保存在磁盤文件和數(shù)據(jù)庫中,兼顧了高容量和快速查找的的要求。
關(guān)鍵詞: 電子郵件;備份;分布式存儲;SOA;低成本

 在一個在線電子郵件掃描系統(tǒng)中,需要設(shè)計一個安全可靠的存儲系統(tǒng),暫時保存被隔離的電子郵件。這些郵件一直保留在系統(tǒng)內(nèi),直到用戶選擇釋放或者到期失效。這是一個需要精心設(shè)計的系統(tǒng),考慮牽涉到的數(shù)據(jù)量和在線系統(tǒng)所要求的高可靠性,如何用盡可能低的成本實現(xiàn)這個系統(tǒng),成為項目團(tuán)隊面對的主要挑戰(zhàn)。
1 分布式郵件備份系統(tǒng)的技術(shù)需求和設(shè)計原則
 郵件備份系統(tǒng)最基本的要求是高吞吐量,具體來講,要求能達(dá)到每秒1 000封郵件(平均大小10 KB)的最大輸入速度,用戶的郵件要能保存最多60天,系統(tǒng)總?cè)萘吭?0 TB以上,用戶的檢索速度應(yīng)該控制在1 s以內(nèi)。
 作為一個商業(yè)運(yùn)營的在線系統(tǒng),除了具備很高的性能以外,還要具備很高的可靠性和盡可能低的成本。系統(tǒng)的SLA[1](Service Level Agreement)要達(dá)到99.99%以上,也就是說運(yùn)行一年的停機(jī)時間必須控制在52 min以內(nèi)。在線系統(tǒng)的主要成本包括數(shù)據(jù)中心的成本和運(yùn)行維護(hù)成本。數(shù)據(jù)中心的成本主要由硬件成本、網(wǎng)絡(luò)成本、其他成本如電費(fèi)、冷卻、機(jī)架空間等構(gòu)成,而運(yùn)營成本主要由運(yùn)營維護(hù)、技術(shù)支持等費(fèi)用構(gòu)成。依據(jù)上述基本要求,確定了郵件備份系統(tǒng)的基本技術(shù)需求:(1)單機(jī)高效率,系統(tǒng)高吞吐;(2)使用低成本硬件,避免使用昂貴硬件;(3)提供高可伸縮性;(4)部署自動化;(5)管理智能化。
 根據(jù)上述需求,確立系統(tǒng)整體設(shè)計的原則,主要包括下述四點:
?。?)低耦合。耦合是指系統(tǒng)的子模塊之間結(jié)合的緊密程度,一個低耦合的系統(tǒng)不但要降低模塊之間的靜態(tài)依賴關(guān)系,而且要盡可能地降低模塊在時間和空間上的依賴關(guān)系。低耦合的系統(tǒng)可以降低模塊之間的相互影響,提高系統(tǒng)的擴(kuò)展性。
?。?)無狀態(tài)。無狀態(tài)的服務(wù)不在內(nèi)部保留狀態(tài)數(shù)據(jù),上一個請求和下一個請求之間沒有任何關(guān)系。無狀態(tài)的服務(wù)更容易實現(xiàn)水平擴(kuò)展。
?。?)異步通信。異步通信可以提高通信的效率,請求發(fā)送者無需等待服務(wù)的返回,節(jié)點之間不需要互相等待,可以提高每個節(jié)點的處理效率。
?。?)自適應(yīng)。自適應(yīng)的系統(tǒng)能夠自動調(diào)整、優(yōu)化運(yùn)行參數(shù)、應(yīng)對運(yùn)行環(huán)境的變化。能夠自我調(diào)整,也就減少了人為干預(yù)的要求,降低了維護(hù)費(fèi)用,而且自動調(diào)整顯然比人為干預(yù)反應(yīng)更快、也更準(zhǔn)確,所以也提高了可靠性。
2 分布式郵件備份系統(tǒng)的設(shè)計
2.1 整體框架設(shè)計

 系統(tǒng)的整體設(shè)計采用SOA[2]的架構(gòu),系統(tǒng)由三種不同的角色構(gòu)成,其關(guān)系如圖1所示。

 組件A和B完成系統(tǒng)特定的某些功能,A和B對外部提供Restful[3]風(fēng)格的Web應(yīng)用接口,但是A和B之間互相沒有調(diào)用關(guān)系,也不知道彼此的存在。Registry是一個注冊服務(wù)器[4],所有的組件都在Registry注冊,并不斷通過心跳信號更新自己的狀態(tài)到Registry;而且Registry維護(hù)一張系統(tǒng)所有組件的狀態(tài)表,對于超時沒有更新的組件,就將其從列表中刪除。Helper負(fù)責(zé)將數(shù)據(jù)從一個組件傳送到另一個組件;可以從Registry得到當(dāng)前系統(tǒng)的所有組件清單以及組件之間的邏輯聯(lián)系關(guān)系,并據(jù)此進(jìn)行數(shù)據(jù)轉(zhuǎn)運(yùn)工作;使用標(biāo)準(zhǔn)的HTTP命令從一個組件的輸出隊列得到數(shù)據(jù),然后同樣用HTTP命令將數(shù)據(jù)發(fā)送到下游的組件。
同一類型的組件可以同時有多個實例存在,以提供高可靠性和任務(wù)負(fù)載的均衡擴(kuò)充。Helper本身也可以有多個實例存在,提供多個上游組件和下游組件之間的動態(tài)數(shù)據(jù)交換和負(fù)載均衡。
 組件工作在異步的模式下,每個組件都有一個輸入隊列和一個輸出隊列,需要處理的數(shù)據(jù)通過Web接口被放進(jìn)輸入隊列,組件的數(shù)據(jù)處理程序依次從輸入隊列讀取數(shù)據(jù),處理完成后放入輸出隊列,然后通過Web接口被取走。組件擁有完成處理工作所需要的所有資源和數(shù)據(jù),可以獨(dú)立完成自己的任務(wù)。這是保證組件異步、高效工作的重要前提條件。
 一個最簡單的系統(tǒng)至少包括三種不同的功能組件,它們分別是Generator、Processor和Terminator。它們之間的關(guān)系如圖2所示。

 Generator是任務(wù)的發(fā)起方,一個Generator至少有一個任務(wù)輸出隊列和一個對應(yīng)的ACK輸入隊列。Generator產(chǎn)生的任務(wù)數(shù)據(jù)在任務(wù)輸出隊列中排隊等候Helper轉(zhuǎn)送到Processor進(jìn)行處理。一旦一個任務(wù)被送到Processor,這個任務(wù)就被放入一個等候確認(rèn)的隊列,等候任務(wù)完成的確認(rèn)。Processor至少有一個任務(wù)輸入隊列和一個結(jié)果輸出隊列,即從任務(wù)輸入隊列取得待處理任務(wù),進(jìn)行處理后放入結(jié)果輸出隊列,由Helper送到Terminator。Terminator對結(jié)果進(jìn)行最后的處理后,生成對應(yīng)的ACK,ACK被送回Generator,完成一個完整的任務(wù)處理生命周期。如果Generator在規(guī)定時間里沒有收到一個任務(wù)的ACK,說明這個任務(wù)可能在系統(tǒng)內(nèi)被丟失了,按不同的業(yè)務(wù)邏輯,Generator可以重新發(fā)送這個任務(wù),也可以丟棄這個任務(wù)。確認(rèn)-重發(fā)機(jī)制保證了異步系統(tǒng)中數(shù)據(jù)的可靠性問題,較好地解決了節(jié)點失效時丟失任務(wù)的問題。此外,通過Helper橋接的設(shè)計允許在一個任務(wù)處理序列里組合多個不同的Processor來完成復(fù)雜的任務(wù)而不用修改程序,這種重組甚至可以在運(yùn)行中的系統(tǒng)上動態(tài)完成,大大提高了系統(tǒng)的彈性。
 圖3是郵件備份系統(tǒng)的架構(gòu)圖,主要的組件是QtStorage和QtDAL。QtStorage負(fù)責(zé)存儲郵件的原始信息(包括郵件的原文、發(fā)送者、接收者等信息),將收到的郵件寫入存儲區(qū)域后,會將郵件及相關(guān)信息編制成摘要。QtDAL負(fù)責(zé)將郵件的摘要存儲在數(shù)據(jù)庫中,并為用戶提供檢索服務(wù)。為了實現(xiàn)高效率的運(yùn)作,存儲系統(tǒng)的設(shè)計采用了讀寫分開的思想。大量原始數(shù)據(jù)的寫入在QtStorage上完成,QtStorage擁有多個實例,可以分散寫入的壓力,同時也能夠提供多重冗余,實現(xiàn)高可用性。QtStorage可以實現(xiàn)無縫的橫向擴(kuò)展,其存儲能力和容量隨之?dāng)U展。經(jīng)過QtStorage處理過的摘要信息,其容量已經(jīng)大大縮減,所以可以采用單一的索引節(jié)點來保存,單一節(jié)點可以以較低的代價實現(xiàn)數(shù)據(jù)的一致性。這里的QtDAL就是這樣的一個索引節(jié)點,用戶的查找和讀取主要發(fā)生在QtDAL上,查找和讀取索引信息和數(shù)據(jù)的寫入發(fā)生在不同的節(jié)點上,這樣就實現(xiàn)了數(shù)據(jù)的讀寫分開,提高了運(yùn)行效率。只有在用戶需要取回被隔離的原始郵件時,才會到QtStorage上去讀取,按照系統(tǒng)的設(shè)計邏輯,這是一個概率極低的操作,不會對系統(tǒng)構(gòu)成很大的影響。

 

 

2.2 文件存儲服務(wù)
 文件存儲服務(wù)為整個系統(tǒng)提供原始數(shù)據(jù)的存儲服務(wù)。根據(jù)經(jīng)驗,這部分的成本是整個系統(tǒng)成本的主要構(gòu)成部分。為了保持低成本,必須避免使用價格昂貴的高性能存儲設(shè)備,如SAN、NAS等。而且為了便于擴(kuò)展和維護(hù),一些需要特別硬件支持的存儲設(shè)備也不能考慮,如RAID陣列等。一個可行的設(shè)計思路是使用最廉價的PC和隨機(jī)安裝的硬盤來構(gòu)成系統(tǒng)。商用的PC可以安裝4個處理核心的CPU和2 TB以上的硬盤,其性能和容量已經(jīng)足以滿足系統(tǒng)的需求。但是不論是PC的硬件還是硬盤本身,其可靠性和穩(wěn)定性都不能達(dá)到99.99%的可靠性。解決的方法是用多重冗余的方式構(gòu)建系統(tǒng),不但數(shù)據(jù)的保存是多重冗余的,而且處理節(jié)點也是多重冗余的。
2.2.1 數(shù)據(jù)的寫入
 圖4是文件存儲系統(tǒng)的設(shè)計。Storage 1~3是3個存儲節(jié)點,各自帶有2 TB的硬盤存儲數(shù)據(jù),并對外開放3個Web接口,分別是接收文件輸入的Input Queue、輸出文件索引信息的Index Queue和輸出文件同步包的Sync Queue。一個文件的存儲過程可以用以下步驟描述:

 (1)Helper隨機(jī)挑選一個Storage節(jié)點(例如Storage 1),將待保存的文件及控制信息一起發(fā)送到Storage 1的Input Queue。
 (2)Storage 1將文件存盤,生成文件的索引信息,將索引放到Index Queue。
?。?)Storage 1修改文件控制信息,將文件和控制信息添加到Sync Queue。
?。?)Helper從Storage 1的Sync Queue中將待同步文件取出,送到另一個Storage節(jié)點(例如Storage 2)。
?。?)Helper將索引信息從Storage 1取出,送到數(shù)據(jù)庫保存。
?。?)Storage 2重復(fù)上述步驟,直到重復(fù)存儲次數(shù)達(dá)到需要的冗余度為止。
這個設(shè)計的主要特點如下:
?。?)每個Storage節(jié)點都同時具有處理能力和存儲容量,添加節(jié)點就可以同時擴(kuò)展處理能力和容量,系統(tǒng)的擴(kuò)展是對稱的,非常利于管理和維護(hù)。
?。?)Storage節(jié)點之間沒有相互依賴性,任何一個Storage節(jié)點因為故障下線,都不會對整個系統(tǒng)產(chǎn)生影響。
?。?)每個文件需要多少冗余度、是否加密、是否壓縮,都可以單獨(dú)控制,非常靈活。
 (4)添加新的Storage節(jié)點后,負(fù)載會自動均衡到新的節(jié)點上,有利于資源的有效利用。
?。?)系統(tǒng)要求的保存文件期限最多60天,所以在3冗余或更多冗余的情況下,可以不用考慮損壞節(jié)點的文件恢復(fù)功能。即使使用可靠性較低的普通PC和SATA硬盤,也可以保證文件在60天內(nèi)的可用性。
?。?)讀寫分開,大負(fù)荷的文件寫入被分散到數(shù)量眾多的Storage節(jié)點上,數(shù)據(jù)庫節(jié)點只負(fù)責(zé)少量、偶爾的用戶查詢操作,提高了硬件效率,降低了成本。
 (7)系統(tǒng)并不是嚴(yán)格一致的,通過犧牲部分一致性,獲得了較好的擴(kuò)展性和可用性,是CAP[5]原則的具體實踐。
 (8)Storage節(jié)點之間是沒有聯(lián)系、沒有交互的,所有的數(shù)據(jù)交換都通過Helper進(jìn)行。文件的控制信息隨同文件數(shù)據(jù)本身傳送,沒有任何一個節(jié)點管理和追蹤文件的去向,各個節(jié)點間通過合作完成任務(wù),沒有中心控制節(jié)點。這個過程充分體現(xiàn)了“低耦合”、“異步”、“無狀態(tài)”的設(shè)計原則。
需要說明的是,Storage節(jié)點的數(shù)目建議大于系統(tǒng)設(shè)置的最高冗余度。例如對于3冗余的系統(tǒng),Storage節(jié)點建議至少設(shè)置4個,這樣,在某一個節(jié)點因故下線的時候,系統(tǒng)仍然可以正常運(yùn)行。當(dāng)然,設(shè)置更多的節(jié)點可以獲得更好的可靠性和性能。
2.2.2 數(shù)據(jù)的查詢
 數(shù)據(jù)的查詢相當(dāng)簡單,按照用戶提供的查詢條件,可以在數(shù)據(jù)庫中查詢到符合條件的記錄,每條記錄中都包含對應(yīng)的數(shù)據(jù)文件在Storage節(jié)點上的位置。如果用戶需要讀取原始數(shù)據(jù),可以調(diào)用Storage節(jié)點上的API接口,提供位置信息,讀取原始數(shù)據(jù)。記錄中包含文件的多個冗余備份的位置,如果一個節(jié)點失效或者不能訪問,可以讀取備用節(jié)點上的信息。
2.2.3 數(shù)據(jù)的刪除
 數(shù)據(jù)的刪除分為數(shù)據(jù)庫記錄的刪除和數(shù)據(jù)文件的刪除,數(shù)據(jù)庫節(jié)點和Storage節(jié)點都有內(nèi)置的定時任務(wù),可以按時間刪除已經(jīng)過期的數(shù)據(jù)。
2.2.4 系統(tǒng)容量的擴(kuò)展和故障節(jié)點的替換
 當(dāng)文件存儲系統(tǒng)的容量不能滿足要求時,需要對系統(tǒng)容量進(jìn)行擴(kuò)展,這種擴(kuò)展應(yīng)該是一種簡單的、無縫的操作,不能干擾系統(tǒng)的正常運(yùn)行,不需要修改軟件,不需要停機(jī)以及盡量少的配置改動。本系統(tǒng)較好地實現(xiàn)了上述要求。
2.3 索引數(shù)據(jù)庫
 索引數(shù)據(jù)庫保存著所有備份郵件的索引信息和位置信息。這是一個標(biāo)準(zhǔn)的關(guān)系型數(shù)據(jù)庫,采用開源的PostgresSQL實現(xiàn)。數(shù)據(jù)庫主要包括兩張表,如圖5所示。


 為了提高數(shù)據(jù)的安全性,可以設(shè)置將備份的郵件在不同節(jié)點上拷貝多份冗余。圖7即為冗余度設(shè)置為2時的測試數(shù)據(jù),考察了不同節(jié)點數(shù)量對性能的影響。可以看到,隨著系統(tǒng)節(jié)點數(shù)的增加,系統(tǒng)性能也呈基本線性地增加,這充分反映了節(jié)點間異步通信的重要性。異步通信削弱了節(jié)點間在時間上的依賴關(guān)系,通過犧牲局部的、臨時的一致性,充分發(fā)揮了每個節(jié)點的處理能力,提高了系統(tǒng)的效率。

 為了進(jìn)一步提高數(shù)據(jù)可靠性,可以把冗余度設(shè)置到3,此時每封郵件在系統(tǒng)內(nèi)有三份拷貝,達(dá)到了極高的可靠性。如圖8所示,在4節(jié)點3冗余的測試環(huán)境下,系統(tǒng)的吞吐速率達(dá)到了3 000封/s(10 KB郵件)和2 000封/s(30 KB郵件)。如果等價成單個節(jié)點的平均速率的話,分別達(dá)到2 250封/s和1 500封/s,比單節(jié)點的性能還要好些。這是因為隨節(jié)點的增多,不但存儲空間得到擴(kuò)展、可靠性得到增加,CPU的數(shù)量和處理能力也得到加強(qiáng),更多的CPU的加入,也在一定程度上提高了系統(tǒng)的整體處理能力。

3.3 結(jié)果分析
 通過對結(jié)果的分析,發(fā)現(xiàn)在單節(jié)點場景下,采用30 KB郵件樣本時系統(tǒng)達(dá)到了42 MB/s的寫入速度,而10 KB郵件的寫入速度為18 MB/s,兩種測試環(huán)境中CPU占用均為30%左右,說明系統(tǒng)瓶頸不在CPU和I/O中。通過對代碼實現(xiàn)的審查發(fā)現(xiàn),問題主要是同步寫文件導(dǎo)致的,對文件的同步讀寫操作降低了I/O的效率,并且隨樣本的縮小,讀寫操作的頻繁化而更趨惡化。這就是為什么小樣本性能不成比例增加的根本原因。全面采用異步磁盤I/O操作可以很好地改善這個問題,但是異步I/O程序遠(yuǎn)較同步I/O復(fù)雜,而且在本項目里,即使是同步I/O也足夠滿足性能需求,所以本設(shè)計最后決定保持目前的代碼不變。
 比較不同組合條件下的測試結(jié)果可以發(fā)現(xiàn),性能隨冗余度的增加而降低、隨節(jié)點數(shù)目的增加而提高,三者間的關(guān)系接近線性關(guān)系。如果節(jié)點數(shù)目增加一倍,性能也能夠增加一倍。增加冗余度會降低性能,但可以通過增加節(jié)點來補(bǔ)償。同時添加節(jié)點數(shù)量和冗余度,能夠得到更好的可靠性和性能,并且收益并不隨節(jié)點數(shù)目的增加而遞減。對于一個分布式系統(tǒng),這是一個非常可貴的特質(zhì)。因為管理者可以通過簡單的添加處理節(jié)點,獲取更多的存儲和處理能力。
 為了最大限度地降低成本、提高可靠性,在設(shè)計的初期階段就確立了低耦合、無狀態(tài)、異步通信和自適應(yīng)這四個設(shè)計準(zhǔn)則。通過放寬對一致性的要求,僅保證最終一致性,充分解耦各個節(jié)點間的依賴關(guān)系,獲得了優(yōu)異的可靠性和可擴(kuò)展性。最終的測試結(jié)果也證明了這種設(shè)計思路的正確性,采用普通桌面計算機(jī)和廉價磁盤組成的系統(tǒng)足以在容量、性能、可靠性和可擴(kuò)展性方面滿足要求,而成本僅為傳統(tǒng)方案的十分之一。
參考文獻(xiàn)
[1] TANENBAUM A S, STEEN M V. Distributed systems principles and paradigms[M].楊劍鋒,常曉波,李敏,譯,北京:清華大學(xué)出版社,2004.
[2] JOSUTTIS N M. SOA in practice[M].程樺,譯.北京:電子工業(yè)出版社,2008.
[3] ROCHARDSON L, RUBY S. RESTful Web Services中文版[M].徐涵,李紅軍,胡偉,譯.北京:電子工業(yè)出版社,2008.
[4] 杜宗霞, 懷進(jìn)鵬, 主動分布式Web服務(wù)注冊機(jī)制研究與實現(xiàn)[J]. 軟件學(xué)報,2006,17(3):454-462
[5] BREWER E A. Towards robust distributed systems. (Invited Talk)Principles of Distributed Computing, Portland, Oregon, July 2000.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。