自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

十億月PV網(wǎng)站秘訣:Reddit自失敗中總結(jié)的25條經(jīng)驗

云計算
Jeremy現(xiàn)為Netflix可靠性架構(gòu)師,更添為 Year One Labs的顧問;曾任Reddit首席架構(gòu)師,兼技術(shù)、運營部門負(fù)責(zé)人,更早之前還效力于eBay及Sendmail。

Reddit前雇員Jeremy Edberg在RAMP會議上發(fā)表了主題為“Scaling Reddit from 1 Million to 1 Billion–Pitfalls and Lessons”的精彩演講,分享了知名社交網(wǎng)站Reddit的打造經(jīng)驗。Jeremy現(xiàn)為Netflix可靠性架構(gòu)師,更添為 Year One Labs的顧問;曾任Reddit首席架構(gòu)師,兼技術(shù)、運營部門負(fù)責(zé)人,更早之前還效力于eBay及Sendmail。

近日HighScalanbility創(chuàng)始人Tod Hoff對該講話進(jìn)行了總結(jié),并基于Netflix做了相應(yīng)的對比,以下為譯文:

首先,一些值得關(guān)注的觀點:

1. 將SSD看做便宜的RAM,而不是磁盤。在Reddit磁盤都更換為SSD之后,服務(wù)器的數(shù)量從12臺減少到了1臺,并且有資源結(jié)余。SSD是比磁盤貴4倍,但是你得到了16倍以上的性能,值得投入。

2. 給用戶動手空間,看看他們都在做什么,然后將好的東西加入到特性里面。Reddit從用戶的身上學(xué)到了太多東西,網(wǎng)站的平穩(wěn)運行有很大一部分歸功于用戶。通過用戶你可以了解很多未知卻非常有價值的東西,比如開始被比作社區(qū)笑話的Reddit Gold服務(wù);當(dāng)被Reddit做成產(chǎn)品后,深得用戶歡心。

3. 開始時并不需要一個可擴(kuò)展架構(gòu)。未來的特性集肯定無法在開始被預(yù)測,所以有充足的時間去弄清擴(kuò)展問題。隨著網(wǎng)站的發(fā)展,系統(tǒng)將被更清晰的認(rèn)知,擴(kuò)展性問題也將迎刃而解。

4. 將未登錄用戶作2等公民對待。未登錄用戶遠(yuǎn)離緩存,讓Akamai首當(dāng)其沖,性能將得到大幅提升。

這樣的點還有很多,下面就看一下Jeremy Edberg在不斷失敗中提取的寶貴經(jīng)驗:

統(tǒng)計

1. 流量每15個月翻一倍

 

 

2. 如上圖所示,Reddit 8月的統(tǒng)計為:來自177個不同國家,67,328,706 UV及4,692,494,641PV。這個講話結(jié)束在10億PV這個點。

3. 28個員工

4. 每個員工大概負(fù)責(zé)2400萬UV。

5. 上萬個志愿版主

6. 在2012年,Reddit使用 240個服務(wù)器支撐每月20億的PV及2TB的PostgreSQL數(shù)據(jù)。所有高流量數(shù)據(jù)都從EBS(Elastic Block Store)轉(zhuǎn)移到Local Ephemeral Disk。

故事的起源

1. Reddit起源于2005年,開始的想法是訂餐服務(wù),并未獲得Y Combinator的青睞。再次來到Y(jié) Combinator與Paul Graham詳談時,他們提出了建立整個互聯(lián)網(wǎng)首頁的創(chuàng)意。也就是現(xiàn)在的Reddit,當(dāng)然那個時候他們還不了解Digg。

2. 網(wǎng)站開始托管在一個數(shù)據(jù)中心,然后逐漸過渡到EC2。

EC2在2006年首次被采用,主要使用S3存儲和服務(wù)日志

2007年使用S3存儲縮略圖

2008年使用EC2做批處理,使用VPN與數(shù)據(jù)中心連接

2009年使用EC2服務(wù)整個網(wǎng)站。其花費整整1天的時間將所有數(shù)據(jù)遷移到EC2,Data Gravity一個很好的示例

EC2

1. EC2決策制定的積極因素

不想租更多的機(jī)柜及購買更多的服務(wù)器

