Web層
- 主體架構可以基於 Struts 1.X/2.X,當然有很多更好的控制層架構供選擇,以快速敏捷為準則吧。
- 抽象出核心庫封裝 控制器和中介層 的操作。
- 在大規模叢集環境下,session複製會引起嚴重的效能問題。考慮用 叢集緩衝 + cookie驗證 代替session實現許可權控制吧。
Cache層
- 配置 Memcache 組成叢集緩衝
- 對 Memcache 用戶端進行封裝
- Memcached 節點群組成池,調用示意:opList (BizName, 策略 ...)
中介層
“中介層”可以理解為基於應用和資料之間的層次。它被設計用來為Web應用提供:資料緩衝 和 對應用透明的資料訪問——即應用不需要考慮資料表拆分的問題。以服務的方式提供對儲存層的高效能調用以及分散式運算。可供選擇的架構:
- ICE
- Hadoop
- 直接基於Memcache開發(減少複雜度,推薦)
儲存
推薦MySQL,理由:免費,經過實踐檢驗,有大量成熟的案例、解決方案、支援人員。
- 小規模:一個 data table 維護儲存伺服器陣列,內容 -> mount ……
- 大規模:Master-Slave模式+MySQL Proxy,實現資料庫讀寫分離。在中介層的封裝下,可做如下擴充,以支援更大規模的資料存取:
- 資料庫/表水平分割,例 User -> User33% + User33% + User34%
- 資料庫/表垂直分割,例 User -> UserBaseInfo + UserAddrInfo
也可考慮使用 LongStore (龍存) 解決方案,由龍存管理存放裝置陣列……
部署
- 劃分子網域名稱,每個子網域名稱一個Web應用程式套件,互不干擾
- 靜態資源(css, js, image ...)使用專門的靜態伺服器
負載平衡
小規模:DNS輪詢。
大規模:F5, 2*X 台F5伺服器,F5是L4/L7層交換器,每台至少可處理200萬串連(與伺服器記憶體有關)。Ngnix是L7層交換,LVS負載平衡也是一種方案
Web中介軟體選擇
- Tomcat - 最高400並發
- Apache - 最高2000並發
- Ngnix - 優於Apache
採用方案:Ngnix + Resin
,理由:
- Resin提供更為快速的servlet引擎 - 選擇Resin。
- gzip問題 - Resin在單獨處理gzip時存在記憶體溢出的隱患,因此要加一層 Ngnix。
- Ngnix 能減少單獨使用Resin時的記憶體佔用 - Resin建立1000個串連使用1000個線程;加Ngnix後,透過其“非同步串連”、“建立長串連”機制使Resin記憶體壓力大大減小。
- Ngnix 針對Linux系統有效能最佳化措施 - 0 Copy, send file ...
因此採用:1 Ngnix + 1 Resin,一對一。
靜態伺服器採用:Squid + Apache, why? because Squid has cache ability ...
新變化
- Nginx從0.7.48版本開始,支援了類似Squid的緩衝功能。這個緩衝是把URL及相關組合當作Key,用md5編碼雜湊後儲存在硬碟上,所以它可以支援任意URL連結,同時也支援 404/301/302 這樣的非200狀態代碼。雖然目前官方的Nginx Web快取服務只能為指定URL或狀態代碼設定到期時間,不支援類似Squid的PURGE指令,手動清除指定快取頁面面,但是,通過一個第三方的Nginx模組,可以清除指定URL的緩衝。
Nginx的Web快取服務主要由proxy_cache相關指令集和fastcgi_cache相關指令集構成,前者用於反向 Proxy時,對後端內容來源伺服器進行緩衝,後者主要用於對FastCGI的動態程式進行緩衝。兩者的功能基本上一樣。最新的Nginx 0.8.31版本,proxy_cache和fastcgi_cache已經比較完善,加上第三方的ngx_cache_purge模組(用於清除指定URL的緩衝),已經可以完全取代Squid。有的網站已經在生產環境使用了 Nginx 的 proxy_cache 緩衝功能超過兩個月,十分穩定,速度不遜於 Squid。在功能上,Nginx已經具備Squid所擁有的Web緩衝加速功能、清除指定URL緩衝的功能。而在效能上,Nginx對多核CPU的利用,勝過Squid不少。另外,在反向 Proxy、負載平衡、健全狀態檢查、後端伺服器容錯移轉、Rewrite重寫、易用性上,Nginx也比Squid強大得多。這使得一台Nginx可以同時作為"負載平衡伺服器"與"Web快取服務器"來使用。以下是配置片段供參考:http<br />{<br /> ...<br /> client_body_buffer_size 512k;<br /> proxy_connect_timeout 5;<br /> proxy_read_timeout 60;<br /> proxy_send_timeout 5;<br /> proxy_buffer_size 16k;<br /> proxy_buffers 4 64k;<br /> proxy_busy_buffers_size 128k;<br /> proxy_temp_file_write_size 128k;<br /> ...<br /> #註:proxy_temp_path和proxy_cache_path指定的路徑必須在同一分區<br /> proxy_temp_path /data0/proxy_temp_dir;<br /> #設定Web緩衝區名稱為cache_one,記憶體緩衝空間大小為200MB,1天清理一次緩衝,硬碟緩衝空間大小為30GB。<br /> proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;<br />}<br />server<br />{<br /> ...<br /> location /<br /> {<br /> #如果後端的伺服器返回502、504、執行逾時等錯誤,自動將請求轉寄到upstream負載平衡池中的另一台伺服器,實現容錯移轉。<br /> proxy_next_upstream http_502 http_504 error timeout invalid_header;<br /> proxy_cache cache_one;<br /> #對不同的HTTP狀態代碼設定不同的緩衝時間<br /> proxy_cache_valid 200 304 12h;<br /> proxy_cache_valid 301 302 1h;<br /> #以網域名稱、URI、參數組合成Web緩衝的Key值,Nginx根據Key值雜湊,儲存緩衝內容到二級緩衝目錄內<br /> proxy_cache_key $host$uri$is_args$args;<br /> proxy_set_header Host $host;<br /> proxy_set_header X-Forwarded-For $remote_addr;<br /> proxy_pass http://backend_server;<br /> expires 1d;<br /> }<br /> #用於清除緩衝,假設一個URL為http://192.168.1.44/test.txt,通過訪問http://192.168.4.44/purge/test.txt就可以清除該URL的緩衝。<br /> location ~ /purge(/.*)<br /> {<br /> #設定只允許指定的IP或IP段才可以清除URL緩衝。<br /> allow 127.0.0.1;<br /> allow 192.168.0.0/16;<br /> deny all;<br /> proxy_cache_purge cache_one $host$1$is_args$args;<br /> }<br /> #副檔名以.php、.jsp、.cgi結尾的Live App程式不緩衝。<br /> location ~ .*/.(php|jsp|cgi)?$<br /> {<br /> proxy_set_header Host $host;<br /> proxy_set_header X-Forwarded-For $remote_addr;<br /> proxy_pass http://backend_server;<br /> }<br />}
同時,對於影響頁面展現的靜態資源,例如:css, js 等可以放在具有優質頻寬的IDC(IDC=互連網資料中心,優質/高速的頻寬也比較貴,正所謂一份價錢一分貨);其他的靜態資源,片等可以放在價格相對低廉的IDC中,以網域名稱區分兩種靜態資源,節省每一分錢。網路拓撲圖
/ Ngnix - 1:1 - Resin
F5 --
/ Squid - 1:n - Apache
監控統計平台
- 業務統計 - 使用者訪問統計
- 軟體效能 - 應用系統監控,例如:請求回應時間……
- 硬體/網路效能 - Ganglia監控
其它要點
- IE瀏覽器對同一網域名稱(包括子網域名稱)只能建立2個串連,串連多了只能排隊……
- 雙F5架構,兩台職能劃分不同,鏡像,心跳接管……
- Raid存放裝置陣列……
- Linux作業系統及其最佳化……