1. 程式人生 > >Dropbox可伸縮性設計最佳實踐分享

Dropbox可伸縮性設計最佳實踐分享

Run with extra load(通過額外載入發現系統故障)

在生產環境最常用的一個技巧就是,人為製造一些額外的資料進行載入。舉個例子,生產環境常常針對快取伺服器進行額外的資料讀取載入(Memcached Read),如果快取伺服器down機,運維工程師就可以馬上切斷流量進行故障排查。為什麼不能事先計劃好,而是採用一種”通過加流量試錯”的方式發現系統的問題呢?答案是:從長時間積累的運維經驗來看,引起系統故障的原因範圍太大,而且常常是突發性的,無法通過監控實時捕獲。另一點需要注意的是,儘量不要模擬資料寫入載入,這會破壞生產環境的資料一致性以及導致無法控制的鎖競爭。

App-specific metrics(面向具體應用的度量圖表)

針對特定應用,彙總不同類目叢集所定製的資料統計圖表變得越來越重要。一般現有的圖表監控都是針對具體某一類資料(CPU, Mem, IO等),將各個維度的統計資料彙總到一個圖表的需求很迫切。Dropbox的解決方案是充分利用memcached(快取伺服器),cron(後臺計劃任務管理)以及ganglia(叢集監控管理)三方的功能:每當有統計資料是我們想要的,會將該資料存到執行緒安全的記憶體塊裡面,每秒鐘記憶體塊裡面的資料都會發送到快取伺服器,以時間戳作為Key儲存。每分鐘,快取伺服器的統計資料會被清除、彙總、傳送到叢集監控伺服器。舉個實際的例子,下面是生產環境中最好用的圖表:


圖1:系統響應時間度量圖表

橫軸是時間段,縱軸是站點伺服器響應時間,響應時間分五段(MySQL Query, MySQL Commit, RPC’s, Memcaced, CPU),我們很容易看出在1:00左右,有根很長的刺,由MySQL Commit所導致。實際圖表響應時間不僅僅只有五段,很多因素被剔除了,都包含在”CPU”裡面。

Poor man’s analytics with bash(善於利用bash指令碼分析系統問題)

熟練運用bash shell可以很大程度提高工作效率,舉個例子,現有伺服器端的日誌,想從中提取最近某個時間段內流量的波峰是否超過閾值,當然現有的伺服器圖表可以滿足大部分的需求,但很多系統的資料實時性不高(一到五分鐘更新一次資料)。面對ad hoc需求,可以使用如下指令碼:

Apr 8 2012 14:33:59 POST ...
Apr 8 2012 14:34:00 GET ...
Apr 8 2012 14:34:00 GET ...
Apr 8 2012 14:34:01 POST ...

cut -d’ ’ -f1-4 log.txt | xargs -L1 -I_ date +%s -d_ | uniq -c | (echo “plot ‘-’ using 2:1 with lines”; cat) | gnuplot

上述命令會將現在的系統狀況以圖形化的形式表現出來。

Log spam is really helpful(垃圾日誌還是幫得上忙的)

垃圾日誌並不是說一無是處,很多時候,它幫了我們大忙。垃圾日誌其實可以作為跟蹤程式碼的一種方式,舉個例子,一段程式碼邏輯如果在正常情況下會列印”FUUUCCKKKKKasdjkfnff”的字串,那麼在出問題的時候我們可以根據日誌找到問題的源頭。日常的運維工作常常會維護兩份日誌檔案,一份乾淨的日誌檔案,一份填充著垃圾日誌的檔案,它常常會不經意的幫到我們。

Keeping a downtime log(記錄故障日誌)

記錄故障日誌是一個很好的習慣,記錄故障的開始、結束時間以及故障的原因,過後通過分析故障日誌我們可以很客觀的判斷如何最小化故障發生的時間。每個故障發生的原因不盡相同,而每個故障的解決方案也不一樣,將故障詳情記錄下來確實是一個明智之舉。

UTC(使用世界標準時間)

一定要使用世界表尊時間,不管是伺服器時間還是資料庫時間。很多系統對於非UTC時間的處理很不好,這會帶來很多問題,切記在呈現給使用者資料之前做時區轉換。

Technologies we used(我們使用的技術)

很多朋友對於Dropbox使用什麼技術非常感興趣,我們來列舉下我們使用的技術:

2) 資料庫MySQL

4) 亞馬遜雲服務S3/EC2儲存檔案

5) memcached用來減小資料庫的壓力,以及用來處理內部系統的協作

6) ganglia做叢集監視管理以及生成定製化監控報表

7) nginx做前端伺服器

8) haproxy做web伺服器負載均衡