數(shù)據(jù)中心規(guī)模擴(kuò)展太快,并且無法在早期做增長預(yù)測

對一個4人團(tuán)隊來說,使用EC2更具成本效益,EC2比舊金山的數(shù)據(jù)中心便宜29%

2. EC2并非一直無往不利。你需要忍受更高的網(wǎng)絡(luò)延時及吵鬧的“鄰居”,因此必須早做打算,好處是可以按需擴(kuò)展。

3. EC2上資源限制記錄

所有資源都存在單賬戶限制

Amazon有時候并未認(rèn)識到一些來自他們的限制

追蹤限制,并在需要之前克服

捕獲異常,了解限制的臨界點

架構(gòu)

1. Reddit的架構(gòu)非常簡單的。用戶連接到一個與應(yīng)用程序?qū)油ㄐ诺膚eb層,應(yīng)用程序?qū)觿t負(fù)責(zé)與memcache、Cassandra及PostgreSQL通信。PostgreSQL使用了主-從配置,一個批處理系統(tǒng)通過Cassandra及PostgreSQL實現(xiàn)。

2. 相比起來,Netflix使用了一個面向服務(wù)的架構(gòu),組件間通信通過REST API實現(xiàn)

優(yōu)勢:易于擴(kuò)展,因為擴(kuò)展往往只是針對某個服務(wù)進(jìn)行;易于容量規(guī)劃;更容易確定問題所在,因為他們都通過REST調(diào)用隔離;作用域變窄;更有效的本地緩存。

劣勢:需要在不同服務(wù)上工作的多個開發(fā)團(tuán)隊或開發(fā)者,因此需要很多人力;需要防止工作重疊的通用平臺;對小團(tuán)隊來說,初始的開銷太大了。

3. PostreSQL是個非常好的數(shù)據(jù)庫,具備完美及飛速的鍵值存儲。

4. Email是個不小的挑戰(zhàn)。投遞正確性難以保障。開始時使用自己的郵箱服務(wù)器,現(xiàn)在已經(jīng)轉(zhuǎn)向電子郵件服務(wù)提供商。

5. 隊列是“救世主”。在做組件間工作傳遞時,將其放入一個隊列,將是一個非常不錯的小緩沖區(qū)。(Reddit使用RabbitMQ支撐隊列)

6. 混合使用Nginx和HAProxy。許多傳輸是相互的,為了負(fù)載均衡,在Nginx無法處理時果斷轉(zhuǎn)向HAProxy。它使用L7負(fù)載均衡,而Nginx仍然用來終止SSL及服務(wù)靜態(tài)內(nèi)容。

代碼

1. 框架。開始時,使用的是Pylons(Django太慢了),一個基于Python的框架。確實易于起步,然而很快就被迫放棄,因為它們不符合你的用例。Pylon被做了太多的修改以至于無法更新到下一個版本,這個問題現(xiàn)在已經(jīng)被修復(fù)了,所以還會再次使用Pyramid(pylon的新名字)。

2. 基于事件還是線程?基于線程更好做容量規(guī)劃,但是線程池的容量需要投入很多的精力?;谑录?,可以獲得更多的連接,但是你必須花時間去做好棘手問題凸現(xiàn)的準(zhǔn)備。

3. 開源是極好的。Reddit基于開源打造,付費軟件并不一定是個很好的決策,特別在起步階段。

數(shù)據(jù)

1. 數(shù)據(jù)是最寶貴的財產(chǎn)。類似Facebook、Google及Flicr都是建立在數(shù)據(jù)之上。

2. 以數(shù)據(jù)為中心。圍繞數(shù)據(jù)建立應(yīng)用程序,也就是應(yīng)用程序需要繞數(shù)據(jù)運作。數(shù)據(jù)建立了一個重力井,所有的一切都需要向它靠攏,因為數(shù)據(jù)是最難移動的。數(shù)據(jù)集越大,遷移就越困難。如果將現(xiàn)在的Reddit搬離EC2,將造成非常大的開銷,這也是為什么EC2在數(shù)據(jù)傳入時是免費的,讀出時卻是收費的,因為他們企圖將你所有數(shù)據(jù)都帶入云中。

3. 關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫。大部分Reddit數(shù)據(jù)都是鍵值型的,儲存于PostgreSQL。基于事務(wù)的需求及易于分析,所有涉及金錢的處理都使用了關(guān)系型數(shù)據(jù)庫。

