艾麗蓉,李 凱
(西北工業大學 計算機學院,陜西 西安 710129)
面對日益增長的海量數據,傳統的單機集中式數據庫的弊端日益顯現[1-2]。為了解決單機數據庫下數據存不下、難于擴展、查詢延遲大等問題,需要在橫向或縱向上升級數據庫配置。在縱向升級配置提高數據庫的性能主要是采用大型機、大型機與PGStorm的方式。其中PGStorm可將CPU的密集型工作負載轉移到GPU處理,從而利用GPU強大的并行執行能力完成處理任務。Postgres-XL是在橫向上對PostgreSQL進行了擴展。雖然,Postgres-XL相對PostgreSQL提升了數據庫處理性能,但是,針對Postgres-XL本身的優化也是十分必要的。
Postgres-XL是基于PostgreSQL數據庫實現的真正意義上的分布式數據庫。目前大多數數據庫的水平拆分的方案都有很多限制,譬如不能跨機器Join、對SQL有各種限制。Postgres-XL實現得更加徹底,用戶訪問集群數據庫就跟單機數據庫一樣。
Postgres-XL全稱為Postgres eXtensible Lattice,它使用了開源協議允許將開源代碼與閉源代碼混在一起使用。同時它還有自己很多獨特的特性,譬如真正完全支持集群級別的數據一致性(ACID)、支持OLAP應用、采用MPP(massively parallel processing,大規模并行處理系統)架構模式、讀寫可拓展、可用作分布式Key-Value存儲、支持分布式多版本控制(MVCC)等。
在性能方面,隨著數據節點數的增長,Postgres-XL擴展能力的增加呈線性增長趨勢。實際測試結果是,當有3個數據節點時可以達到PostgreSQL數據庫大約2倍的性能,5個節點為3倍,10個節點為6倍左右。
Postgres-XL是一個基于PostgreSQL數據庫的橫向擴展開源數據庫集群,擁有足夠的靈活性來處理不同的工作負載。
Postgres-XL支持MPP,允許數據節點間通信,交換復雜跨節點關聯查詢相關數據信息。Postgres-XL的主要節點有:全局事務管理器(global transaction manager,GTM)、協調器(coordinator)、數據節點(datanode)。GTM主要負責處理多版本并發控制任務,包括數據庫事務的ID以及數據快照,同時它還管理集群中全局性數據,譬如時間戳等。coordinator負責處理客戶端的網絡連接,分析查詢語句,生成語句的執行計劃,然后將計劃發送到目的數據節點執行。數據節點主要存放具體的物理數據。除了上述節點之外,Postgres-XL為了減輕GTM負載,還可以部署GTM Proxy節點,GTM Proxy代理coordinator和datanode對GTM進行訪問。
對Postgres-XL的優化主要體現為在有限的時間內提高系統吞吐量。數據庫系統吞吐量是指單位時間內處理的事務數。為了提高數據庫系統的吞吐量,一般需要提高緩存命中率、降低磁盤IO。
隨著數據庫中數據量的增加,數據庫表的查詢效率非常低下。為了解決上述問題,基于Postgres-XL分區表和表繼承特性實現了表的水平拆分以及垂直拆分。Postgres-XL數據庫表的水平拆分是按照某種規則將數據庫表進行劃分,然后將數據存儲到多個結構相同的表中。例如,對于重慶某區的執法系統案件表,可以按照案件處理的時間拆分,2015年和2016年的數據分別存放在結構相同的表中,這樣就可以根據不同的時間進行區分,提高訪問效率。數據庫表的垂直拆分很容易地解決了表跟表之間的IO競爭,但是沒有解決單個數據表數據量大的問題。而數據庫表的水平拆分,解決了大數據表數據量大的問題,但是沒有解決表之間的IO爭奪。因此大多方案是采取兩者結合的方式,如圖1所示。

圖1 組合拆分
在傳統數據庫中,對數據庫表進行水平或者垂直拆分的復雜度是非常高的,而且容易產生附屬問題,譬如事務、跨表Join操作等。目前Postgres-XL支持的分區有范圍分區和列表分區。范圍分區是表根據一個或者多個字段拆分成范圍,在不同范圍內存放沒有鍵值重復的數據;列表分區指在表中明確指出每個分區里應該出現哪些字段[3]。
SQL/MED(management of external data)是SQL語言中管理外部數據的一個擴展標準,這個標準定義在SQL:2003中,它通過定義一個外部數據包裝器和數據連接類型來管理外部數據[4]。Postgres-XL提供了對SQL/MED標準的支持,通過SQL/MED連接到各種異構數據庫。
基于SQL/MED標準設計實現從Postgres-XL訪問Redis數據庫的中間件,將Redis中的數據映射到Postgres-XL中[5-6]。傳統的讀寫分離方案要在數據訪問端進行數據緩存控制,需要控制多個數據源,復雜度很高。通過基于SQL/MED中間件把Redis作為Postgres-XL偽組件進而統一數據源,同時提高了其處理速度。讀寫架構如圖2所示。
數據庫訪問服務發送數據請求,如果是寫操作則直接操作Postgres-XL同時更新Redis緩存數據。對于讀操作,則由Postgres-XL直接讀取Redis返回數據。根據Postgres-XL的規則特性,利用中間件對Redis進行更新。
目前使用SSD對Postgres-XL優化的策略分為三種。第一種是把Postgres-XL所有節點全部安裝在SSD上,即把傳統機械磁盤全部換成SSD。這種方式簡單,但是SSD的擦寫次數有限,分布式集群機器眾多,因此成本非常高。第二種是將非關鍵數據放到SSD上,譬如日志、索引等。第三種是將SSD作為Postgres-XL的二級緩存來減緩訪問機械硬盤的頻率[7-8]。下面對第二、三種進行詳細的論述。

