ATS 5.3.0缓存架构
簡(jiǎn)介
ATS既可以用作HTTP代理,也可以用作HTTP緩存,ATS能夠緩存任何字節(jié)流,雖然它當(dāng)前只支持HTTP協(xié)議傳輸?shù)淖止?jié)流,當(dāng)這樣的流緩存時(shí),會(huì)帶一個(gè)HTTP協(xié)議頭部,會(huì)命名為緩存中的一個(gè)對(duì)象object。每個(gè)對(duì)象通過一個(gè)名為cache key的全局唯一值識(shí)別。
該文檔的目的是描述ATS緩存的基本結(jié)構(gòu)和實(shí)現(xiàn)細(xì)節(jié)。緩存的配置只討論到需要理解內(nèi)部機(jī)制的程度。這篇文檔對(duì)ATS源碼和插件(codebase or plugins)開發(fā)者很有幫助。該文檔假定讀者對(duì)管理員文檔已經(jīng)比較熟悉,特別是對(duì)其中的HTTP Proxy Caching[2]和Configuring the Cache[3]以及相關(guān)的配置和值比較熟悉。
很遺憾內(nèi)部術(shù)語并不特別一致,所以該文檔將會(huì)頻繁使用不同方式的術(shù)語,以達(dá)到某種一致性。
緩存結(jié)構(gòu)Cache Layout
下面的小節(jié)描述了持久緩存數(shù)據(jù)persistent cache data的組織細(xì)節(jié)。ATS將它的持久存儲(chǔ)視作一個(gè)毫不加區(qū)分的字節(jié)的集合,假設(shè)再?zèng)]有其它結(jié)構(gòu)描述它。特別地,它并不會(huì)用到操作系統(tǒng)的文件系統(tǒng)。
假如使用一個(gè)file,僅是表明要用到它所含的字節(jié)集合。
Cache storage
ATS緩存的原生storage在storage.config中配置,文件中的每行描述了一個(gè)cache span,它被視作一個(gè)統(tǒng)一的持久存儲(chǔ)。
cache volumes可以定義為total storage的百分比,或者storage的絕對(duì)量。為了穩(wěn)妥,默認(rèn)每個(gè)cache voluem分散到所有的cache span。
cache volume和cache span的交集是cache stripe。每個(gè)cache span分割為cache stripes,每個(gè)cache volumes可以定義為total是這些stripes的集合。
假如這個(gè)cache spans例子中的cache volumes定義如下
那么實(shí)際的結(jié)構(gòu)layout形如
cache stripes是該實(shí)現(xiàn)的緩存基礎(chǔ)單元,一個(gè)cached object完整存放在單個(gè)stripe中,因而也在單個(gè)cache span中。緩存對(duì)象絕不會(huì)分割后存放到多個(gè)span紅色volumes中。
Objects被指定到一個(gè)stripe,因而被指定到一個(gè)cache volume,自動(dòng)基于URI的hash去檢索來自源站的object。可以在hosting.config中做配置來限制對(duì)象的廣度。
該配置文件支持將指定的hosts和域名存放到特定的cache volumes。從4.0.1版本后,也可以控制哪些cache spans,因而哪些cache stripes包含在指定的cache volumes中。
cache spans,cache volumes和cache stripes(組成前兩者)的結(jié)構(gòu)(layout and structure)完全來自storage.config和cache.config的配置,當(dāng)traffic_server啟動(dòng)時(shí)
會(huì)從頭重新計(jì)算。因此,那些配置文件的任何變化都能(差不多總是)導(dǎo)致現(xiàn)存緩存的完整性失效。
ATS將與cache stripe相關(guān)的storage視作一個(gè)不加區(qū)分的字節(jié)帶(span of bytes).在內(nèi)部,每個(gè)stripe視作毫不相關(guān)。本節(jié)描述的數(shù)據(jù)結(jié)構(gòu)僅針對(duì)stripe內(nèi)部。
在源碼中術(shù)語volume用作cache stripe,主要在Vol中實(shí)現(xiàn),讀者稱作volume的東西(本文檔稱作cache volume),這里表示為CacheVol。
注意
stripe劃分必須在處理object之前,因?yàn)閛bject所在的目錄在stripe內(nèi)部,當(dāng)stripe劃分改變時(shí),其中所含的任何緩存對(duì)象cached objects必定會(huì)丟失,因?yàn)樗鼈兊哪夸洈?shù)據(jù)不會(huì)在新stripe中找到。
緩存目錄Cache Directory
stripe中的內(nèi)容通過目錄directory追蹤,目錄中的每個(gè)元素就是directory entry,表示為Dir。每個(gè)元素引用緩存中的一段連續(xù)存儲(chǔ)區(qū),它們有各種稱呼,比如fragments,segments,docs,documents,和其它說法。總體來說,目錄就是以cache ID為key的一個(gè)hash。參見directory probing去了解如何使用cache ID來定位一個(gè)directory entry。cache key是content的URL,cache ID由cache key計(jì)算得到。
directory用作內(nèi)存中的駐留結(jié)構(gòu)memory resident structure,這意味著directory entry要盡可能小,當(dāng)前為10個(gè)字節(jié)。這迫使存放的數(shù)據(jù)做某些妥協(xié)。另一方面,這意味著,絕大多數(shù)cache miss不要求磁盤I/O,這樣將會(huì)有相當(dāng)大的性能優(yōu)勢(shì)。
目錄總是完全劃分好的,一旦stripe初始化好,對(duì)應(yīng)的directory大小就是固定的,絕不會(huì)再改變,并與stripe大小(近似線性)相關(guān)。這就是ATS內(nèi)存footprint與磁盤緩存大小緊密相關(guān)的原因。因?yàn)槟夸洿笮〔蛔?#xff0c;對(duì)內(nèi)存要求也不變,所以ATS隨著緩存中存放內(nèi)容的增多并不會(huì)再消耗更多的內(nèi)存。假如當(dāng)緩存為空時(shí),運(yùn)行ATS足夠,那么當(dāng)緩存存滿后,運(yùn)行ATS也是足夠的。
每個(gè)directory entry中存放了在stripe中的offset和size,size是fragment中實(shí)際數(shù)據(jù)大小的近似值(至少大于),精確的size data存放在磁盤中fragment header中。
注意
HTTP headers中的數(shù)據(jù)不經(jīng)過磁盤I/O并不能檢查。這包括對(duì)象的original URL, cache key沒有精確存放,因而不能可靠地檢索到。
……
緩存初始化Initialization
緩存初始化會(huì)開啟一個(gè)Store實(shí)例,通過讀storage配置文件,默認(rèn)為storage.config。對(duì)該配置文件中的每個(gè)合法元素,會(huì)創(chuàng)建一個(gè)Span實(shí)例,基本上有四種類型的實(shí)例:File,Directory,Disk,Raw device。
在生成所有的Span實(shí)例后,它們按device ID分組到內(nèi)部鏈表中并掛接到Store::disk數(shù)組上。引用同一個(gè)目錄,磁盤或裸盤的那些Spans被組合進(jìn)同一個(gè)span中。引用同一個(gè)文檔但是偏移重疊的Spans也被組合起來,這些工作都在ATS啟動(dòng)時(shí)調(diào)用ink_cache_init()完成。
span logic也被HostDB使用到,不止一個(gè)莫名其妙的feature在那個(gè)模塊中出現(xiàn)。
在配置初始化后,cache processor調(diào)用CacheProcessor::start(),它做了許多事情:
對(duì)每個(gè)合法的span,創(chuàng)建一個(gè)CacheDisk實(shí)例,CacheDisk類是一個(gè)continuation,能在span上用來執(zhí)行阻塞操作,該類的主要作用就是傳遞到AIO線程作為I/O操作完成時(shí)的回調(diào)函數(shù),然后會(huì)傳遞到AIO薪酬執(zhí)行storage unit的初始化,在所有這些工作完成后,在cplist_reconfigure()中,得到的storage會(huì)分發(fā)到volumes中,那時(shí)再生成CacheVol實(shí)例。
(未完待續(xù)……)
單詞表
parcel out ?分配,把…分成幾份
coalesce ?使…聯(lián)合,使…合并
inexplicable ?費(fèi)解的,莫名其妙的
ballpark ?大致的,大約的
millage ?稅率
wholly unjustified ?完全不合理
false negative 誤報(bào)
[1].https://docs.trafficserver.apache.org/en/latest/developer-guide/architecture/architecture.en.html
[2].https://docs.trafficserver.apache.org/en/latest/admin/http-proxy-caching.en.html#http-proxy-caching
[3].https://docs.trafficserver.apache.org/en/latest/admin/configuring-cache.en.html#configuring-the-cache
[4].https://github.com/portl4t/trafficserver-doc-zh/blob/master/arch/cache/cache-arch.md
總結(jié)
以上是生活随笔為你收集整理的ATS 5.3.0缓存架构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ATS 5.3.0中parent.con
- 下一篇: ATS 5.3.0命令行工具traffi