4. 鐵打的PostgreSQL。PostgreSQL非??煽浚褂弥两裎窗l(fā)現(xiàn)其自身問題。如果真的出問題了,肯定由其它事件引起,比如使用Python編寫的備份系統(tǒng)。之所以PostgreSQL的使用場景多于Cassandra,因為Cassandra出現(xiàn)的比較晚。再加上PostgreSQL確實非常的快,并且原生支持KV。

5. 分片。寫操作被分布到4個主數(shù)據(jù)庫: 鏈接、 賬戶、subreddit、評論、投票及雜項。

每個都有從節(jié)點。投票使用了1主+1從模式,而評論則是1主+12從

盡可能的避免從主數(shù)據(jù)庫中讀取,直接在從節(jié)點上讀取,從而讓主節(jié)點專注于寫操作

客戶端庫將負(fù)責(zé)從節(jié)點的負(fù)載平衡,在某個從節(jié)點繁忙時會自動選取另一個

編寫了數(shù)據(jù)庫訪問層“thing”

這個組合使用了很長一段時間:結(jié)合分片數(shù)據(jù)庫、從讀并且監(jiān)視從讀性能以更好的均衡負(fù)載

7. Cassandra

寫入速度快,否定查詢速度快,易擴(kuò)展,沒有單點故障

在Netflix每個數(shù)據(jù)都會被分配到3臺主機(jī)上,如果1臺主機(jī)故障,余下的可以繼續(xù)運行。

將投票數(shù)據(jù)遷移至Cassandra讓Reddit獲益不淺:Cassandra布隆過濾器提供了非??斓姆穸ú樵?,對于評論來說,可以非??斓牟樵兂鰶]投票的評論,這樣反的答案將非??斓某霈F(xiàn)。( 更多細(xì)節(jié))

社交

1. 2008年的Reddit是開源的

用戶可以查看源代碼,然后確定沒有投票干預(yù)成分存在

用戶可以添加自己一直想要的特性,Reddit就會支持它,當(dāng)然這對不想寫代碼的人毫無作用

招聘。因為代碼為許多人知曉,所以就更容易招聘了解代碼的人,這個理論通常被用于創(chuàng)意推銷

2. 蠕蟲事件。有人發(fā)現(xiàn)了如何通過給頁面注入javascript來編寫蠕蟲,雖然無意傳播但是已經(jīng)泄露。而那天,剛好是Reddit一個創(chuàng)始人的大婚之日,整個團(tuán)隊都在一架飛機(jī)上往回趕。然而不想一個用戶已經(jīng)設(shè)計好了阻止蠕蟲傳播的補(bǔ)丁,并將之開源,在最危急的時候幫助到了社區(qū)。

Reddit如何賺錢

1. Sidebox廣告、自助式廣告、商品、Reddit Gold 服務(wù)、市場。

2. 需要注意的是 Reddit尚未盈利,它同樣帶給我們一個問題——像Reddit這樣的網(wǎng)站是否可以通過云來盈利?

3. 同樣需要注意的是Reddit已不再屬于Condé Nast,也就是它獨立了。

曾犯過的錯誤

1. 未考慮遷移到EC2的延時。數(shù)據(jù)中心機(jī)器間訪問延時是亞毫秒級,所以針對一個頁面負(fù)載訪問1000次memcache也是可行的。然而在EC2中就不行了,memcache訪問時間延長10倍至毫秒級,這就讓老方法并不適用。應(yīng)對方法是對memcache進(jìn)行批量訪問,這樣一個請求將返回大量的結(jié)果。

2. 未履行的承諾。Amazon不總是遵循承諾,并一遵循承諾為目標(biāo)。要學(xué)會與故障周旋,而不是去修復(fù)。

3. 不要怕使用新產(chǎn)品。Cassandra采用時,還處開發(fā)階段,雖現(xiàn)在發(fā)展不錯,但仍不乏問題。

4. 在發(fā)往客戶端前,是否需要盡可能的簡化工作。在推送到客戶端之前,服務(wù)器做了很多的頁面渲染。Facebook在這方面的經(jīng)驗非常豐富,你得到一個擁有許多div及API(用于填充div)的矩形,這也是Reddit想盡快實現(xiàn)的地方。這樣會讓應(yīng)用有更好的擴(kuò)展性,同樣幫助到了調(diào)試,因為很容易確定是哪個API產(chǎn)生了問題。

