如您所想,基于其獨(dú)立訪問數(shù),Pinterest的高規(guī)模促成了一個(gè)非常高的IT基礎(chǔ)設(shè)施需求。
通過緩存來優(yōu)化用戶體驗(yàn)
近日,Pinterest工程經(jīng)理Abhi Khune對(duì)其公司的用戶體驗(yàn)需求及Redis的使用經(jīng)驗(yàn) 進(jìn)行了分享。即使是滋生的應(yīng)用程序打造者,在分析網(wǎng)站的細(xì)節(jié)之前也不會(huì)理解這些特性,因此先大致的理解一下使用場(chǎng)景:首先,為每個(gè)粉絲進(jìn)行提及到的預(yù)檢查;其次,UI將準(zhǔn)確的顯示用戶的粉絲及關(guān)注列表分頁。高效的執(zhí)行這些操作,每次點(diǎn)擊都需要非常高的性能架構(gòu)。
不能免俗,Pinterest的軟件工程師及架構(gòu)師已經(jīng)使用了MySQL及memcache,但是緩存解決方案仍然達(dá)到了他們的瓶頸;因此 為了擁有更好的用戶體驗(yàn),緩存必須被擴(kuò)充。而在實(shí)際操作過程中,工程團(tuán)隊(duì)已然發(fā)現(xiàn)緩存只有當(dāng)用戶sub-graph已經(jīng)在緩存中時(shí)才會(huì)起到作用。因此。任 何使用這個(gè)系統(tǒng)的人都需要被緩存,這就導(dǎo)致了整個(gè)圖的緩存。同時(shí),最常見的查詢“用戶A是否關(guān)注了用戶B”的答案經(jīng)常是否定的,然而這卻被作為了緩存丟 失,從而促成一個(gè)數(shù)據(jù)庫查詢,因此他們需要一個(gè)新的方法來擴(kuò)展緩存。最終,他們團(tuán)隊(duì)決定使用Redis來存儲(chǔ)整個(gè)圖,用以服務(wù)眾多的列表。
使用Redis存儲(chǔ)大量的Pinterest列表
Pinterest使用了Redis作為解決方案,并將性能推至了內(nèi)存數(shù)據(jù)庫等級(jí),為用戶保存多種類型列表:
- 關(guān)注者列表
- 你所關(guān)注的board列表
- 粉絲列表
- 關(guān)注你board的用戶列表
- 某個(gè)用戶中board中你沒有關(guān)注的列表
- 每個(gè)board的關(guān)注者及非關(guān)注者
Redis為其7000萬用戶存儲(chǔ)了以上的所有列表,本質(zhì)上講可以說是儲(chǔ)存了所有粉絲圖,通過用戶ID分片。鑒于你可以通過類型來查看以上 列表的數(shù)據(jù),分析概要信息被用看起來更像事務(wù)的系統(tǒng)儲(chǔ)存及訪問。Pinterest當(dāng)下的用戶like被限制為10萬,初略進(jìn)行統(tǒng)計(jì):如果每個(gè)用戶關(guān)注 25個(gè)board,將會(huì)在用戶及board間產(chǎn)生17.5億的關(guān)系。同時(shí)更加重要的是,這些關(guān)系隨著系統(tǒng)的使用每天都會(huì)增加。
Pinterest的Reids架構(gòu)及運(yùn)營
通過Pinterest的一個(gè)創(chuàng)始人了解到,Pinterest開始使用Python及訂制的Django編寫應(yīng)用程序,并一直持續(xù)到其擁 有1800萬用戶級(jí)日410TB用戶數(shù)據(jù)的時(shí)候。雖然使用了多個(gè)存儲(chǔ)對(duì)數(shù)據(jù)進(jìn)行儲(chǔ)存,工程師根據(jù)用戶id使用了8192個(gè)虛擬分片,每個(gè)分片都運(yùn)行在一個(gè) Redis DB之上,同時(shí)1個(gè)Redis實(shí)例將運(yùn)行多個(gè)Redis DB。為了對(duì)CPU核心的充分使用,同一臺(tái)主機(jī)上同時(shí)使用多線程和單線程Redis 實(shí)例。
鑒于整個(gè)數(shù)據(jù)集運(yùn)行在內(nèi)存當(dāng)中,Redis在Amazon EBS上對(duì)每秒傳輸進(jìn)來的寫入都會(huì)進(jìn)行持久化。擴(kuò)展主要通過兩個(gè)方面進(jìn)行:第 一,保持50%的利用率,通過主從轉(zhuǎn)換,機(jī)器上運(yùn)行的Redis實(shí)例一半會(huì)轉(zhuǎn)譯到一個(gè)新機(jī)器上;第二,擴(kuò)展節(jié)點(diǎn)和分片。整個(gè)Redis集群都會(huì)使用一個(gè)主 從配置,從部分將被當(dāng)做一個(gè)熱備份。一旦主節(jié)點(diǎn)失敗,從部分會(huì)立刻完成主的轉(zhuǎn)換,同時(shí)一個(gè)新的從部分將會(huì)被添加,ZooKeeper將完成整個(gè)過程。同時(shí) 他們每個(gè)小時(shí)都會(huì)在Amazon S3上運(yùn)行BGsave做更持久的儲(chǔ)存——這項(xiàng)Reids操作會(huì)在后端進(jìn)行,之后Pinterest會(huì)使用這些數(shù)據(jù)做 MapReduce和分析作業(yè)。(更多內(nèi)容見原文)