一種PostgreSQL塊存儲設備讀寫模塊的制作方法
【技術領域】
[0001 ]本發明設及一種化stgreS化數據庫存儲設備,尤其設及一種化stgreS化塊存儲設 備讀寫模塊。
【背景技術】
[0002] 隨著互聯網、移動互聯網和物聯網的發展,我們迎來了一個海量數據的時代,而數 據庫內保存的數據也越來越多,而我們需要的查詢時間反而要越來越小。現在的眾多應用 場景都需要后臺的存儲具有高并發,高容量,高響應。高速的入庫需求迫使我們不得不放棄 實時索引,而大數據量的數據掃描又被存儲端的I/O所限制。現在的化stgreS化數據庫系統 中,高并發的多數據庫掃描需要碰到基本都是隨機讀,而與此同時,普通磁盤的吞吐量已經 不能滿足需求。
[0003] 為了適應大數據量的應用場景,官方推出的PostgreS化-XC、PostgreS化-化運兩 個MPP數據庫還沒有成熟,而且還存在很多安全性問題。而傳統的提速方案僅僅是利用集中 式存儲的高1/〇(輸入/輸出)來在一定程度上提高整個系統的。但運種提升依舊存在很大的 資源浪費。
[0004] 如圖1所示,原有的化stgreS化數據庫系統底層存儲架構在文件系統上,從表到磁 盤需要經過:表空間,文件系統,邏輯卷、磁盤運四層最終才會寫入到物理磁盤內。
[0005] 運樣的架構首先會使得磁盤的I/O形成衰減。最終的磁盤I/O利用率只能達到80% 左右,甚至更低。其次,當數據庫表存在大量小表的情況下,勢必會增加文件系統的壓力。而 且對于數據庫操作而言,表的寫入讀出都較為隨機,極容易造成磁盤碎片,而大量的隨機讀 寫,也必將會使得整個數據的讀寫性能下降。對于小數據量的數據庫而言,現有的缺點也許 不明顯。但現在更多的使用場景是大數據量、高并發、高I/O。運些使用場景下,運些缺點將 會大大影響數據庫性能。此外在不同的操作系統遷移中也需要極復雜的數據庫遷移操作。
[0006] 普通磁盤的I/O速度較低,傳統的解決方法是使用集中式存儲(即磁盤陣列)。運種 方式只是簡單的提高磁盤的I/O速度,而且成本極高,具有一定的局限性。
[0007] 如圖2和圖3所示,PostgreSQL數據庫系統現有的后臺存儲架構:
[000引數據庫的數據操作每條記錄都有幾個主要標識。表1D、記錄所在black id、文件類 型、行記錄對應的標識。現有的化stgreS化數據庫系統讀寫表操作需要:
[0009] a根據表1D查找到運個表的表空間,然后定位到文件系統中表空間的位置。
[0010] b根據文件類型要獲取到指定的表文件。一般一個表會包含巧巾類型的文件。
[001。 fsm文件:其中存放了數據表文件中空閑空間的信息。
[0012] vm文件:標記了數據表文件中哪些文件塊沒有失效的元組。
[0013] 表數據文件:此文件主要用于存儲數據,但是此文件大小會有一定的限制,普通情 況下會保存2G,超過2G的文件會分文件保存。
[0014] C根據記錄號W及fsm文件,定位page。
[0015] 而一般的操作系統對于打開的文件數會有限制。PostgreS化數據庫系統內部使用 自己的虛擬文件管理來管理文件句柄,來保證能夠同時打開很多的表。對于數據庫而言可 能同時存在很多的表,而化stgreS化數據庫系統采用1個表多個文件方式來保存數據。當打 開一個文件的時候,會首先到文件句柄管理中找一下是不是存在已經打開的文件句柄。根 據文件句柄設定一下off set。
[0016] d從文件中取到對應的page,并取到對應的行。
[0017]根據記錄的blockid定位到文件,讀取指定大小的塊。而運些記錄就保存在page 內。
[0018] 現有技術中,采用集中式存儲作為數據庫后端。
[0019] 1、采用集中式存儲(磁盤陣列等)做為存儲后端。把集中式存儲提供的磁盤掛載到 化stgreS化數據庫系統所安裝的機器。并根據不同的操作系統格式化成不同的文件系統。
[0020] 2、把數據庫中的數據指定到集中式存儲提供的磁盤。
[0021] 此種方法僅僅硬性提高后端的I/O吞吐量,并沒有從原理上提高底層I/O的利用 率。而且就安全性而言,運種方法并沒有對數據做任何層面的保護,依舊讓數據暴露在外。 只能夠在一定程度上實現數據庫系統的提速。但是對于高安全高性能的需求來說,我們不 能僅僅依靠運種純硬件的加速而忽略軟件本身的優化。
[0022] W上是原有的化stgreSQL數據庫系統存儲架構。W上結構存在W下幾個缺點:
[0023] 第一、數據庫數據文件直接暴露在操作系統中,數據存在安全隱患,數據安全也就 得不到保證,對于一些對安全級別要求較高的使用環境而言是個極大的安全漏桐。
[0024] 第二、對磁盤的使用必經過文件系統層。
[0025] 就linux系統下較為流行的文件系統而言,采用64位空間來記錄塊數量和i-節點 數量,對于數據庫系統,可能存在及大量的表,每個表都將可能至少存在3個W上的文件,導 致一個文件夾內存在極多的文件。
[0026] 文件系統進行塊分配時,基本上都是按照4K一個塊的模式進行分配。同時我們數 據庫申請的時候都是W8K為單位進行申請。也就是說系統分配的塊總是比我們的表的塊要 小。運樣導致的直接問題就是數據庫的業務塊雜亂的分配到磁盤上。導致的直接問題就是 磁盤尋道時間長,讀寫速度減慢。
[0027] 假如我們的數據庫中存在一個極大的表,文件系統在處理的時候效率極其低。例 如,在ext3文件系統中100MB的文件就需要近25600個數據塊。而對于PostgreS化數據庫系 統而言,達到或超過GB級別的表處理會很常見,而且是隨機的讀寫。
[0028] 第Ξ、文件系統的擴容也非常麻煩。除了已知的極個別商業文件系統外,其他的文 件系統擴容多會要求關閉數據庫。
[0029] 第四、數據庫在不同的系統之間進行遷移及其復雜,對操作人員專業知識要求較 局。
【發明內容】
[0030] 本發明要解決的技術問題是提供一種PostgreS化塊存儲設備讀寫模塊,通過該 PostgreS化塊存儲設備讀寫模塊的讀寫,數據庫數據文件不會直接暴露在操作系統中,消 除了數據存在的安全隱患,數據安全也就得到了保證,對于一些對安全級別要求較高的使 用環境而言消除了一個極大的安全漏桐。
[0031] 為了解決上述技術問題,本發明的PostgreSQL塊存儲設備讀寫模塊是對 化stgreS化塊存儲設備中的化stgreS化塊進行管理的化stgreS化塊存儲設備讀寫模塊,所 述化stgreS化塊存儲設備讀寫模塊架構在化stgreS化數據庫系統上。
[0032] 所述化stgreS化塊存儲設備讀寫模塊通過化stgreS化塊-數據表之間的映射關系 表和空閑化stgreS化塊表對化stgreS化塊存儲設備中的化stgreS化塊進行管理。
[00削所述PostgreSQL塊-數據表之間的映射關系表包括字段Re If ilenode、 Rel1:ablespace、Forknum、Blockid、Blockno,所述空閑化 stgreSQL 塊表包括字段 Blockid、 Isfree^Devo
[0034] 所述化stgreS化塊存儲設備讀寫模塊,具有W下子模塊:
[0035] 分配化stgreS化塊的子模塊,
[0036] 回收化stgreS化塊的子模塊,
[0037] 定位化stgreS化塊的子模塊,
[0038] 讀出化stgreS化塊中數據的子模塊,
[0039] 寫入化stgreS化塊中數據的子模塊。
[0040] 所述分配PostgreS化塊的子模塊采用就近分配策略或冷熱數據分層分配策略給 化stgreS化數據表分配化stgreS化塊,所述就近分配策略是化stgreS化塊就近分配策略或 空閑化stgreS化塊表記錄就近分配策略,所述冷熱數據表分層分配策略是常用數據表分配 策略或近期使用數據表分配策略,所述化stgreS化塊就近分配策略是在數據表上次分配的 化stgreS