5. 沒有足夠的監(jiān)視,使用的唯一監(jiān)視系統(tǒng)并不適合虛擬化場景。開始時使用的是Ganglia,它提供了非常不錯的圖形,但是難以使用并且變化的非??欤貏e是在實例變化不斷的虛擬化環(huán)境中。

6. 沒有給數(shù)據(jù)設(shè)置生命周期。在Reddit ,評論并沒有一個到期時間。他們已經(jīng)著手限制老評論的投票,以及舊主題評論。這就導(dǎo)致了數(shù)據(jù)的一直增長,直到數(shù)據(jù)庫難以支撐熱數(shù)據(jù)的存儲。

7. 沒有使用一致性哈希。當(dāng)給緩存哈希時,問題就卡在想為緩存增加容量的情景——因為所有數(shù)據(jù)都在一個緩存上,或者你需要哈希太多緩存。在緩存增加后,無法再平衡。一致性哈希就是問題的解決方法之一,他們通過遷移到Cassandra解決了這個問題。

經(jīng)驗教訓(xùn)

1. 擴(kuò)展的關(guān)鍵就在于先用戶發(fā)現(xiàn)瓶頸所在

2. 使用proxy非常有益于擴(kuò)展。用戶可以通過URL被路由,Reddit擁有一個可以監(jiān)視每個發(fā)送給服務(wù)的URL長度。給流量的速度分級,基于響應(yīng)速度的平均值去拆分流量是個巨大的提升。

3. 自動化一切。如果可以像對待代碼一樣去對待基礎(chǔ)設(shè)施,那么工作將非常輕松,所有基礎(chǔ)設(shè)施最好能自動打開和關(guān)閉,并且自動配置。

4. 開始時并不需要建立一個可擴(kuò)展架構(gòu)。因為在初期你根本不知道最終的特性集,所以你有很多的時間來解決擴(kuò)展問題。隨著網(wǎng)站的增長,你將清晰的發(fā)現(xiàn)問題所在。

5. 在開始時并不需要使用一個面向服務(wù)的架構(gòu)。將它做為目標(biāo),在網(wǎng)站發(fā)展到中等規(guī)模時可以去實現(xiàn),否則只會帶來更多的開銷。

6. 不必刻意追逐潮流,但是偶爾試下也不錯,比如node.js。

7. 限制一切。時常發(fā)生的事情需要加上限制,并根據(jù)需求抬高或者放低。如果超出限制,需阻止用戶已保證服務(wù)的正常運作。

8. 長遠(yuǎn)的計劃。設(shè)計時總是假設(shè)當(dāng)下做的事情以后會有更多,應(yīng)用程序服務(wù)器、數(shù)據(jù)庫、緩存。開始時就假設(shè)不會只有1個,那么以后的橫向擴(kuò)展會容易很多。

9. 將Python使用C來重新編碼。隨著Reddit不停擴(kuò)展以追求更快的速度,他們使用C來重新編碼了經(jīng)常用到的功能(之前用的是Python),特別是過濾器、Markdown渲染以及memcache調(diào)用。這時Python作為膠水語言的好處就出來了,調(diào)用C時非常簡單且效率。

10. 盡量保持無結(jié)構(gòu)化模式,這將讓服務(wù)很容易添加特性——在不更改表格的情況下就可以增加屬性。

11. 數(shù)據(jù)的生命周期。對舊主題進(jìn)行鎖定,然后建立一個完整的呈現(xiàn)頁面并緩存,這樣就可以保證數(shù)據(jù)庫不會被舊數(shù)據(jù)淹沒。同時,停止舊評論的投票及舊主題的評論,用戶一般很少發(fā)現(xiàn)。

12. 將SSD看做便宜的RAM,而不是磁盤。當(dāng)Reddit將磁盤都換成SSD后,服務(wù)器數(shù)量從12臺減少到了1臺,并且還有資源結(jié)余。SSD是比磁盤貴4倍,但是得到的卻是16倍性能,值得投入。在Netflix與Reddit,一些最大的Cassandra都使用上了SSD,各方面得到了很大的提升。

