greS化塊中數據的子模塊,
[0089] 寫入化S t gr e S化塊中數據的子模塊。
[0090] 所述分配PostgreS化塊的子模塊采用就近分配策略或冷熱數據分層分配策略給 化stgreS化數據表分配化stgreS化塊,所述就近分配策略是化stgreS化塊就近分配策略或 空閑化stgreS化塊表記錄就近分配策略,所述冷熱數據表分層分配策略是常用數據表分配 策略或近期使用數據表分配策略,所述化stgreS化塊就近分配策略是在數據表上次分配的 化stgreS化塊前后就近尋找空閑化stgreS化塊分配給數據表,所述空閑化stgreS化塊表記 錄就近分配策略是從空閑化stgreS化塊表記錄中尋找第一個空閑化stgreS化塊,所述常用 數據表分配策略是經常使用的數據表優先分配到較快的化stgreS化塊設備上,所述近期使 用數據表分配策略是將近期使用數據表優先分配到較快的化stgreS化塊設備上,所述冷熱 數據表分層分配策略用于具有兩塊W上不同讀寫速度的化stgreS化塊設備上;
[0091] 所述回收PostgreS化塊的子模塊用于回收數據表不再使用的PostgreS化塊,從 化stgreS化塊-數據表之間的映射關系表中刪除對應的PostgreS化塊記錄,到空閑表中將 相應化stgreS化塊的記錄設置為空閑;
[0092] 所述定位化stgreS化塊的子模塊用于將數據表中的頁定位到化stgreS化塊設備 指定的位置上;
[0093] 所述讀出PostgreS化塊中數據的子模塊用于讀取指定塊內指定位置指定大小的 數據;
[0094] 所述寫入PostgreS化塊中數據的子模塊用于寫入指定塊內指定位置指定大小的 數據。
[00M]所述寫入化stgreS化塊中數據的子模塊W加密方式將數據寫入化stgreS化塊中; 相應地,
[0096] 所述讀出PostgreS化塊中數據的子模塊W解密的方式將數據讀出返回給數據庫 業務層。
[0097] 所述加密的方式是采用將用戶密碼與數據異或計算后進行存儲加密的方式;
[0098] 所述解密的方式是采用將用戶密碼與從PostgreS化塊中讀出的數據異或計算后 反回給數據庫業務層解密的方式。
[0099] 所述空閑化stgreS化塊表中的Dev字段對不同的存儲設備進行標識實現擴容。
[0100] 將所述化stgreS化塊-數據表之間的映射關系表和所述空閑化stgreS化塊表從原 庫復制到新庫,將化stgreS化塊存儲設備從原庫所在的計算機遷移到新庫所在的計算機。
[0101] 實施例
[0102] 如圖4所示,本發明基于化stgreS化塊存儲設備的數據讀寫方法,利用如前面所述 的化stgreS化塊存儲設備讀寫模塊對如前面所述的化stgreS化塊進行讀寫。
[0103] A、在數據庫后臺驅動層中,PostgreSQL塊存儲設備讀寫模塊的驅動完成對塊文件 的操作,其主要任務為:
[0104] a、通過文件句柄管理器管理上層業務對底層設備的讀寫接口,實現提供高并發的 讀寫接口;
[0105] b、實現對化stgreS化塊存儲設備的覆蓋寫,直接定位到化stgreS化塊存儲設備的 指定位置,并寫入指定長度的數據;
[0106] B、根據所述化stgreS化塊-數據表之間的映射關系表oid、表空間定位到指定塊設 備的指定位置,通過表的pageid定位到塊設備的某個偏移。
[0107] 化stgreS化數據庫系統中的每一個表分配有至少一個所述化stgreS化塊,而且可 動態地增量分配化stgreS化塊;
[0108] 每個化stgreS化塊可寫入512個8邸的化stgreS化塊數據庫系統的頁,一個塊設備 可W包含無數多個表,一個表將可W包含無限多個化stgreS化塊,運些塊文件信息被保存 在化stgreS化塊-數據表之間的映射關系表內;
[0109] 通過1個oid能獲取到一個數據表的所有化stgreS化塊的信息,而運些化stgreS化 塊信息會順序地組成整個的所述化stgreS化塊-數據表的文件,運個表的pageid郵k就是運 個表內部的偏移,同時也就能夠確定是運個塊文件的第幾個塊,至此獲得我們想要獲取的 頁在塊設備內位置。
[0110] 如圖4所示,詳細設計如下:
[0111] 創建化stgreS化塊-數據表之間的映射關系表和空閑化stgreS化塊表。
[0112]表一:PostgreSQL塊-數據表之間映射關系表 「01131
[0116] ~~A首先我們把化stgreS化塊存儲設備在邏輯上W4MB為單位分割為N個PostgreSQL 塊。
[0117] 一般情況下我們把PostgreS化塊存儲設備按照4MB為單位進行分割。我們只需要 通過PostgreS化塊存儲設備的總容量除W-個化stgreS化塊的容量計算出化stgreS化塊 存儲設備的總塊數即可,不需要對化stgreS化塊存儲設備進行掃描,運個分配時間極短。比 如2T的PostgreS化塊存儲設備只需要分成524288個PostgreS化塊,我們只需要在空閑 化stgreSQL塊表中新增524288條記錄,blockid從0-524287遞增即可。同時標注isfree為 true〇
[0118] B、數據表的存儲空間W4MB為單位進行分配。
[0119] 按照PostgreS化數據庫系統的流程而言,一個表實際占用空間是按需分配的。我 們修改PostgreSQL數據庫系統后臺驅動文件Storage/smgr/smgr · C類型typedef struct f_smgr中需要的方法進行重寫。
[0120] 包括{
[0121] mdinit,
[0122] mdclose,
[0123] mdcreate,
[0124] mdexists,
[0125] mdunlink,
[0126] mdextend,
[0127] mdprefetch,
[012 引 mclread,
[0129] mdwrite,
[0130] mdnblocks,
[0131] mdtruncate,
[0132] mdimmedsync,
[0133] mdpreckpt,
[0134] mdsync,
[01 巧]mdpostckpt
[0136] }
[0137] 運些方法的具體實現在md.c文件中。(此文件中的其他方法也要進行修改)
[0138] 把各個方法中設及到的Μ壯dVec進行修改。
[0139] 修改的主要思想為:
[0140] 原本SMgrRelation reln,ForkNumber forknum兩個參數定位到文件系統的表文 件修改為定位到塊設備的off set。我們能根據rein獲取到relfilenode,rel tablespace, forknum我們從PostgreS化塊-數據表之間的映射關系表中能夠定位到我們的表所占用的 數據。保證(pageno+l)*4*1024KB〉reln.pageid*8KB〉pageno*4*1024KB。
[0141] 假如PostgreS化塊-數據表之間的映射關系表中不存在,說明我們需要新增一個 化stgreS化塊給數據表。運時我們從空閑化stgreS化塊表中直接捜到一個沒被使用的塊設 備就可W直接使用。直接避免文件系統在處理大文件時候的繁雜分配過程。
[0142] 假如化stgreS化塊-數據表之間的映射關系表中存在,我們就能把化stgreS化塊 存儲設備直接定位到pageno*4* 1024邸+ (reln.pageid%512) *8邸。讀出運個8K數據即可。
[0143] PostgreSQL數據庫業務到磁盤的中間過程及其簡單。磁盤利用率極高。
[0144] CJostgreS化塊存儲設備的擴容。
[0145] 當我們的化stgreS化塊存儲設備容量不夠的時候,我們