- 論壇徽章:
- 1
|
本帖最后由 優(yōu)云敏捷運(yùn)維 于 2016-06-07 11:07 編輯
今天,我和大家分享下redis在運(yùn)維數(shù)據(jù)分析中的去重統(tǒng)計(jì)方式。為了避免混淆,本文中對(duì)于redis的數(shù)據(jù)結(jié)構(gòu)做如下約定:
SET:saddkey member
ZSET:zaddkeyscoremember
HYPERLOGLOG:pfaddkey element
STRING:setbitkey offset value
名詞約定:
維度:比如版本、操作系統(tǒng)類(lèi)型、操作系統(tǒng)版本、運(yùn)營(yíng)商、設(shè)備型號(hào)、網(wǎng)絡(luò)類(lèi)型等
復(fù)合維度:由兩個(gè)或多個(gè)維度交錯(cuò)產(chǎn)生的維度,比如某個(gè)版本下的某個(gè)設(shè)備型號(hào)。
去重統(tǒng)計(jì)在數(shù)據(jù)化運(yùn)維的指標(biāo)計(jì)算環(huán)節(jié),并不是一個(gè)陌生的字眼,甚至可以說(shuō),在大部分的數(shù)據(jù)指標(biāo)的中間計(jì)算過(guò)程中,最終會(huì)分為以下幾種數(shù)據(jù)集:
最大,最小,穩(wěn)定性,疊加,去重統(tǒng)計(jì)。
這5種指標(biāo)前面4種在實(shí)時(shí)處理框架或者大部分nosql中使用相對(duì)較小的開(kāi)銷(xiāo)即可完成計(jì)算,基礎(chǔ)指標(biāo)計(jì)算的大部分計(jì)算瓶頸還是落在io上面,而導(dǎo)致io瓶頸的問(wèn)題源自于數(shù)據(jù)維度的劃分與聚合,特別是對(duì)于去重統(tǒng)計(jì)類(lèi)型的數(shù)據(jù),如果有一種需要實(shí)時(shí)顯示的去重指標(biāo),維度的切分對(duì)于io上的開(kāi)銷(xiāo)簡(jiǎn)直是一種災(zāi)難。
例如,假定我們需要獲取手機(jī)終端中某個(gè)應(yīng)用版本中的某個(gè)設(shè)備型號(hào)或者某個(gè)系統(tǒng)的活躍設(shè)備數(shù)。那么,目前市場(chǎng)中的設(shè)備型號(hào)有幾百種,各種系統(tǒng)版本x系統(tǒng)類(lèi)型也有很多,對(duì)指標(biāo)的去重統(tǒng)計(jì)來(lái)說(shuō)每多一個(gè)維度,需要的內(nèi)存開(kāi)銷(xiāo)就要多上一倍,2個(gè)維度交叉產(chǎn)生的復(fù)合維度可能多達(dá)上百個(gè),3個(gè)維度的交叉產(chǎn)生的復(fù)合維度可能數(shù)以千計(jì)。
因此,對(duì)于實(shí)時(shí)顯示的去重統(tǒng)計(jì)類(lèi)型指標(biāo),最好的處理方式是在設(shè)計(jì)時(shí)盡量規(guī)避這種指標(biāo)。如果實(shí)在無(wú)法規(guī)避,我們需要做的犧牲一部分插入時(shí)的性能或者空間上的性能換來(lái)該部分指標(biāo)在讀取時(shí)不是o(n)的。
下面簡(jiǎn)單介紹幾種在開(kāi)發(fā)中基于redis研究出來(lái)的幾種數(shù)據(jù)去重方式。
1.于set的去重統(tǒng)計(jì)
這種結(jié)構(gòu)的數(shù)據(jù)應(yīng)該是最好理解的統(tǒng)計(jì)方式,也是常規(guī)的統(tǒng)計(jì)方式之一,直接把要去重的部分作為member插入一個(gè)set中,需要統(tǒng)計(jì)的時(shí)候直接使用scard統(tǒng)計(jì)該數(shù)據(jù)集的基數(shù),對(duì)于時(shí)間等維度信息,可以放在key中,然后拿取的時(shí)候通過(guò)拼接維度字段的形式拿取。
0.jpg (27.53 KB, 下載次數(shù): 63)
下載附件
2016-06-07 11:02 上傳
優(yōu)點(diǎn):使用簡(jiǎn)單,統(tǒng)計(jì)精確。
缺點(diǎn):無(wú)法達(dá)成實(shí)時(shí)統(tǒng)計(jì)的功能,要一分鐘統(tǒng)計(jì)一次的話(huà)需要使用expire命令設(shè)置一個(gè)很短的回收時(shí)間,單一維度時(shí)占用空間過(guò)大,信息聚合成本過(guò)大,有幾個(gè)維度就需要幾倍的內(nèi)存空間,3個(gè)以上復(fù)合維度時(shí)基本不需要考慮此方案。
適用場(chǎng)景:需要統(tǒng)計(jì)的去重內(nèi)容的基數(shù)非常小的情況下可以考慮,在優(yōu)云mobile中,對(duì)于用戶(hù)基數(shù)較小的影響設(shè)備數(shù)的計(jì)算采用了此種方式。
2.基于zset的去重統(tǒng)計(jì)
傳統(tǒng)的基于跳表/B樹(shù)的統(tǒng)計(jì)方式,key為維度信息,score為時(shí)間,member為設(shè)備id等原子信息,通過(guò)zcount可以拿取所有的成員數(shù)量。
優(yōu)點(diǎn):插入和統(tǒng)計(jì)都是o(log(N))的,可以精確統(tǒng)計(jì)從現(xiàn)在開(kāi)始到某個(gè)時(shí)間點(diǎn)的用戶(hù),可以保留原子數(shù)據(jù)。
1.jpg (26.77 KB, 下載次數(shù): 57)
下載附件
2016-06-07 11:02 上傳
缺點(diǎn):只能自定義時(shí)間域上的左區(qū)間,對(duì)于右區(qū)間只能定義為現(xiàn)在時(shí)間,否則會(huì)出現(xiàn)統(tǒng)計(jì)值比實(shí)際值偏小的情況(因?yàn)橥粋(gè)設(shè)備如果出現(xiàn)兩次,則會(huì)移除舊的那條),單一維度時(shí)占用空間過(guò)大,有幾個(gè)維度就需要幾倍的內(nèi)存空間,3個(gè)以上復(fù)合維度時(shí)基本不需要考慮此方案。
適用場(chǎng)景:對(duì)于查看從現(xiàn)在開(kāi)始1分鐘 5分鐘 10分鐘等各種時(shí)間跨度的用戶(hù)基數(shù)時(shí)可以考慮,在優(yōu)云mobile中,采用了這種方案來(lái)統(tǒng)計(jì)活躍設(shè)備數(shù),早期開(kāi)發(fā)時(shí)我們將各種時(shí)間維度和各種復(fù)合維度全部放在了redis中,結(jié)果發(fā)現(xiàn)內(nèi)存開(kāi)銷(xiāo)過(guò)大,現(xiàn)在的版本我們只存放了最近2分鐘的一些簡(jiǎn)單維度的數(shù)據(jù)。
3.基于bitset的去重統(tǒng)計(jì)
將終端用戶(hù)id映射為一個(gè)bitset上的一個(gè)bit,利用現(xiàn)代處理器的特性進(jìn)行快速計(jì)算。
優(yōu)點(diǎn):統(tǒng)計(jì)結(jié)果精確,對(duì)于不同維度可以使用and或者or進(jìn)行聚合,數(shù)據(jù)具有原子性,通過(guò)較少的操作即可做到跨維度的計(jì)算。
2.jpg (16.36 KB, 下載次數(shù): 60)
下載附件
2016-06-07 11:02 上傳
缺點(diǎn):不適用于分鐘級(jí)別的統(tǒng)計(jì),并且用戶(hù)id的映射較為麻煩。如果使用hash的方式進(jìn)行映射,將會(huì)不可避免的產(chǎn)生hash碰撞,如果使用用戶(hù)id進(jìn)行映射,那么必然需要維護(hù)一份用戶(hù)id映射表,這份映射表放在內(nèi)存中會(huì)占用大量空間,放在磁盤(pán)中則會(huì)導(dǎo)致整個(gè)系統(tǒng)的處理速率降低。
備注:java中的bitset在一個(gè)byte字節(jié)上是由低位到高位進(jìn)行存儲(chǔ),redis中則是由高位到低位進(jìn)行存儲(chǔ)。
適用場(chǎng)景:適用于需要儲(chǔ)存原子數(shù)據(jù)并進(jìn)行較大時(shí)間跨度或者自由拼接時(shí)間跨度聚合的場(chǎng)景。
4.基于hyperloglog的去重統(tǒng)計(jì)
hyperloglog是一種基于概率的統(tǒng)計(jì)方式,在redis的2.8.9版本后出現(xiàn)的新數(shù)據(jù)結(jié)構(gòu)
優(yōu)點(diǎn):每個(gè)hyperloglog只需要12K的空間,并且誤算率只有0.81%,不同的紀(jì)錄之間可以進(jìn)行聚合,也就是可以通過(guò)聚合統(tǒng)計(jì)出任意時(shí)間范圍的去重結(jié)果,統(tǒng)計(jì)單個(gè)hyperloglog時(shí)時(shí)間復(fù)雜度為o(1)。
缺點(diǎn):對(duì)于統(tǒng)計(jì)結(jié)果要求較為精確的場(chǎng)合并不是非常適用
適用場(chǎng)景:在對(duì)誤算率要求不高的情況下,同bitset。
5.基于布隆過(guò)濾器的去重統(tǒng)計(jì)
布隆過(guò)濾器是一種改良的bit映射方案,通過(guò)使用多種不同的hash種子,可以做到在較低誤判率以及較高的空間利用率的情況下進(jìn)行統(tǒng)計(jì),redis中并沒(méi)有布隆過(guò)濾器這個(gè)數(shù)據(jù)結(jié)構(gòu),不過(guò)可以通過(guò)lua腳本的方式實(shí)現(xiàn)一個(gè)布隆過(guò)濾器,詳細(xì)源碼可見(jiàn)
3.jpg (14.71 KB, 下載次數(shù): 59)
下載附件
2016-06-07 11:02 上傳
優(yōu)點(diǎn):對(duì)于200萬(wàn)用戶(hù)不超過(guò)萬(wàn)分之一誤算率的統(tǒng)計(jì),只需要8M左右redis內(nèi)存即可完成統(tǒng)計(jì),萬(wàn)分之一的誤算率是在插入的不同設(shè)備數(shù)達(dá)200萬(wàn)次時(shí)才擁有的誤算率,在這之前的誤算率是從0開(kāi)始線(xiàn)性增長(zhǎng)的,在大多數(shù)情況下這個(gè)誤算率應(yīng)該是可以容忍的。
缺點(diǎn):布隆過(guò)濾器的統(tǒng)計(jì)結(jié)果無(wú)法聚合
適用場(chǎng)景:對(duì)于一些需要實(shí)時(shí)顯示的內(nèi)容并且維度較少的內(nèi)容,可以采用此數(shù)據(jù)結(jié)構(gòu),在優(yōu)云mobile中,總覽頁(yè)面的活躍設(shè)備數(shù)采用了此方案來(lái)實(shí)時(shí)顯示今日活躍設(shè)備數(shù)。
作者簡(jiǎn)介:胡翀,廣通軟件旗下--優(yōu)云軟件打雜初級(jí)java開(kāi)發(fā)工程師一枚,現(xiàn)任優(yōu)云大數(shù)據(jù)平臺(tái)開(kāi)發(fā)工程師,負(fù)責(zé)統(tǒng)計(jì)平臺(tái)的數(shù)據(jù)的分析和存儲(chǔ)。
秉承devops的理念,從監(jiān)控、到應(yīng)用體驗(yàn),到自動(dòng)化持續(xù)交付,優(yōu)云軟件一切為了您做的更好!
將IT運(yùn)維化繁為簡(jiǎn)請(qǐng)?jiān)L問(wèn)優(yōu)云官網(wǎng):
chinaunix.jpg (16.06 KB, 下載次數(shù): 54)
下載附件
2016-06-07 11:03 上傳
|
|