13. 每個工具都有特定的用例。Memcache無法持久化,但是卻非???,所以投票數(shù)據(jù)就存儲在那里以保證頁面的飛速渲染。Cassandra可以持久化并且很快,同時布隆過濾器還提供了快速的反查詢,所以當(dāng)數(shù)據(jù)不在緩存中時用它來儲存投票的副本非常合適。PostgreSQL是可靠的關(guān)系型數(shù)據(jù)庫,所以用它來作為Cassandra的備份儲存投票數(shù)據(jù),以及用作需要相關(guān)性的批處理操作。

14. 將未登錄用戶視為2等公民。開始時這些用戶占了網(wǎng)絡(luò)流量的80%,至今仍有50%之巨。讓未注冊用戶遠(yuǎn)離緩存,Akamai首當(dāng)其沖,性能將得到大幅提升。附帶的好處是,如果Reddit宕機(jī)了,未登錄用戶甚至毫無所知。

15. 將一切都放到隊列中。投票、評論、縮略圖創(chuàng)建、預(yù)計算查詢、垃圾郵件處理及修正,隊列可以讓你在監(jiān)視長度時發(fā)現(xiàn)問題所在。附加好處是,隊列可以讓問題對用戶透明;比如隊列中的投票請求,如果沒有立即生效的話不會有任何人注意到。

16. 將數(shù)據(jù)保存在多個可用區(qū)域

17. 避免將網(wǎng)站放到一個單實例上

18. 頻繁的抓取EBS磁盤快照

19. 不要在實例上保存秘鑰

20. 通過Security Group劃分功能

21. 提供一個API。程序員將在你的平臺上開發(fā),比如Reddit的iPhone應(yīng)用就是用戶通過API建立的。

22. 在社區(qū)中保持一定的活躍度。Reddit管理員經(jīng)常在論壇現(xiàn)身并參與互動,這點深受其用戶的喜愛。

23. 讓用戶為你做事。人氣網(wǎng)站總是不乏欺詐、垃圾郵件等問題,而在Reddit這項工作由上萬個志愿者完成,他們仔細(xì)的處理了大多數(shù)的垃圾郵件問題。這個工作模式順利的難以置信,同時這也是Reddit的團(tuán)隊可以維持很小的原因。

24. 給用戶動手空間,看看他們都在做什么,然后將好的東西加入到特性里面。比如賦予用戶給subreddit添加CSS的能力,選擇好的功能,并為每個用戶都添加。這同樣讓用戶樂于在Reddit上做些東西,讓他們滿足于這種控制感。

25. 聽用戶的話,用戶將告訴你許多想知道但還不知道的事情。比如,在社區(qū)中Reddit Gold服務(wù)以笑話的形式開始,但是做成產(chǎn)品后卻深受用戶喜歡。

責(zé)任編輯:王程程 來源: Highscalability
相關(guān)推薦

2013-09-25 10:54:03

2014-12-15 14:39:00

Java

2010-05-05 11:40:30

Oracle數(shù)據(jù)庫

2013-04-22 10:07:13

架構(gòu)設(shè)計Pinterest架構(gòu)

2013-07-11 14:41:16

編程經(jīng)驗

2017-01-10 19:06:39

Android日常開發(fā)技術(shù)經(jīng)驗

2021-05-27 08:32:27

DevOps開發(fā)工具

2011-06-30 15:53:05

SEO外鏈

2016-12-30 08:46:32

2011-01-12 17:27:53

2017-11-09 17:35:21

數(shù)據(jù)庫OracleSQL優(yōu)化

2016-03-14 11:05:58

數(shù)據(jù)挖掘數(shù)據(jù)挖掘模型數(shù)據(jù)處理

2018-07-09 10:55:14

視頻系統(tǒng)經(jīng)驗

2017-11-17 08:00:03

軟件開發(fā)程序員前輩經(jīng)驗

2017-03-09 15:05:49

Linux

2010-11-30 11:35:31

2013-05-29 10:33:16

2020-02-10 09:23:09

LinuxReddit命令

2015-05-20 12:58:43

程序員經(jīng)驗教訓(xùn)

2020-06-22 18:54:39

消息隊列冪等性
點贊
收藏

51CTO技術(shù)棧公眾號