圖2 SQL/MED架構
2.3.1 非關鍵性數據存儲
在Postgres-XL中,將數據操作的日志、索引、臨時表放到SSD中以提高數據庫的整體執行效率,而具體數據存儲到機械硬盤上。臨時表和索引的特點是順序寫、隨機讀,而且這些數據屬于非關鍵性且可重新建立。因此,SSD的損壞不會影響數據庫的一致性。
此處利用Postgres-XL數據表空間特性將索引與數據庫表分開存儲,同時把臨時表存放在SSD上。在Postgres-XL中,數據表空間可以為表指定特定存儲目錄。創建表和索引可以指定表空間,這樣表、索引就可以存儲到特定的目錄中。在Postgres-XL中,創建數據表空間語法如下:
Create tablespace TABLESPACE_NAME[OWNER user_name]LOCATION ‘directory’;
其中directory指定是SSD掛載的路徑。創建好表空間就可以將索引存放在掛載SSD的目錄中,表存放在機械硬盤中。此時創建測試表ssd_test,將創建在此表上的索引存到指定表空間,命令如下:
Create index tablespace_index on ssd_test(id)
Tablespace space_test
2.3.2 緩存優化
Postgres-XL外存管理是由SMGR提供對外存操作的統一接口,結構如圖3所示。SMGR負責統管各種介質管理器,根據上層的請求選擇一個具體的介質管理器進行操作[9-11]。

圖3 外存管理系統結構
將SSD作為二級緩存的基本思想是在數據節點共享緩存滿時,共享緩存發生了頁置換。此時并不是將置換出的緩存塊刷新到機械硬盤,而是將數據轉移到SSD中以達到緩存的目的。當下次請求當前數據塊時,在SSD緩存中將數據返回而非磁盤。處理的基本流程如圖4所示。

圖4 擁有二級緩存的讀寫流程
因為成本的問題,混合存儲系統中的SSD的容量要小于機械硬盤,大約為整個儲存空間的5%~10%,這其中還包括SSD垃圾回收的空間[12-15]。
此處對緩存替換策略實現在原LRU算法中加入了midpoint位置。新讀取的緩沖塊,雖然是最新訪問的頁,但并不直接放到LRU列表首部,而是放入到LRU列表的midpoint位置。將midpoint位置之后的列表稱為old列表,之前的列表稱為new列表。這樣可以避免某些SQL操作將緩沖池中的塊全部刷新,譬如數據表掃描操作。對于old表中的數據,如果是熱點數據很快會再次被訪問到,然后進入到new列表。
利用Postgres-XL自帶的pgbench工具來完成實驗數據的模擬,然后完成數據庫并發訪問的模擬,檢測上述三種優化策略下的數據庫吞吐量。在實驗環境中Postgres-XL在并發量達到60時,數據庫性能達到了最高。因此,以下實驗并發均為60,測試時間為12小時。實驗結果如下:
(1)在表分區的實驗中數據量為10 G,對于insert操作,數據表分區前的插入性能強于數據表分區后。隨著并發量增大和數據量增大,插入性能相差無幾。究其原因,數據表分區時指定了數據的流向規則,耗費了一定的時間。對于select和update操作,數據表分區后的性能是分區之前的2.8倍左右。
(2)在基于Redis作為二級緩存方案中,對單數據表進行了測試,采取表緩存后的數據庫性能為未采取策略的6倍左右。
(3)在基于SSD緩存優化方案中,采取SSD緩存為硬盤容量的10%。在上述測試中采用純SSD作為存儲介質時,Postgres-XL的性能是采用純機械盤的8倍左右。采取將非數據節點、相關表的索引放到SSD的策略時,Postgres-XL的性能也在純機械盤的基礎上提升了2.6倍。將SSD作為二級緩存時,Postgres-XL的性能提升了大約5.6倍。
針對目前大數量單機數據庫性能低下產生大量的磁盤IO等問題,基于分布式數據庫Postgres-XL,提出了相應的解決手段。通過分區表、Redis、SSD對Postgres-XL進行優化,有效地提升了數據庫的處理效率,對于分布式數據庫Postgres-XL的應用以及數據管理的發展起到了很好的推動作用。
[1] 齊 磊.大數據分析場景下分布式數據庫技術的應用[J].移動通信,2015(12):58-62.
[2] 肖 凌,劉繼紅,姚建初.分布式數據庫系統的研究與應用[J].計算機工程,2001,27(1):33-35.
[3] 彭智勇,彭煜瑋.PostgreSQL數據庫內核分析[M].北京:機械工業出版社,2012.
[4] 林河水,程 偉,孫玉芳.PostgreSQL存儲管理機制研究[J].計算機科學,2004,31(12):76-80.
[5] 鄭小裕.SQL與NoSQL數據庫的統一查詢模型的研究與實現[D].長沙:湖南大學,2014.
[6] 白 鑫.基于Redis的信息存儲優化技術研究與應用[D].北京:北方工業大學,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緩存系統研究[D].西安:西安電子科技大學,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數據庫性能優化[J].電腦編程技巧與維護,2009(16):63-66.
[13] 魯 笛,向 陽,劉增寶.PostgreSQL數據庫緩沖管理的分析與研究[J].計算機技術與發展,2011,21(12):41-44.
[14] 劉圣卓,姜進磊,楊廣文.一種面向SSD-HDD混合存儲的熱區跟蹤替換算法[J].小型微型計算機系統,2012,33(10):2255-2258.
[15] 盧朝霞,習 捷,王 劍.基于數據庫分區的海量數據存儲技術的研究[C]//2006中國控制與決策學術年會.出版地不詳:出版者不詳,2006.