9) nagios做內部伺服器的健康檢查

10) Pingdom做外部服務的監控

11) GeoIP 用來將IP轉化為地理位置

上述選擇的技術是業界標準,沒有什麼新奇,最大的原因是可靠、風險低。即便是memcached這麼通用的技術,都存在一些令人頭痛的bug,選擇太新的技術會讓事情變得複雜。我們對於技術選型的建議是,儘量選擇輕量級的、業界知名公司都在使用的技術,當然也可以花時間成為該專案的”技術先驅”。

The security-convenience tradeoff(系統安全和使用者體驗的權衡)

為了保護使用者檔案資訊,系統安全對於Dropbox非常重要。但增加安全性,不管對於使用者還是程式設計師,都會造成不方便,舉個例子:很多網站在使用者輸入錯誤的使用者名稱或者密碼的時候,提示說您有一項輸入錯誤,但不會告訴你具體是哪個。這種安全性策略,大大減小了破解使用者名稱、密碼的概率,但對於那些在不同網站都使用不同使用者名稱的使用者,會帶來一些麻煩。

在內部伺服器叢集設定防火牆,是一個很棒的想法,但在實踐中,對於互相沒有通訊的伺服器叢集可以省略此步驟。最常用的隔離,一般針對的是搭建在內部網路的第三方論壇,它更容易遭到攻擊。

我們的安全策略可能有些爭議,但系統安全都是對使用者行為的假想和抽象,很多系統甚至是銀行系統,都存在很大的安全隱患,所以在對系統做安全性投入的時候,先想一想這些工作是不是那麼的必要。

對於運維技術感興趣的讀者朋友,可以關注Rajiv部落格,或者通過郵箱[email protected]與作者聯絡。

相關推薦

Dropbox伸縮性設計最佳實踐分享

Run with extra load(通過額外載入發現系統故障) 在生產環境最常用的一個技巧就是,人為製造一些額外的資料進行載入。舉個例子,生產環境常常針對快取伺服器進行額外的資料讀取載入(Memcached Read),如果快取伺服器down機,運維工程師就可以馬

響應式網站設計 - 最佳實踐

設備 http 優先 設置 訪問速度 when big mob med 一.移動優先   手機設計稿通常更為簡約,由手機設計稿開始制作簡單版本,隨著平板和桌面的引入,頁面慢慢復雜,這是一個遞增的過程,前期把精力放到核心模塊上,默認打開簡潔的手機樣式,而負責的樣式包裹在med

RESTful API 設計最佳實踐

並不是 要求 關於 bin 是我 最好 實用 link keep 數據模型已經穩定,接下來你可能需要為web(網站)應用創建一個公開的API(應用程序編程接口)。需要認識到這樣一個問題:一旦API發布後,就很難對它做很大的改動並且保持像先前一樣的正確性。現在,網絡上有很

11. RESTful API 設計最佳實踐

API 設計規範 API 設計規範 URI 的設計 過濾、排序和搜尋等資訊 響應和錯誤處理 版本控制(delete) 認證 快取 未完待續… 其他規範可參考

建設容器雲平臺之前不能忽視3個評估,你的企業能得多少分? | 某銀行最佳實踐分享

雲端計算是目前主流的IT技術,雲端計算提供的應用彈性伸縮和快速部署的能力是網際網路的關鍵能力,受到網際網路企業以及傳統數字化轉型企業的歡迎。在雲端計算的實踐過程中,通過不斷的總結經驗,業界提出了“雲原生應用”的概念。雲原生應用就是通過一整套的設計理念,打造基於雲端計算環境的最佳應用實踐。在雲原生應用

MaxCompute表設計最佳實踐

MaxCompute表設計最佳實踐 產生大量小檔案的操作 MaxCompute表的小檔案會影響儲存和計算效能,因此我們先介紹下什麼樣的操作會產生大量小檔案,從 而在做表設計的時候考慮避開此類操作。 使用MaxCompute Tunnel SDK上傳資料,上傳過程中,每commit一次就會產生一個檔

阿里研究員谷樸:API 設計最佳實踐的思考

