本發(fā)明提出一種基于openstack平臺(tái)的SSD緩存方法,涉及云計(jì)算、計(jì)算機(jī)
技術(shù)領(lǐng)域:
:。技術(shù)背景OpenStack已經(jīng)被越來越多的廠家和云計(jì)算服務(wù)提供商采納并應(yīng)用至生產(chǎn)環(huán)境中。Rackspace已經(jīng)采用OpenStack提供虛擬機(jī)和云存儲(chǔ)服務(wù),其中云存儲(chǔ)Swift已經(jīng)達(dá)到100PB。HP新推出的公有云服務(wù)也是基于OpenStack的。新浪已經(jīng)推出基于OpenStack的虛擬機(jī)和云存儲(chǔ)服務(wù)。GlusterFS是Openstack采用的集群的文件系統(tǒng),支持PB級(jí)的數(shù)據(jù)量。GlusterFS通過RDMA和TCP/IP方式將分布到不同服務(wù)器上的存儲(chǔ)空間匯集成一個(gè)大的網(wǎng)絡(luò)并行文件系統(tǒng)。該系統(tǒng)現(xiàn)在正式支持OpenStack的三種主要模式存儲(chǔ),包括:文件、塊和對(duì)象。GlusterFS用戶空間采用的堆棧式架構(gòu)。該架構(gòu)在GlusterFS的客戶端和服務(wù)端(均在用戶空間)可以在服務(wù)初始化的過程中插入鏈狀的自定義模塊。但它帶來的問題是網(wǎng)絡(luò)I/O和磁盤I/O的性能瓶頸。加入緩存能夠很好的解決此類問題,GlusterFS本身也包含I/O緩存模塊,但他提供的緩存是只讀的,而且緩存大小受限制?,F(xiàn)存的緩存架構(gòu)也很多,比如最近很火熱的memcached架構(gòu)以及其變種。Memcached是一個(gè)高性能的分布式內(nèi)存對(duì)象緩存系統(tǒng),用于動(dòng)態(tài)Web應(yīng)用以減輕數(shù)據(jù)庫(kù)負(fù)載。它通過在內(nèi)存中緩存數(shù)據(jù)和對(duì)象來減少讀取數(shù)據(jù)庫(kù)的次數(shù),從而提高動(dòng)態(tài)、數(shù)據(jù)庫(kù)驅(qū)動(dòng)網(wǎng)站的速度。為了提高性能,memcached中保存的數(shù)據(jù)都存儲(chǔ)在memcached內(nèi)置的內(nèi)存存儲(chǔ)空間中。由于數(shù)據(jù)僅存在于內(nèi)存中,因此重啟memcached、重啟操作系統(tǒng)會(huì)導(dǎo)致全部數(shù)據(jù)消失。另外,內(nèi)容容量達(dá)到指定值之后,就基于LRU(LeastRecentlyUsed)算法自動(dòng)刪除不使用的緩存,因此很多緩存替換算法都未能使用。該系統(tǒng)正在被廣泛應(yīng)用,但是它并不適合GlusterFS,應(yīng)用場(chǎng)景也有所不同,它無法根據(jù)我們的需求很好的調(diào)整參數(shù)。故本發(fā)明將提出一個(gè)適合GlusterFS,并且可讀可寫的SSD緩存方法。技術(shù)實(shí)現(xiàn)要素:發(fā)明目的:本發(fā)明的目的在于提供一種基于openstack平臺(tái)的SSD緩存方法,解決網(wǎng)絡(luò)I/O和磁盤I/O瓶頸。實(shí)現(xiàn)本發(fā)明目的技術(shù)方案:在GlusterFS上添加了SSD緩存模塊,SSD緩存模塊包括三種結(jié)構(gòu)體:page結(jié)構(gòu)體包括所有與緩存頁(yè)相關(guān)的屬性,inode結(jié)構(gòu)體用于存放與文件相關(guān)的屬性,table結(jié)構(gòu)體用于存放全局信息?;谶@三種結(jié)構(gòu)體,可以在服務(wù)初始化的過程中插入鏈狀的自定義模塊,實(shí)現(xiàn)SSD緩存方案。SSD緩存模塊中的page結(jié)構(gòu)體包括所有與緩存頁(yè)相關(guān)的屬性:包含緩存頁(yè)本身字段,緩存頁(yè)的替換算法和當(dāng)前頁(yè)的等待隊(duì)列。(1)頁(yè)自身相關(guān)字段:包含inode指針,ready字段,offset字段,size字段。通過inode指針可以訪問該頁(yè)所屬的inode。ready字段表示該頁(yè)的內(nèi)容是否準(zhǔn)備就緒以供讀寫。offset表示該頁(yè)的起始在inode中的偏移量。size字段表示該頁(yè)的實(shí)際大小。(2)緩存頁(yè)的替換算法:包括inode_lru與table_lru:前者通過list_head與inode形成雙向鏈表結(jié)構(gòu),以inode為head,可以遍歷與該inode相關(guān)聯(lián)的所有頁(yè);后者與table形成雙向鏈表結(jié)構(gòu),這個(gè)鏈表包含了所有的頁(yè),是全局的LRU鏈表,在緩存頁(yè)用滿需要替換時(shí),從鏈表尾取出page,并將其釋放。(3)當(dāng)前頁(yè)的等待隊(duì)列。等待隊(duì)列用來對(duì)讀寫請(qǐng)求進(jìn)行排隊(duì)。SSD緩存模塊中的inode結(jié)構(gòu)體用于存放與文件相關(guān)的屬性:包括與table結(jié)構(gòu)體相關(guān)的屬性,與page結(jié)構(gòu)體相關(guān)的屬性和自身屬性。(1)與table相關(guān)的屬性。inode_list是所有inode形成的雙向鏈表。table指向的是inode關(guān)聯(lián)的table。(2)與page相關(guān)的屬性。page_lru是inode下page組成的鏈表。dirty_list是inode下所有臟頁(yè)組成的鏈表。dirty_cnt表示臟頁(yè)的數(shù)量。(3)inode自身的屬性。inode指針指向原始的inode。size字段表示inode關(guān)聯(lián)的文件的大小,如果當(dāng)前寫入的數(shù)據(jù)塊超過了文件大小,則需要更新該字段,同時(shí)需要對(duì)后端存儲(chǔ)的該文件執(zhí)行truncate操作。SSD緩存模塊中的table結(jié)構(gòu)體用于存放全局信息:包含頁(yè)大小、緩存大小、緩存的使用情況、與替換算法相關(guān)的信息等。其中page_size表示頁(yè)大小,cache_size表示緩存文件的大小,即緩存容量,該值為page_size的整數(shù)倍,cache_used表示已使用的緩存大小,該值等于已分配的dc_page數(shù)量乘以page_size,list_headinodes表示所有inode組成的雙向鏈表,inode_count表示inode的數(shù)量,page_lru表示pageLRU的鏈表頭,訪問頁(yè)時(shí)將頁(yè)插入到鏈表頭之后,替換頁(yè)時(shí)替換鏈表尾的頁(yè),page_lru_cnt表示pageLRU鏈表中的page數(shù)量,dirty_list表示所有的臟頁(yè)鏈表,在回寫線程中進(jìn)行遍歷,dirty_cnt表示所有臟頁(yè)的數(shù)量本發(fā)明具有的有益效果:本發(fā)明在openstack本身采用的GlusterFS上添加了SSDCache模塊,比原有提供的可配置Cache多了以下好處:緩存策略可配置、頁(yè)大小可配置、緩存容量不受限制、讀寫均可緩存。附圖說明圖1是本發(fā)明的openstack架構(gòu)圖。圖2是本發(fā)明的GlusterFS架構(gòu)圖。圖3是本發(fā)明的具體實(shí)施方式的詳細(xì)流程圖。具體實(shí)施方式下面結(jié)合附圖對(duì)本發(fā)明的技術(shù)方案進(jìn)行詳細(xì)說明:圖1顯示了本發(fā)明在openstack平臺(tái)中添加SSDCache位置,它在計(jì)算結(jié)點(diǎn)端的分布式文件系統(tǒng)的客戶端。因?yàn)樵摼彺嬷苯哟嬖谟诳蛻舳耍艟彺婷新瘦^高,緩存的數(shù)據(jù)也無需經(jīng)常通過網(wǎng)絡(luò)讀取服務(wù)器硬盤上的數(shù)據(jù),故在該位置可以在該位置可以明顯改善網(wǎng)絡(luò)I/O和磁盤I/O。圖2顯示了本發(fā)明在GlusterFS分布式文件系統(tǒng)中的詳細(xì)位置。因?yàn)镚lusterFS用戶空間的堆棧式架構(gòu)指的是在GlusterFS的客戶端和服務(wù)端(均在用戶空間)通過配置可以在服務(wù)初始化的過程中插入鏈狀的自定義模塊,故本發(fā)明在VFS和Distribute之間加入SSDCache模塊,以起到緩存的目的。為了便于公眾理解本發(fā)明的技術(shù)方案,以讀請(qǐng)求為例(采用LRU替換策略)。圖3為該例子的詳細(xì)流程圖,具體步驟如下:步驟S101、讀頁(yè)請(qǐng)求。步驟S102、判斷緩存中是否有該頁(yè),即是否命中(table中是否有該頁(yè))。若沒有跳轉(zhuǎn)至步驟S103,否則跳轉(zhuǎn)至步驟S110。步驟S103、根據(jù)LRU替換算法,替換鏈表鏈尾的page。步驟S104、根據(jù)請(qǐng)求和page結(jié)構(gòu)體的結(jié)構(gòu),根據(jù)步驟101讀取的請(qǐng)求和page結(jié)構(gòu)體的結(jié)構(gòu),申請(qǐng)空間,創(chuàng)建新頁(yè),構(gòu)造page。步驟S105、添加當(dāng)前讀請(qǐng)求至pagewaitq中。步驟S106、通過異步的方式請(qǐng)求頁(yè)內(nèi)容。即暫時(shí)擱置當(dāng)前請(qǐng)求的響應(yīng),處理下一個(gè)請(qǐng)求,當(dāng)通過輪詢或其他方式得到回調(diào)通知后,開始運(yùn)行;步驟S107、通過異步的方式更新頁(yè)內(nèi)容,成功后,將該頁(yè)置于鏈表鏈頭。步驟S108、設(shè)置該page的ready為1。步驟S109、處理pagewaitq中的請(qǐng)求,跳轉(zhuǎn)至結(jié)束。步驟S110、添加當(dāng)前讀請(qǐng)求到pagewaitq中。步驟S111、檢查page是否ready,若是,則跳轉(zhuǎn)至步驟S112,否則結(jié)束。步驟S112、處理pagewaitq中的請(qǐng)求,將訪問的新頁(yè)放置于鏈頭。當(dāng)前第1頁(yè)1 2 3 當(dāng)前第1頁(yè)1 2 3