(本文首發於infoq中文站:
一張**上傳的過程是這樣的:
採用同步的方式寫入**資料庫
如果**上有地理位置標籤,則以非同步的方式將**提交給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就能實時獲取錯誤資訊。
highscalability上還根據整理mike krieger的演講整理了一些值得借鑑的經驗,比如:
如果您想進一步了解instagram背後的技術細節,可以訪問其技術團隊的部落格。
了解Instagram背後的技術
一張 上傳的過程是這樣的 採用同步的方式寫入 資料庫 如果 上有地理位置標籤,則以非同步的方式將 提交給solr進行索引 將 的id加入每個關注者的列表裡,該列表儲存在redis之中 在顯示feed時,選取一小部分 id,在memcached裡進行查詢 在設計系統時,instagram的設計哲學是簡...
zz 了解Instagram背後的技術
url 一張 上傳的過程是這樣的 採用同步的方式寫入 資料庫 如果 上有地理位置標籤,則以非同步的方式將 提交給solr進行索引 將 的id加入每個關注者的列表裡,該列表儲存在redis之中 在顯示feed時,選取一小部分 id,在memcached裡進行查詢 在設計系統時,instagram的設計...
Google七夕情人節Doodle背後技術揭秘
七夕佳節,習慣了玫瑰 巧克力包圍的西方情人節,終於輪到了純真的中國式浪漫。google今天也應景推出了乙個新的doodle,而且還是個小遊戲。這個小遊戲暗藏了三道關卡,需要使用者在限定的時間內將各種顏色的小喜鵲放到與其顏色對應的圈圈中,從而為牛郎織女搭起鵲橋,而且遊戲難度會隨著關卡的深入而逐漸上公升...