API是軟體系統的核心,而軟體系統的複雜度Complexity是大規模軟體系統能否成功最重要的因素。但複雜度Complexity並非某一個單獨的問題能完全敗壞的,而是在系統設計尤其是API設計層面很多很多小的設計考量一點點疊加起來的(也即John Ousterhout老爺子說的Complexity is in

[轉] 阿里研究員谷樸:API 設計最佳實踐的思考

API是軟體系統的核心,而軟體系統的複雜度Complexity是大規模軟體系統能否成功最重要的因素。但複雜度Complexity並非某一個單獨的問題能完全敗壞的,而是在系統設計尤其是API設計層面很多很多小的設計考量一點點疊加起來的(也即John Ousterhout老爺子說的Complexity is in

DevOps工具集最佳實踐分享

在很長一段時間開發和運維是一個硬幣的兩面,看起來雙方分工清晰,需要較少的協同。然而現代的軟體開發、部署執行越來越多的採用分散式架構、叢集環境,這就要求開發人員同運維人員的技能出現了必要的交集,雙方需要緊密協作才能確保應用的正常執行。隨著越來越多的企業IT部門的團隊在專案中

20條資料庫設計最佳實踐

通常情況下,可以從兩個方面來判斷資料庫是否設計的比較規範。一是看看是否擁有大量的窄表,二是寬表的數量是否足夠的少。若符合這兩個條件,則可以說明這個資料庫的規範化水平還是比較高的。當然這是兩個泛泛而談的指標。為了達到資料庫設計規範化的要求最好滿足以下20條規則:

Cassandra資料模型設計最佳實踐(上)

本文是Cassandra資料模型設計第一篇(全兩篇),該系列文章包含了eBay使用Cassandra資料模型設計的一些實踐。其中一些最佳實踐我們是通過社群學到的,有些對我們來說也是新知識,還有一些仍然具有爭議性,可能在要通過進一步的實踐才能從中獲益。 本文中,我將會講解一些

Cassandra資料模型設計最佳實踐(上部)

本文是Cassandra資料模型設計第一篇(全兩篇),該系列文章包含了eBay使用Cassandra資料模型設計的一些實踐。其中一些最佳實踐我們是通過社群學到的,有些對我們來說也是新知識,還有一些仍然具有爭議性,可能在要通過進一步的實踐才能從中獲益。 本文中,我將會講解

web設計最佳實踐核對清單

http://terrymorris.net/bestpractices/ Web Design Best Practices ChecklistBackground Information     * URL:     * Target Audience:    

領域驅動設計最佳實踐--程式碼篇

做一個租戶系統下的許可權服務,接管使用者的認證和授權,我們取名該服務為oneday-auth-server 寫在前面 ​ DDD(領域驅動設計)中涉及到幾個概念,實體,值物件,聚合,限定上下文。本篇只涉及實踐,概念講解將放在下一篇,同時上一篇為什麼我們需要領域驅動設計作為科普帖,大家可以在看完程式碼之後再

基於“大中臺,小前臺”架構的高用電商交易中臺最佳實踐之四—高擴充套件性技術要點設計

本篇主要介紹交易中臺如何做到高可擴充套件性,通過對線上交易業務梳理分析,可以發現變化部分主要來自兩個方面,一方面是交易流程的不同,如虛擬商品交易流程就非常簡單,而大家電類的交易流程就比較複雜;另一方面是來自交易流程環節中具體執行不同,如:地域限購, 有些業務是全國可售,有些業務只能是部分割槽

伸縮性最佳實踐

這篇文章中總結了一些構建可伸縮性系統的最佳實踐,總結的不錯,於是翻譯了下,原文在此:http://akfpartners.com/techblog/2009/08/11/scalability-best-practices/ ,翻譯內容如下: 下面是我們認為的一些可伸縮性的最

[譯] Node.js 高效能和擴充套件應用程式的最佳實踐 [第 2/3 部分]

原文地址:Good practices for high-performance and scalable Node.js applications [Part 2/3] 原文作者:virgafox 譯文出自:掘金翻譯計劃 本文永久連結:github.com/xitu/gold

一位雲架構師用服務打動客戶的故事之六(阿裏雲上的MSP最佳實踐項目分享

強調 出差 管理者 溝通 中間件 實踐項目 緩解 httpd 上進 最近找了一個典型的雲服務客戶的案例對內進行分享,今天把核心內容脫敏後分享出來。希望能給目前在路上(做雲服務MSP)的同行,有一些借鑒意義或者幫助。 該用戶據全年跟進情況,目前該客戶距正式啟用我們公司雲服務

[譯] Node.js 高效能和擴充套件應用程式的最佳實踐 [第 1/3 部分]

原文地址:Good practices for high-performance and scalable Node.js applications [Part 1/3] 原文作者:virgafox 譯文出自:掘金翻譯計劃 本文永久連結:github.com/xitu/gold

RESTful API 設計指南——最佳實踐

RESTful API 設計指南——最佳實踐 Facebook、谷歌、Github、Netflix 和幾個其他的科技巨頭已經允許開發者和其產品通過 API 呼叫他們的資料,併為他們提供平臺。即使你不是寫 API 的專業人士,擁有精美的 API 也對你的應用程式有好處。 關於設計 API 的最