艾麗蓉,李 凱
(西北工業(yè)大學(xué) 計(jì)算機(jī)學(xué)院,陜西 西安 710129)
面對(duì)日益增長(zhǎng)的海量數(shù)據(jù),傳統(tǒng)的單機(jī)集中式數(shù)據(jù)庫(kù)的弊端日益顯現(xiàn)[1-2]。為了解決單機(jī)數(shù)據(jù)庫(kù)下數(shù)據(jù)存不下、難于擴(kuò)展、查詢(xún)延遲大等問(wèn)題,需要在橫向或縱向上升級(jí)數(shù)據(jù)庫(kù)配置。在縱向升級(jí)配置提高數(shù)據(jù)庫(kù)的性能主要是采用大型機(jī)、大型機(jī)與PGStorm的方式。其中PGStorm可將CPU的密集型工作負(fù)載轉(zhuǎn)移到GPU處理,從而利用GPU強(qiáng)大的并行執(zhí)行能力完成處理任務(wù)。Postgres-XL是在橫向上對(duì)PostgreSQL進(jìn)行了擴(kuò)展。雖然,Postgres-XL相對(duì)PostgreSQL提升了數(shù)據(jù)庫(kù)處理性能,但是,針對(duì)Postgres-XL本身的優(yōu)化也是十分必要的。
Postgres-XL是基于PostgreSQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)的真正意義上的分布式數(shù)據(jù)庫(kù)。目前大多數(shù)數(shù)據(jù)庫(kù)的水平拆分的方案都有很多限制,譬如不能跨機(jī)器Join、對(duì)SQL有各種限制。Postgres-XL實(shí)現(xiàn)得更加徹底,用戶(hù)訪問(wèn)集群數(shù)據(jù)庫(kù)就跟單機(jī)數(shù)據(jù)庫(kù)一樣。
Postgres-XL全稱(chēng)為Postgres eXtensible Lattice,它使用了開(kāi)源協(xié)議允許將開(kāi)源代碼與閉源代碼混在一起使用。同時(shí)它還有自己很多獨(dú)特的特性,譬如真正完全支持集群級(jí)別的數(shù)據(jù)一致性(ACID)、支持OLAP應(yīng)用、采用MPP(massively parallel processing,大規(guī)模并行處理系統(tǒng))架構(gòu)模式、讀寫(xiě)可拓展、可用作分布式Key-Value存儲(chǔ)、支持分布式多版本控制(MVCC)等。
在性能方面,隨著數(shù)據(jù)節(jié)點(diǎn)數(shù)的增長(zhǎng),Postgres-XL擴(kuò)展能力的增加呈線性增長(zhǎng)趨勢(shì)。實(shí)際測(cè)試結(jié)果是,當(dāng)有3個(gè)數(shù)據(jù)節(jié)點(diǎn)時(shí)可以達(dá)到PostgreSQL數(shù)據(jù)庫(kù)大約2倍的性能,5個(gè)節(jié)點(diǎn)為3倍,10個(gè)節(jié)點(diǎn)為6倍左右。
Postgres-XL是一個(gè)基于PostgreSQL數(shù)據(jù)庫(kù)的橫向擴(kuò)展開(kāi)源數(shù)據(jù)庫(kù)集群,擁有足夠的靈活性來(lái)處理不同的工作負(fù)載。
Postgres-XL支持MPP,允許數(shù)據(jù)節(jié)點(diǎn)間通信,交換復(fù)雜跨節(jié)點(diǎn)關(guān)聯(lián)查詢(xún)相關(guān)數(shù)據(jù)信息。Postgres-XL的主要節(jié)點(diǎn)有:全局事務(wù)管理器(global transaction manager,GTM)、協(xié)調(diào)器(coordinator)、數(shù)據(jù)節(jié)點(diǎn)(datanode)。GTM主要負(fù)責(zé)處理多版本并發(fā)控制任務(wù),包括數(shù)據(jù)庫(kù)事務(wù)的ID以及數(shù)據(jù)快照,同時(shí)它還管理集群中全局性數(shù)據(jù),譬如時(shí)間戳等。coordinator負(fù)責(zé)處理客戶(hù)端的網(wǎng)絡(luò)連接,分析查詢(xún)語(yǔ)句,生成語(yǔ)句的執(zhí)行計(jì)劃,然后將計(jì)劃發(fā)送到目的數(shù)據(jù)節(jié)點(diǎn)執(zhí)行。數(shù)據(jù)節(jié)點(diǎn)主要存放具體的物理數(shù)據(jù)。除了上述節(jié)點(diǎn)之外,Postgres-XL為了減輕GTM負(fù)載,還可以部署GTM Proxy節(jié)點(diǎn),GTM Proxy代理coordinator和datanode對(duì)GTM進(jìn)行訪問(wèn)。
對(duì)Postgres-XL的優(yōu)化主要體現(xiàn)為在有限的時(shí)間內(nèi)提高系統(tǒng)吞吐量。數(shù)據(jù)庫(kù)系統(tǒng)吞吐量是指單位時(shí)間內(nèi)處理的事務(wù)數(shù)。為了提高數(shù)據(jù)庫(kù)系統(tǒng)的吞吐量,一般需要提高緩存命中率、降低磁盤(pán)IO。
隨著數(shù)據(jù)庫(kù)中數(shù)據(jù)量的增加,數(shù)據(jù)庫(kù)表的查詢(xún)效率非常低下。為了解決上述問(wèn)題,基于Postgres-XL分區(qū)表和表繼承特性實(shí)現(xiàn)了表的水平拆分以及垂直拆分。Postgres-XL數(shù)據(jù)庫(kù)表的水平拆分是按照某種規(guī)則將數(shù)據(jù)庫(kù)表進(jìn)行劃分,然后將數(shù)據(jù)存儲(chǔ)到多個(gè)結(jié)構(gòu)相同的表中。例如,對(duì)于重慶某區(qū)的執(zhí)法系統(tǒng)案件表,可以按照案件處理的時(shí)間拆分,2015年和2016年的數(shù)據(jù)分別存放在結(jié)構(gòu)相同的表中,這樣就可以根據(jù)不同的時(shí)間進(jìn)行區(qū)分,提高訪問(wèn)效率。數(shù)據(jù)庫(kù)表的垂直拆分很容易地解決了表跟表之間的IO競(jìng)爭(zhēng),但是沒(méi)有解決單個(gè)數(shù)據(jù)表數(shù)據(jù)量大的問(wèn)題。而數(shù)據(jù)庫(kù)表的水平拆分,解決了大數(shù)據(jù)表數(shù)據(jù)量大的問(wèn)題,但是沒(méi)有解決表之間的IO爭(zhēng)奪。因此大多方案是采取兩者結(jié)合的方式,如圖1所示。
圖1 組合拆分
在傳統(tǒng)數(shù)據(jù)庫(kù)中,對(duì)數(shù)據(jù)庫(kù)表進(jìn)行水平或者垂直拆分的復(fù)雜度是非常高的,而且容易產(chǎn)生附屬問(wèn)題,譬如事務(wù)、跨表Join操作等。目前Postgres-XL支持的分區(qū)有范圍分區(qū)和列表分區(qū)。范圍分區(qū)是表根據(jù)一個(gè)或者多個(gè)字段拆分成范圍,在不同范圍內(nèi)存放沒(méi)有鍵值重復(fù)的數(shù)據(jù);列表分區(qū)指在表中明確指出每個(gè)分區(qū)里應(yīng)該出現(xiàn)哪些字段[3]。
SQL/MED(management of external data)是SQL語(yǔ)言中管理外部數(shù)據(jù)的一個(gè)擴(kuò)展標(biāo)準(zhǔn),這個(gè)標(biāo)準(zhǔn)定義在SQL:2003中,它通過(guò)定義一個(gè)外部數(shù)據(jù)包裝器和數(shù)據(jù)連接類(lèi)型來(lái)管理外部數(shù)據(jù)[4]。Postgres-XL提供了對(duì)SQL/MED標(biāo)準(zhǔn)的支持,通過(guò)SQL/MED連接到各種異構(gòu)數(shù)據(jù)庫(kù)。
基于SQL/MED標(biāo)準(zhǔn)設(shè)計(jì)實(shí)現(xiàn)從Postgres-XL訪問(wèn)Redis數(shù)據(jù)庫(kù)的中間件,將Redis中的數(shù)據(jù)映射到Postgres-XL中[5-6]。傳統(tǒng)的讀寫(xiě)分離方案要在數(shù)據(jù)訪問(wèn)端進(jìn)行數(shù)據(jù)緩存控制,需要控制多個(gè)數(shù)據(jù)源,復(fù)雜度很高。通過(guò)基于SQL/MED中間件把Redis作為Postgres-XL偽組件進(jìn)而統(tǒng)一數(shù)據(jù)源,同時(shí)提高了其處理速度。讀寫(xiě)架構(gòu)如圖2所示。
數(shù)據(jù)庫(kù)訪問(wèn)服務(wù)發(fā)送數(shù)據(jù)請(qǐng)求,如果是寫(xiě)操作則直接操作Postgres-XL同時(shí)更新Redis緩存數(shù)據(jù)。對(duì)于讀操作,則由Postgres-XL直接讀取Redis返回?cái)?shù)據(jù)。根據(jù)Postgres-XL的規(guī)則特性,利用中間件對(duì)Redis進(jìn)行更新。
目前使用SSD對(duì)Postgres-XL優(yōu)化的策略分為三種。第一種是把Postgres-XL所有節(jié)點(diǎn)全部安裝在SSD上,即把傳統(tǒng)機(jī)械磁盤(pán)全部換成SSD。這種方式簡(jiǎn)單,但是SSD的擦寫(xiě)次數(shù)有限,分布式集群機(jī)器眾多,因此成本非常高。第二種是將非關(guān)鍵數(shù)據(jù)放到SSD上,譬如日志、索引等。第三種是將SSD作為Postgres-XL的二級(jí)緩存來(lái)減緩訪問(wèn)機(jī)械硬盤(pán)的頻率[7-8]。下面對(duì)第二、三種進(jìn)行詳細(xì)的論述。
圖2 SQL/MED架構(gòu)
2.3.1 非關(guān)鍵性數(shù)據(jù)存儲(chǔ)
在Postgres-XL中,將數(shù)據(jù)操作的日志、索引、臨時(shí)表放到SSD中以提高數(shù)據(jù)庫(kù)的整體執(zhí)行效率,而具體數(shù)據(jù)存儲(chǔ)到機(jī)械硬盤(pán)上。臨時(shí)表和索引的特點(diǎn)是順序?qū)?、隨機(jī)讀,而且這些數(shù)據(jù)屬于非關(guān)鍵性且可重新建立。因此,SSD的損壞不會(huì)影響數(shù)據(jù)庫(kù)的一致性。
此處利用Postgres-XL數(shù)據(jù)表空間特性將索引與數(shù)據(jù)庫(kù)表分開(kāi)存儲(chǔ),同時(shí)把臨時(shí)表存放在SSD上。在Postgres-XL中,數(shù)據(jù)表空間可以為表指定特定存儲(chǔ)目錄。創(chuàng)建表和索引可以指定表空間,這樣表、索引就可以存儲(chǔ)到特定的目錄中。在Postgres-XL中,創(chuàng)建數(shù)據(jù)表空間語(yǔ)法如下:
Create tablespace TABLESPACE_NAME[OWNER user_name]LOCATION ‘directory’;
其中directory指定是SSD掛載的路徑。創(chuàng)建好表空間就可以將索引存放在掛載SSD的目錄中,表存放在機(jī)械硬盤(pán)中。此時(shí)創(chuàng)建測(cè)試表ssd_test,將創(chuàng)建在此表上的索引存到指定表空間,命令如下:
Create index tablespace_index on ssd_test(id)
Tablespace space_test
2.3.2 緩存優(yōu)化
Postgres-XL外存管理是由SMGR提供對(duì)外存操作的統(tǒng)一接口,結(jié)構(gòu)如圖3所示。SMGR負(fù)責(zé)統(tǒng)管各種介質(zhì)管理器,根據(jù)上層的請(qǐng)求選擇一個(gè)具體的介質(zhì)管理器進(jìn)行操作[9-11]。
圖3 外存管理系統(tǒng)結(jié)構(gòu)
將SSD作為二級(jí)緩存的基本思想是在數(shù)據(jù)節(jié)點(diǎn)共享緩存滿時(shí),共享緩存發(fā)生了頁(yè)置換。此時(shí)并不是將置換出的緩存塊刷新到機(jī)械硬盤(pán),而是將數(shù)據(jù)轉(zhuǎn)移到SSD中以達(dá)到緩存的目的。當(dāng)下次請(qǐng)求當(dāng)前數(shù)據(jù)塊時(shí),在SSD緩存中將數(shù)據(jù)返回而非磁盤(pán)。處理的基本流程如圖4所示。
圖4 擁有二級(jí)緩存的讀寫(xiě)流程
因?yàn)槌杀镜膯?wèn)題,混合存儲(chǔ)系統(tǒng)中的SSD的容量要小于機(jī)械硬盤(pán),大約為整個(gè)儲(chǔ)存空間的5%~10%,這其中還包括SSD垃圾回收的空間[12-15]。
此處對(duì)緩存替換策略實(shí)現(xiàn)在原LRU算法中加入了midpoint位置。新讀取的緩沖塊,雖然是最新訪問(wèn)的頁(yè),但并不直接放到LRU列表首部,而是放入到LRU列表的midpoint位置。將midpoint位置之后的列表稱(chēng)為old列表,之前的列表稱(chēng)為new列表。這樣可以避免某些SQL操作將緩沖池中的塊全部刷新,譬如數(shù)據(jù)表掃描操作。對(duì)于old表中的數(shù)據(jù),如果是熱點(diǎn)數(shù)據(jù)很快會(huì)再次被訪問(wèn)到,然后進(jìn)入到new列表。
利用Postgres-XL自帶的pgbench工具來(lái)完成實(shí)驗(yàn)數(shù)據(jù)的模擬,然后完成數(shù)據(jù)庫(kù)并發(fā)訪問(wèn)的模擬,檢測(cè)上述三種優(yōu)化策略下的數(shù)據(jù)庫(kù)吞吐量。在實(shí)驗(yàn)環(huán)境中Postgres-XL在并發(fā)量達(dá)到60時(shí),數(shù)據(jù)庫(kù)性能達(dá)到了最高。因此,以下實(shí)驗(yàn)并發(fā)均為60,測(cè)試時(shí)間為12小時(shí)。實(shí)驗(yàn)結(jié)果如下:
(1)在表分區(qū)的實(shí)驗(yàn)中數(shù)據(jù)量為10 G,對(duì)于insert操作,數(shù)據(jù)表分區(qū)前的插入性能強(qiáng)于數(shù)據(jù)表分區(qū)后。隨著并發(fā)量增大和數(shù)據(jù)量增大,插入性能相差無(wú)幾。究其原因,數(shù)據(jù)表分區(qū)時(shí)指定了數(shù)據(jù)的流向規(guī)則,耗費(fèi)了一定的時(shí)間。對(duì)于select和update操作,數(shù)據(jù)表分區(qū)后的性能是分區(qū)之前的2.8倍左右。
(2)在基于Redis作為二級(jí)緩存方案中,對(duì)單數(shù)據(jù)表進(jìn)行了測(cè)試,采取表緩存后的數(shù)據(jù)庫(kù)性能為未采取策略的6倍左右。
(3)在基于SSD緩存優(yōu)化方案中,采取SSD緩存為硬盤(pán)容量的10%。在上述測(cè)試中采用純SSD作為存儲(chǔ)介質(zhì)時(shí),Postgres-XL的性能是采用純機(jī)械盤(pán)的8倍左右。采取將非數(shù)據(jù)節(jié)點(diǎn)、相關(guān)表的索引放到SSD的策略時(shí),Postgres-XL的性能也在純機(jī)械盤(pán)的基礎(chǔ)上提升了2.6倍。將SSD作為二級(jí)緩存時(shí),Postgres-XL的性能提升了大約5.6倍。
針對(duì)目前大數(shù)量單機(jī)數(shù)據(jù)庫(kù)性能低下產(chǎn)生大量的磁盤(pán)IO等問(wèn)題,基于分布式數(shù)據(jù)庫(kù)Postgres-XL,提出了相應(yīng)的解決手段。通過(guò)分區(qū)表、Redis、SSD對(duì)Postgres-XL進(jìn)行優(yōu)化,有效地提升了數(shù)據(jù)庫(kù)的處理效率,對(duì)于分布式數(shù)據(jù)庫(kù)Postgres-XL的應(yīng)用以及數(shù)據(jù)管理的發(fā)展起到了很好的推動(dòng)作用。
[1] 齊 磊.大數(shù)據(jù)分析場(chǎng)景下分布式數(shù)據(jù)庫(kù)技術(shù)的應(yīng)用[J].移動(dòng)通信,2015(12):58-62.
[2] 肖 凌,劉繼紅,姚建初.分布式數(shù)據(jù)庫(kù)系統(tǒng)的研究與應(yīng)用[J].計(jì)算機(jī)工程,2001,27(1):33-35.
[3] 彭智勇,彭煜瑋.PostgreSQL數(shù)據(jù)庫(kù)內(nèi)核分析[M].北京:機(jī)械工業(yè)出版社,2012.
[4] 林河水,程 偉,孫玉芳.PostgreSQL存儲(chǔ)管理機(jī)制研究[J].計(jì)算機(jī)科學(xué),2004,31(12):76-80.
[5] 鄭小裕.SQL與NoSQL數(shù)據(jù)庫(kù)的統(tǒng)一查詢(xún)模型的研究與實(shí)現(xiàn)[D].長(zhǎng)沙:湖南大學(xué),2014.
[6] 白 鑫.基于Redis的信息存儲(chǔ)優(yōu)化技術(shù)研究與應(yīng)用[D].北京:北方工業(yè)大學(xué),2014.
[7] YANG Q,REN J.I-CASH:intelligently coupled array of SSD and HDD[C]//Proceedings of the 2011 IEEE 17th international symposium on high performance computer architecture.Washington,DC,USA:IEEE Computer Society,2011:278-289.
[8] 閆 林.基于SSD的HDD緩存系統(tǒng)研究[D].西安:西安電子科技大學(xué),2014.
[9] LEE R,ZHOU M.Extending PostgreSQL to support distributed/heterogeneous query processing[C]//Proceedings of the 12th international conference on database systems for advanced applications.Berlin:Springer-Verlag,2007:1086-1097.
[10] NOGUCHI Y,UMENO H.The design and implementation of multiple buffer cache in PostgreSQL[C]//International conference on control, automation and systems.[s.l.]:IEEE,2008:2654-2657.
[11] LIU S, UMENO H. Implementation and improvement of TPM for PostgreSQL in Linux[C]//International conference on control,automation and systems.[s.l.]:IEEE,2008:2658-2661.
[12] 宋 磊,王靜文.PostgreSQL數(shù)據(jù)庫(kù)性能優(yōu)化[J].電腦編程技巧與維護(hù),2009(16):63-66.
[13] 魯 笛,向 陽(yáng),劉增寶.PostgreSQL數(shù)據(jù)庫(kù)緩沖管理的分析與研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2011,21(12):41-44.
[14] 劉圣卓,姜進(jìn)磊,楊廣文.一種面向SSD-HDD混合存儲(chǔ)的熱區(qū)跟蹤替換算法[J].小型微型計(jì)算機(jī)系統(tǒng),2012,33(10):2255-2258.
[15] 盧朝霞,習(xí) 捷,王 劍.基于數(shù)據(jù)庫(kù)分區(qū)的海量數(shù)據(jù)存儲(chǔ)技術(shù)的研究[C]//2006中國(guó)控制與決策學(xué)術(shù)年會(huì).出版地不詳:出版者不詳,2006.