zz 了解Instagram背後的技術

2021-09-01 07:01:46 字數 2169 閱讀 2080

[url]

一張**上傳的過程是這樣的:

採用同步的方式寫入**資料庫

如果**上有地理位置標籤,則以非同步的方式將**提交給solr進行索引

將**的id加入每個關注者的列表裡,該列表儲存在redis之中

在顯示feed時,選取一小部分**id,在memcached裡進行查詢

在設計系統時,instagram的設計哲學是簡單、為最小化運維負擔進行優化並監控一切內容;其核心原則是保持簡單,不要重**明輪子,盡可能使用經過驗證、穩定可靠的技術。

由於只有5名技術人員(其中僅2.5名後端工程師),精力有限,選擇amazon的雲服務是個不錯的選擇。目前他們使用了超過100個ec2例項用於提供各種服務,執行的作業系統是ubuntu 11.04,之前的一些版本在高流量時表現不夠穩定。在負載均衡方面,他們使用amazon的elastic load balancer實現負載均衡,後端執行了3個nginx例項,ssl只到elb上為止,降低了nginx上的cpu負載。dns和cdn分別由amazon的route 53和cloudfront提供,所有的**都存放在s3上,目前已經有幾tb的規模了。

用於處理請求的應用伺服器執行於amazon high-cpu extra-large instance之上,由於他們的請求更多是cpu密集型的,因此這能更好地平衡cpu與記憶體。採用的開發框架是django,wsgi伺服器是gunicorn,通過fabric在所有機器上進行並行部署,一次部署僅需幾秒鐘。

大多數資料都存放在postgresql裡,主分片集群執行於12個high-memory quadruple extra-large instance(68.4gb記憶體)上,另有12個位於不同可用區里的副本,通過repmgr以streaming replication的方式進行同步。由於elastic block store的磁碟iops不高,因此需要將正在使用的資料都載入到記憶體裡,vmtouch能幫助管理記憶體中的資料。他們在ebs上使用mdadm實現了軟體raid,以此提公升寫吞吐量;資料庫的檔案系統用的是xfs,在從庫獲取快照時,會先凍結raid陣列,保證快照的一致性。

應用程式在連線資料庫時,由pgbouncer建立連線池。目前,instagram的資料按照使用者id進行分片,某些分片可能會超出物理節點的容量上限,為此他們將資料分成了很多個邏輯分片,對映到少數幾個物理節點之上;當乙個節點被填滿之後,可以將某些邏輯分片移到別的節點上,以緩解該節點的壓力。隨著資料量的增長,以後他們也會進行垂直分割槽,django db router能讓一切輕鬆不少。

instagram也大量使用redis來存放複雜的物件(物件的大小做了一定的限制),用於主feed、活動feed、會話系統及其他相關系統。因為要將redis的所有資料都放在記憶體裡,此處同樣也用了high-memory quadruple extra-large instance,並對資料做了分片。當redis例項的請求達到4萬/秒後,它漸漸成為了瓶頸,於是redis也做了主從複製,副本的資料會經常匯出到磁碟上,通過ebs快照進行備份。

除了redis,他們還使用memcached來做快取,目前執行了6個例項,應用伺服器通過pylibmc和libmemcached進行連線。雖然amazon提供了elastic cache服務,但該服務的**並不便宜,相比之下,還是執行自己的memcached例項比較划算。非同步任務佇列使用的是gearman,目前有大約200個工作程序來處理各種任務,比如把**分享到twitter和facebook,通知使用者有新**等等。pyapns已經處理了十億的推送通知,非常穩定,他們還自己開發了基於node.js的node2dm,用於向android裝置傳送推送通知。

監控方面,instagram使用munin以圖形化的方式呈現整個系統的執行狀況,還通過python-munin定製了一些外掛程式,用來顯示業務資料;網路守護程序stated可以實時收集資料並做彙總;dogslow會監控程序,一旦發現執行時間過長的程序,便會儲存該程序的快照,以便後續分析,比如響應時間超過1.5秒的請求,通常都是卡在memcached的set()和get_many()方法上。對於python的錯誤,只要登上sentry就能實時獲取錯誤資訊。

找那些你熟悉的技術和工具,在簡單的使用場景裡先做一些嘗試

不要使用兩個工具來處理同樣的任務

事先準備降級方案,以便在需要時降低負載

不要過度優化,或者希望能事先知道站點要擴充套件,對於乙個初創的社交站點而言,沒什麼擴充套件性問題是解決不了的

如果乙個辦法不行,趕快換下乙個

如果您想進一步了解instagram背後的技術細節,可以訪問其技術團隊的部落格。

了解Instagram背後的技術

本文首發於infoq中文站 一張 上傳的過程是這樣的 採用同步的方式寫入 資料庫 如果 上有地理位置標籤,則以非同步的方式將 提交給solr進行索引 將 的id加入每個關注者的列表裡,該列表儲存在redis之中 在顯示feed時,選取一小部分 id,在memcached裡進行查詢 在設計系統時,in...

了解Instagram背後的技術

一張 上傳的過程是這樣的 採用同步的方式寫入 資料庫 如果 上有地理位置標籤,則以非同步的方式將 提交給solr進行索引 將 的id加入每個關注者的列表裡,該列表儲存在redis之中 在顯示feed時,選取一小部分 id,在memcached裡進行查詢 在設計系統時,instagram的設計哲學是簡...

漢明碼(海明碼)你了解多少?帶你探秘背後秘密

如何編碼?如何校驗?在計算機儲存中,可能受其它原因,導致儲存出現錯誤,0變成1,1變成0,存放資料以漢明碼的方式儲存,可以進行資料的校正,具有一位糾錯能力。在介紹漢明碼之前舉乙個例子說明一下分組校驗 比如有乙個位元組的資料 1000 0101 黃色為檢驗位 資料說明 1 1010 0001 該資料1...