如何解決應用高併發的問題
系統在正式上線後必將會面對大量使用者訪問,面對各種層級的高併發請求,因此我們會採用高效能的伺服器、高效能的資料庫、高效率的程式語言、高效能的Web容器等。但是這幾個方面,還無法從根本解決大型網站面臨的高負載和高併發問題。因此我們必須對此做出相應的策略和技術解決方案。
1. 負載均衡
負載均衡將是大型網站解決高負荷訪問和大量併發請求採用的終極解決辦法。
(1)單個重負載的運算分擔到多臺節點裝置上做並行處理,每個節點裝置處理結束後,將結果彙總,返回給使用者,系統處理能力得到大幅度提高.
(2)大量的併發訪問或資料流量分擔到多臺節點設備上分別處理,減少使用者等待響應的時間,這主要針對Web伺服器、FTP伺服器、企業關鍵應用伺服器等網路應用。
2. 資料庫叢集
就是利用至少兩臺或者多臺資料庫伺服器,構成一個虛擬單一資料庫邏輯映像,像單資料庫系統那樣,向客戶端提供透明的資料服務。
3. 庫表雜湊
採用Hash演算法把資料分散到各個分表中, 這樣IO更加均衡。
上面提到的資料庫叢集由於在架構、成本、擴張性方面都會受到所採用DB型別的限制,於是我們需要從應用程式的角度來考慮改善系統架構,庫表雜湊是常用並且最有效的解決方案。我們在應用程式中安裝業務和應用或者功能模組將資料庫進行分離,不同的模組對應不同的資料庫或者表,再按照一定的策略對某個頁面或者功能進行更小的資料庫雜湊,比如使用者表,按照使用者ID進行表雜湊,這樣就能夠低成本的提升系統的效能並且有很好的擴充套件性。sohu的論壇就是採用了這樣的架構,將論壇的使用者、設定、帖子等資訊進行資料庫分離,然後對帖子、使用者按照板塊和ID進行雜湊資料庫和表,最終可以在配置檔案中進行簡單的配置便能讓系統隨時增加一臺低成本的資料庫進來補充系統性能。
4. 圖片伺服器分離
大家知道,對於Web伺服器來說,不管是Apache、IIS還是其他容器,圖片是最消耗資源的,於是我們有必要將圖片與頁面進行分離,這是基本上大型網站都會採用的策略,他們都有獨立的圖片伺服器,甚至很多臺圖片伺服器。這樣的架構可以降低提供頁面訪問請求的伺服器系統壓力,並且可以保證系統不會因為圖片問題而崩潰,在應用伺服器和圖片伺服器上,可以進行不同的配置優化,比如apache在配置ContentType的時候可以儘量少支援,儘可能少的LoadModule,保證更高的系統消耗和執行效率。
5. 映象
映象是大型網站常採用的提高效能和資料安全性的方式,映象的技術可以解決不同網路接入商和地域帶來的使用者訪問速度差異,比如ChinaNet和EduNet之間的差異就促使了很多網站在教育網內搭建映象站點,資料進行定時更新或者實時更新。
自動把整個資料庫或其中的關鍵資料複製到另一個磁碟上,每當主資料庫更新時,DBMS會自動把更新後的資料複製過去,即DBMS自動保證映象資料與主資料的一致性。
出現介質故障時,可由映象磁碟繼續提供資料庫的可用性,同時DBMS自動利用映象磁碟進行資料庫的修復,不需要關閉系統和重灌資料庫副本。
資料庫映象還可以用於併發操作。即當一個使用者對資料庫加排他鎖修改資料時,其他使用者可以讀映象資料庫,而不必等待該使用者釋放鎖。
資料庫映象是通過複製資料實現的,頻繁地複製自然會降低系統執行效率,因此在實際應用中使用者往往只選擇對關鍵資料映象,如對日誌檔案映象,而不是對整個資料庫進行映象。
6. 快取
Apache提供了自己的快取模組,也可以使用外加的Squid模組進行快取,這兩種方式均可以有效的提高Apache的訪問響應能力。在使用web語言開發的時候,各種語言基本都有自己的快取模組和方法。
7. HTML靜態化
靜態化的html頁面效率最高、消耗最小,所以我們可以儘可能使我們的網站上的頁面採用靜態頁面。但是對於大量內容並且頻繁更新的網站,我們無法全部手動去挨個實現,於是出現了我們常見的資訊釋出系統CMS,像我們常訪問的各個門戶站點的新聞頻道,甚至他們的其他頻道,都是通過資訊釋出系統來管理和實現的,資訊釋出系統可以實現最簡單的資訊錄入自動生成靜態頁面,還能具備頻道管理、許可權管理、自動抓取等功能。
除了門戶和資訊釋出型別的網站,對於互動性要求很高的社群型別網站來說,儘可能的靜態化也是提高效能的必要手段,將社群內的帖子、文章進行實時的靜態化,有更新的時候再重新靜態化也是大量使用的策略,像Mop的大雜燴就是使用了這樣的策略,網易社群等也是如此。
同時,html靜態化也是某些快取策略使用的手段,對於系統中頻繁使用資料庫查詢但是內容更新很小的應用,可以考慮使用html靜態化來實現,比如論壇中論壇的公用設定資訊,這些資訊目前的主流論壇都可以進行後臺管理並且儲存再資料庫中,這些資訊其實大量被前臺程式呼叫,但是更新頻率很小,可以考慮將這部分內容進行後臺更新的時候進行靜態化,這樣避免了大量的資料庫訪問請求。
8. CDN加速技術
CDN的全稱是內容分發網路。其是通過在現有的Internet中增加一層新的網路架構,將網站的內容釋出到最接近使用者的網路“邊緣”,使使用者可以就近取得所需的內容,提高使用者訪問網站的響應速度。
CDN網路是在使用者和伺服器之間增加Cache層,主要是通過接管DNS實現,將使用者的請求引導到Cache上獲得源伺服器的資料。快取伺服器從實際IP地址得得到內容以後,一方面在本地進行儲存,以備以後使用,另一方面把獲取的資料返回給客戶端,完成資料服務過程。