了解Instagram背后的技術

作者: 丁雪豐  來源: InfoQ  發布時間: 2012-05-16 12:00  閱讀: 3087 次  推薦: 0   原文鏈接   [收藏]  

  剛被 Facebook 以 10 億美金收購的著名手機照片分享應用 Instagram 最近吸引了無數人的眼球,Android 版本登陸 Google Play 不到一個月下載量就突破 1000 萬,總用戶數即將超過 5000 萬。Instagram 聯合創始人 Mike Krieger 說他們用了 8 周時間打造了最初的 Instagram,但現在的系統肯定已經今非昔比。Instagram 技術團隊曾發表過一篇文章,介紹了 Instagram 背后的技術,日前 Mike Krieger 在名為 Scaling Instagram 的演講里,又介紹了更多細節,讓人們能了解到 5 名技術人員是如何支撐起整個系統的。

  一張照片上傳的過程是這樣的:

  1. 采用同步的方式寫入媒體數據庫
  2. 如果照片上有地理位置標簽,則以異步的方式將照片提交給 Solr 進行索引
  3. 將照片的 ID 加入每個關注者的列表里,該列表保存在 Redis 之中
  4. 在顯示 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 53CloudFront提供,所有的照片都存放在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 個位于不同可用區里的副本,通過 repmgrStreaming 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 個實例,應用服務器通過 pylibmclibmemcached 進行連接。雖然 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 就能實時獲取錯誤信息。

  HighScalability 上還根據整理 Mike Krieger 的演講整理了一些值得借鑒的經驗,比如:

  • 找那些你熟悉的技術和工具,在簡單的使用場景里先做一些嘗試
  • 不要使用兩個工具來處理同樣的任務
  • 事先準備降級方案,以便在需要時降低負載
  • 不要過度優化,或者希望能事先知道站點要擴展,對于一個初創的社交站點而言,沒什么擴展性問題是解決不了的
  • 如果一個辦法不行,趕快換下一個

  如果您想進一步了解 Instagram 背后的技術細節,可以訪問其技術團隊的博客

0
1
 
標簽:Instagram
 
 

文章列表

全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()