亓薇薇
(山東省萊蕪職業(yè)技術(shù)學(xué)院<信息工程系>,山東 萊蕪271100)
最近幾十年,我國(guó)IT及互聯(lián)網(wǎng)產(chǎn)業(yè)發(fā)展迅速,信息量也以幾何級(jí)倍數(shù)增長(zhǎng),這對(duì)存儲(chǔ)系統(tǒng)的要求也不斷提高,存儲(chǔ)系統(tǒng)的性能、容量、與成本之間的矛盾也日益突出。
機(jī)械硬盤存儲(chǔ)容量大且技術(shù)成熟,但是它的IO性能相對(duì)比較低下,無(wú)法滿足那種對(duì)IO要求極高的業(yè)務(wù)系統(tǒng)。SSD固態(tài)硬盤[1]或者PCI-E閃存[2]這類IO設(shè)備能夠提供極高的IO性能,但價(jià)格同樣也非常高。如何利用這兩種存儲(chǔ)設(shè)備的優(yōu)點(diǎn)并避開各自的缺點(diǎn),發(fā)揮出存儲(chǔ)設(shè)備的最大的優(yōu)勢(shì)是值得探討的問(wèn)題。
分層存儲(chǔ)[3]作為一種能夠有效解決上述矛盾的技術(shù),在近年來(lái)成為熱點(diǎn)。所謂分層存儲(chǔ),就是所有數(shù)據(jù)最終存儲(chǔ)在機(jī)械硬盤中,但在進(jìn)行IO訪問(wèn)時(shí),通過(guò)分層存儲(chǔ)管理軟件自動(dòng)實(shí)現(xiàn)熱點(diǎn)數(shù)據(jù)自動(dòng)存儲(chǔ)在高性能的IO設(shè)備中,這樣就能夠充分利用SSD或者PCIE閃存這類容量小但I(xiàn)O性能極高的IO設(shè)備。分層存儲(chǔ)管理軟件目前有開源和閉源兩種:開源的存儲(chǔ)管理軟件,例如:Facebook公司的FlashCache,Intel公司的Open-CAS;閉源的存儲(chǔ)管理軟件,例如:Oracle公司的Exadata FlashCache。
以下內(nèi)容主要涉及Oracle的Exadata FlashCache的緩存算法改進(jìn),Exadata是Oracle公司的最先進(jìn)的數(shù)據(jù)庫(kù)一體機(jī),底層的數(shù)據(jù)存儲(chǔ)使用機(jī)械硬盤,上層用PCI-E閃存卡做成數(shù)據(jù)緩存[4],也即FlashCache。
Exadata FlashCache有write-through和writeback兩種模式[5]可以選擇,write-through模式,意味著計(jì)算節(jié)點(diǎn)數(shù)據(jù)庫(kù)BufferCache中的臟數(shù)據(jù)塊寫回?cái)?shù)據(jù)文件時(shí),是繞開FlashCache,直接寫回機(jī)械硬盤。而對(duì)于write-back模式,數(shù)據(jù)庫(kù)BufferCache中的臟數(shù)據(jù)塊寫回?cái)?shù)據(jù)文件時(shí),是先寫FlashCache,后期再慢慢刷回機(jī)械硬盤。
在講解Exadata FlashCache的緩存算法之前,先介紹Exadata FlashCache的IO請(qǐng)求模式,也即哪些IO請(qǐng)求會(huì)經(jīng)過(guò)PCI-E閃存設(shè)備。
當(dāng)需要被訪問(wèn)的數(shù)據(jù)塊沒(méi)有被緩存在FlashCache中的情況下,IO讀請(qǐng)求的整個(gè)處理流程如圖1所示。
圖1 write-through模式FlashCache數(shù)據(jù)未緩存時(shí)IO請(qǐng)求
數(shù)據(jù)庫(kù)服務(wù)器向存儲(chǔ)管理軟件發(fā)起IO讀請(qǐng)求,Exadata存儲(chǔ)管理軟件檢測(cè)到存儲(chǔ)節(jié)點(diǎn)的FlashCache中沒(méi)有所需要的數(shù)據(jù)塊,所以只能直接從磁盤的數(shù)據(jù)文件中訪問(wèn)這些IO數(shù)據(jù)塊。從磁盤的數(shù)據(jù)文件中讀取出的數(shù)據(jù)塊被返回給數(shù)據(jù)庫(kù)服務(wù)器。存儲(chǔ)管理軟件會(huì)決斷這些被訪問(wèn)的數(shù)據(jù)塊是否滿足緩存到FlashCache的條件,如果滿足(數(shù)據(jù)緩存算法),則這些數(shù)據(jù)塊會(huì)被寫入FlashCache中。
當(dāng)需要被訪問(wèn)的數(shù)據(jù)塊已經(jīng)被緩存在FlashCache中的情況下,IO讀請(qǐng)求的整個(gè)處理流程如圖2所示。
數(shù)據(jù)庫(kù)服務(wù)器向存儲(chǔ)管理軟件發(fā)起IO請(qǐng)求。存儲(chǔ)管理軟件檢測(cè)到存儲(chǔ)節(jié)點(diǎn)的FlashCache中有所需要的數(shù)據(jù)塊,所以可以直接從FlashCache中訪問(wèn)這些IO數(shù)據(jù)塊。將從FlashCache中讀取出的數(shù)據(jù)塊被返回給數(shù)據(jù)庫(kù)服務(wù)器。
數(shù)據(jù)庫(kù)服務(wù)器向存儲(chǔ)節(jié)點(diǎn)發(fā)起IO寫請(qǐng)求,整個(gè)處理流程如圖3所示。
數(shù)據(jù)庫(kù)服務(wù)器向存儲(chǔ)管理軟件發(fā)起IO寫請(qǐng)求。存儲(chǔ)管理軟件將這些IO寫請(qǐng)求直接寫回磁盤上的數(shù)據(jù)文件中。數(shù)據(jù)庫(kù)服務(wù)器BufferCache中的臟數(shù)據(jù)塊完全寫入存儲(chǔ)節(jié)點(diǎn)磁盤的數(shù)據(jù)文件后,給數(shù)據(jù)庫(kù)服務(wù)器發(fā)出一個(gè)IO寫完成的響應(yīng),通過(guò)數(shù)據(jù)庫(kù)服務(wù)器已經(jīng)完成IO寫入。存儲(chǔ)管理軟件會(huì)決斷這些被寫回?cái)?shù)據(jù)文件的數(shù)據(jù)塊是否滿足緩存到FlashCache的條件,如果滿足,則這些數(shù)據(jù)塊會(huì)被緩存到FlashCache中。
圖2 write-through模式FlashCache數(shù)據(jù)已緩存時(shí)IO請(qǐng)求
圖3 write-through模式FlashCache寫數(shù)據(jù)時(shí)IO請(qǐng)求
如果FlashCache在write-back模式下,它的IO讀操作與write-through模式完全相同,但它的IO寫操作與write-through模式則完全不同。
下面介紹FlashCache配置為write-back模式時(shí),IO寫操作的請(qǐng)求順序如圖4所示。
數(shù)據(jù)庫(kù)服務(wù)器向存儲(chǔ)管理軟件發(fā)起IO寫請(qǐng)求。存儲(chǔ)管理軟件將這些IO寫請(qǐng)求直接寫入FlashCache中,而不是數(shù)據(jù)文件。當(dāng)數(shù)據(jù)庫(kù)服務(wù)器的IO寫請(qǐng)求完全寫入FlashCache后,給數(shù)據(jù)庫(kù)服務(wù)器一個(gè)IO寫結(jié)束的響應(yīng)。存儲(chǔ)管理軟件后期會(huì)將FlashCache中的臟數(shù)據(jù)塊慢慢地刷回?cái)?shù)據(jù)文件中。
圖4 write-back模式FlashCache寫數(shù)據(jù)時(shí)IO請(qǐng)求
Exadata Smart FlashCache IO請(qǐng)求模式中可以看出:不同緩存配置模式,不同的IO請(qǐng)求模式,所涉及的數(shù)據(jù)塊是否會(huì)進(jìn)行緩存都不盡相同。
訪問(wèn)的數(shù)據(jù)塊適不適合進(jìn)行緩存,是由數(shù)據(jù)庫(kù)服務(wù)器向存儲(chǔ)軟件發(fā)送的數(shù)據(jù)元信息決定的,這些數(shù)據(jù)元信息類似于:請(qǐng)求的IO的大小或IO類型、請(qǐng)求的IO所屬的數(shù)據(jù)段關(guān)于cell_flash_cache屬性的設(shè)置等。
FlashCache中數(shù)據(jù)塊的管理工作是由Exadata存儲(chǔ)管理軟件來(lái)完成的,F(xiàn)lashCache中數(shù)據(jù)塊的刷出和刷入機(jī)制使用的是最近最少使用(LRU)的算法進(jìn)行自動(dòng)管理。
由PCI-E閃存組成的FlashCache緩存畢竟容量有限,當(dāng)FlashCache用滿時(shí),Exadata將FlashCache中最近很少使用的數(shù)據(jù)塊刷出FlashCache。
FlashCache緩存淘汰算法具體如下:
(1)當(dāng)有新的數(shù)據(jù)對(duì)象需要緩存到FlashCache時(shí),先檢查存儲(chǔ)節(jié)點(diǎn)的FlashCache是否還有可用空間?
(2)如果存儲(chǔ)節(jié)點(diǎn)的FlashCache已經(jīng)完全使用,沒(méi)有發(fā)現(xiàn)可用空間時(shí),則檢查FlashCache中的哪個(gè)數(shù)據(jù)對(duì)象的hitcount最少?
(3)將FlashCache中hitcount最少的數(shù)據(jù)對(duì)象刷出,并釋放空間。
(4)將新的數(shù)據(jù)對(duì)象需要緩存到FlashCache。
Exadata的FlashCache使用LRU算法將數(shù)據(jù)塊淘汰出緩存,但這種緩存淘汰算法存在一些缺陷。通過(guò)下面這則案例解析,可以清楚看出當(dāng)前緩存淘汰算法的缺陷在哪。
案例概要:
一臺(tái)Exadata上運(yùn)行著A和B兩套Oracle數(shù)據(jù)庫(kù),運(yùn)行了一段時(shí)間后,A數(shù)據(jù)庫(kù)從該Exadata上遷移出去并且完全停止使用,但是A數(shù)據(jù)庫(kù)沒(méi)有刪除。某一天,發(fā)現(xiàn)運(yùn)行的B數(shù)據(jù)庫(kù)性能比較差,主要表現(xiàn)在單個(gè)IO讀經(jīng)常飆升到十幾毫秒左右,同時(shí)B數(shù)據(jù)庫(kù)的FlashCache的命中率比較低。
案例分析:
檢查FlashCache的使用情況。由于Exadata每個(gè)存儲(chǔ)節(jié)點(diǎn)都配置了5.8TB的PCI-E閃存卡,正常情況下,熱點(diǎn)數(shù)據(jù)都應(yīng)該緩存在這些基于PCI-E閃存卡的FlashCache中,如果SQL語(yǔ)句需要的數(shù)據(jù)塊未緩存到FlashCache中,則需要讀取物理的數(shù)據(jù)文件,如果大量訪問(wèn)物理的數(shù)據(jù)文件,則IO性能肯定會(huì)大幅下降。
下面,進(jìn)一步檢查存儲(chǔ)節(jié)點(diǎn)FlashCache的使用情況。
從以上輸出可以看出,A數(shù)據(jù)庫(kù)還占用了4個(gè)多TB的FlashCache,而B數(shù)據(jù)庫(kù)僅僅占用了1個(gè)多TB的FlashCache資源,這其實(shí)就是為什么B數(shù)據(jù)庫(kù)單個(gè)IO讀慢的原因。
跟客戶進(jìn)一步溝通得知,A數(shù)據(jù)庫(kù)已經(jīng)從Exadata上遷移出去將近2個(gè)月了,目前A數(shù)據(jù)庫(kù)處于關(guān)閉狀態(tài)。那么問(wèn)題來(lái)了,既然A數(shù)據(jù)庫(kù)已經(jīng)處于關(guān)閉狀態(tài),并且永遠(yuǎn)也不會(huì)開啟,那么為什么A數(shù)據(jù)庫(kù)還有這么多的數(shù)據(jù)對(duì)象緩存在FlashCache中呢?并且也沒(méi)有立即釋放的跡象。
通過(guò)這個(gè)案例,可以看出FlashCache緩存淘汰算法存在的一些缺陷。存在的缺陷主要在于第2步,因?yàn)樗皇呛?jiǎn)單地比較FlashCache中的哪個(gè)數(shù)據(jù)對(duì)象的hitcount最少,然后把hitcount最少的數(shù)據(jù)對(duì)象刷出FlashCache。
該缺陷主要表現(xiàn)為:A數(shù)據(jù)庫(kù)已經(jīng)關(guān)閉了2個(gè)多月,并且永遠(yuǎn)也不會(huì)開啟,但A數(shù)據(jù)庫(kù)中有些數(shù)據(jù)對(duì)象的hitcount非常非常大,則這些對(duì)象有可能永遠(yuǎn)緩存在FlashCache中。
那么如何優(yōu)化Exadata FlashCache的淘汰算法呢?當(dāng)數(shù)據(jù)對(duì)象被緩存到FlashCache之后,相應(yīng)的信息都會(huì)被統(tǒng)計(jì)到flashcachecontent指標(biāo)中,可以分析flashcachecontent指標(biāo),來(lái)確認(rèn)FlashCache中緩存了哪些數(shù)據(jù)對(duì)象。
查看flashcachecontent指標(biāo)中包括哪些信息,具體命令如下。
flashcachecontent指標(biāo)中dbUniqueName屬性,是數(shù)據(jù)庫(kù)的唯一識(shí)別名,等同于數(shù)據(jù)庫(kù)名。objectNumber屬性,對(duì)應(yīng)數(shù)據(jù)庫(kù)中dba_objects視圖的data_object_id字段,可以通過(guò)它查找出具體的數(shù)據(jù)對(duì)象名稱。
有了數(shù)據(jù)庫(kù)名和數(shù)據(jù)對(duì)象ID這些信息,就可以與數(shù)據(jù)庫(kù)實(shí)例進(jìn)行關(guān)聯(lián)查詢出這些數(shù)據(jù)對(duì)象的當(dāng)前狀態(tài)。
可以在緩存淘汰算法代碼中定期檢查FlashCache中所涉及的數(shù)據(jù)庫(kù)和數(shù)據(jù)對(duì)象的狀態(tài),如果發(fā)現(xiàn)FlashCache中某個(gè)數(shù)據(jù)庫(kù)已經(jīng)長(zhǎng)時(shí)間未運(yùn)行,比如一個(gè)星期或半個(gè)月,則將FlashCache中該數(shù)據(jù)庫(kù)的所有對(duì)象的hitcount重置為0,同樣,如果發(fā)現(xiàn)FlashCache中某個(gè)對(duì)象(objectNumber)在對(duì)應(yīng)的數(shù)據(jù)庫(kù)中沒(méi)有匹配的數(shù)據(jù)對(duì)象,則間接地說(shuō)明了FlashCache中緩存的對(duì)象在數(shù)據(jù)庫(kù)層面已經(jīng)被刪除,這類對(duì)象同樣可以將hitcount重置為0。如此一來(lái),當(dāng)需要從FlashCache中刷出數(shù)據(jù),騰出空間給新的數(shù)據(jù)對(duì)象時(shí),就可以優(yōu)先刷出那些被刪除的對(duì)象,或者是數(shù)據(jù)庫(kù)已經(jīng)長(zhǎng)期關(guān)閉的對(duì)象。而不是簡(jiǎn)單地刷出hitcount最小的數(shù)據(jù)對(duì)象,因?yàn)檎l(shuí)也不能保證hitcount最小的數(shù)據(jù)對(duì)象在日后不會(huì)被再次訪問(wèn)。
前面介紹了針對(duì)Oracle公司的Exadata存儲(chǔ)管理軟件中對(duì)FlashCache緩存的管理,以及Exadata FlashCache緩存淘汰算法中目前存在的缺陷,給出該淘汰算法的改進(jìn)建議,這個(gè)建議將有效改進(jìn)FlashCache的空間使用效率,提升使用性能。