閱讀筆記--百萬級訪問網站前期的技術準備

1、服務器硬件  java

  建議至少三臺的標準配置,分別用做web處理數據庫備份mysql

  web服務器至少要8G內存,雙sata raid1,若是經濟稍微寬鬆,或靜態文件或圖片多,則15k sas raid1+0。數據庫至少16G內存,15k sas raid 1+0。備份服務器最好跟數據庫服務器同等配置。硬件能夠本身買品牌的底板,也就是機箱配主板和硬盤盒,CPU內存硬盤都本身配,也能夠上整套品牌,也可 以兼容機。三臺機器,市場行情六、7萬也就配齊了。nginx

  web服務器能夠既跑程序又當內存緩存,數據庫服務器則只跑主數據庫(假如是MySQL的話),備份服務器乾的活就相對多一些,web配置、緩存配置、數據庫配置都要跟前兩臺一致,這樣WEB和數據庫任意一臺出問題,把備份服務器換個ip就切換上去了。備份策略,能夠drbd,能夠rsync,或者其餘的不少不少的開源備份方案可選擇。rsync最簡單,放cron裏本身跑就行。備份和切換,建議多作測試,選最安全最適合業務的,而且儘量異地備份。web

 

2、架構  sql

  初期架構通常比較簡單,web負載均衡+數據庫主從+緩存+分佈式存儲+隊列。數據庫

  只是您比其餘人厲害之處就在於設計上考慮到緩存失效時的雪崩效應、主從同步的數據一致性和時間差、隊列的穩定性和失敗後的重試策略、文件存儲的效率和備份方式等等意外狀況。編程

緩存總有一天會失效,數據庫複製總有一天會斷掉,隊列總有一天會寫不進去,電源總有一天會燒壞。根據墨菲定律,若是不考慮這些,網站遲早會成爲茶几。後端

 

3、服務器軟件  瀏覽器

  Linux、nginx、java、mysql、svn幾乎是標配,緩存

  以上準備完畢,如今咱們有了運行環境,有了基本架構骨架,有了備份和切換方案,應該開始着手設計開發方面的事情了。

 

4、數據庫

  幾乎全部操做最後都要落到數據庫身上,它又最難擴展(存儲也挺難)。對於mysql,什麼樣的表用myisam,什麼樣的表用innodb,在開發以前要肯定。複製策略、分片策略,也要肯定。表引擎方面,通常,更新很少、不須要事務的表能夠用myisam,須要行鎖定、事務支持的,用innodb。 myisam的鎖表不必定是性能低下的根源,innodb也不必定全是行鎖,具體細節要多看相關的文檔,熟悉了引擎特性才能用的更好。現代WEB應用越來 越複雜了,咱們設計表結構時經常設計不少冗餘,雖然不符合傳統範式,但爲了速度考慮仍是值得的,要求高的狀況下甚至要杜絕聯合查詢。編程時得多注意數據一致性。

  複製策略方面,多主多從結構也最好一開始就設計好,代碼直接按照多主多歷來編寫,用一些小技巧來避免複製延時問題,而且還要解決多數據庫數據是否一致,能夠本身寫或者找現成的運維工具。

  分片策略。總會有那麼幾個表數據量超大,這時分片必不可免。分片有不少策略,從簡單的分區到根據熱度自動調整,依照具體業務選擇一個適合本身的。避免自增ID做爲主鍵,不利於分片。

  用存儲過程是比較難擴展的,這種情形多發生於傳統C/S,特別是OA系統轉換過來的開發人員。低成本網站不是一兩臺小型機跑一個數據庫處理全部業務的模式,是機海做戰。方便水平擴展比那點預分析時間和網絡傳輸流量要重要的多的多。

  NoSQL只是一個概念。實際應用中,網站有着愈來愈多的密集寫操做、上億的簡單關係數據讀取、熱備等,這都不是傳統關係數據庫所擅長的,因而就產生了不少非關係型數據庫,好比Redis/TC&TT/MongoDB/Memcachedb等,在測試中,這些幾乎都達到了每秒至少一萬次的寫操做,內存型的甚至5萬以上。例如MongoDB,幾句配置就能夠組建一個複製+自動分片+failover的環境,文檔化的存儲也簡化了傳統設計庫結構再開發的模式。不少業務是能夠用這類數據庫來替代mysql的。

 

5、緩存 

  數據庫很脆弱,必定要有緩存在前面擋着,其實咱們優化速度,幾乎就是優化緩存,能用緩存的地方,就不要再跑到後端數據庫那折騰。緩存有持久化緩存、內存緩存,生成靜態頁面是最容易理解的持久化緩存了,還有不少好比varnish的分塊緩存、前面提到的memcachedb等內存緩存,memcached首當其衝。緩存更新可用被動更新和主動更新。被動更新的好處是設計簡單,緩存空了就自動去數據庫取數據再把緩存填上,但容易引起雪 崩效應,一旦緩存大面積失效,數據庫的壓力直線上升極可能掛掉。主動緩存可避免這點可是可能引起程序取不到數據的問題。這二者之間如何配合,程序設計要多動腦筋。

 

6、隊列  

  用戶一個操做極可能引起一系列資源和功能的調動,這些調動若是同時發生,壓力沒法控制,用戶體驗也很差,能夠把這樣一些操做放入隊列,由另幾個模塊去異步執行,例如發送郵件,發送手機短信。開源隊列服務器不少,性能要求不高用數據庫當作隊列也能夠,只要保證程序讀寫隊列的接口不變,底層隊列服務可隨時更換就能夠,相似Zend Framework裏的Zend_Queue類,java.util.Queue接口等。

  

7、文件存儲  

  除告終構化數據,咱們常常要存放其餘的數據,像圖片之類的。這類數據數量繁多、訪問量大。典型的就是圖片,從用戶頭像到用戶上傳的照片,還要生成不一樣的縮略圖尺寸。存儲的分佈幾乎跟數據庫擴展同樣艱難。不使用專業存儲的狀況下,基本都是靠本身的NAS。這就涉及到結構。拿圖片存儲舉例,圖片是很是容易產生熱點的,有些圖片上傳後就再也不有人看,有些可能天天被訪問數十萬次,並且大量小文件的異步備份也很耗費時間。

  爲了未來圖片走cdn作準備,一開始最好就將圖片的域名分開,且不用主域名。不少網站都將cookie設置到了.domain.ltd,若是圖片也在這個域名下,極可能由於cookie而形成緩存失效,而且佔多餘流量,還可能由於瀏覽器併發線程限制形成訪問緩慢。

相關文章
相關標籤/搜索