初入探秘:大型網站架構設計與方法總結

陝西優就業發表於2019-11-29

大型網站架構設計是一個循序漸進的過程,圍繞“效能、可用性、伸縮性、擴充套件性、安全性”展開,下面 陝西優就業小編總結了關於網站架構方面的知識,給大家分享一下。

一、前端

CDN加速:CSS/JS/圖片等靜態資源使用CDN加速,設定快取時間、Referer限制(防盜鏈)等進行流量最佳化;

減少HTTP請求:將CSS/JS/圖片等靜態資源合併,可以利用webpack等前端構建工具進行處理;

啟用瀏覽器快取和檔案壓縮:壓縮圖片、JS/CSS混淆壓縮、Web伺服器開啟Gzip壓縮&設定檔案expire快取時間;

非同步載入:動態介面透過Ajax非同步載入,減少網路請求(可以透過JSONP或者設定Access-Control-Allow-Origin進行跨域);

使用驗證碼:使用簡訊或影像驗證碼,提高驗證碼的複雜度及多樣性,緩解羊毛黨帶來的流量衝擊;減少Cookie傳輸:Cookie包含在每次請求和響應中,太大的Cookie會嚴重影響資料傳輸,例如針對CDN採用獨立域名,可以減少靜態資源載入攜帶Cookie資訊;

二、快取

關於快取,永遠要記住二八定律:80%的業務訪問集中在20%的資料上。將熱點資料進行快取,可以降低網路I/O和磁碟I/O,極大提升響應速度,除了前端本地資源快取外,服務端快取常見做法如下:

頁面靜態化:快取整個頁面,或者區域性快取,減少資料讀取和運算頻率;

資料快取:充分利用NoSQL資料庫,例如memcached、redis、mongodb等,可以部署叢集或分散式快取,提高快取命中率,減少資料訪問的壓力,可以進行快取預熱、預先載入熱點資料,同時需要防止快取穿透;

三、訊息佇列

非同步解耦:利用Httpsqs、RabbitMQ、Kafka等佇列或訊息中介軟體,將耗時/非即時性操作透過佇列進行非同步處理,提高伺服器響應速度,以此降低對資源的併發訪問。遵循一個原則:任何可以晚點做的事情都應該晚點再做。

削峰填谷:由於流量是波動變化的,高峰和低谷差距很大,可以將一些操作儲存到MQ佇列中,消費端透過拉取的方式,並且拉去速度有消費端來控制,則就可以控制流量趨於平穩,達到了削峰填谷的目的,或者說起到了流控的目標。

四、資料庫

使用快取後,大部分資料讀取操作都不用透過資料庫完成,但是在快取不命中、快取過期和全部的寫操作時需要訪問資料庫。當使用者達到一定規模後,資料庫會因為負載壓力過高而成為瓶頸,常見做法如下:

讀寫分離:利用Mysql主從複製機制搭建讀寫分離叢集,在客戶端實現或者服務端利用中介軟體(例如MyCAT)實現讀寫分離;

分庫分表:針對不同業務型別,進行分庫,部署到不同伺服器上,減少單伺服器壓力,同時針對大表,根據一定條件(如使用者ID取模、ID範圍)進行水平分表,減少單表讀寫壓力;

資料庫連線池:充分利用連線複用,解決資料庫連線過程需要佔用資源,影響響應速度等問題,PHP本身沒有連線池,可以利用第三方框架實現(例如SMProxy);

硬體最佳化:利用磁碟陣列(RAID)提升資料可靠性,資金充足的話可以換SSD硬碟;

五、負載均衡

業務拆分:根據URL拆分業務,分發流量到不同的伺服器組,防止單一功能模組卡住,而影響整個業務,主要遵循SOA的架構思路,將業務模組打散(雞蛋不要放在一個籃子裡面)

反向代理負載均衡:充分利用Nginx/Haproxy/LVS反向代理負載均衡,搭建伺服器叢集,提升併發處理能力;

DNS負載均衡:DNS解析可以依據不同網路運營商、地區進行分別解析、從而實現DNS層面負載均衡;

六、程式碼

多執行緒:充分利用多CPU優勢進行資料批處理

鎖:在高併發情況下,對統一資源讀寫訪問容易出現髒讀、幻讀,這個時候需要對核心資源枷鎖,利用Redis或者Zookeeper等可以實現分散式鎖;

設計模式:充分利用設計模式,實現邏輯解耦、分層和資源服用,例如單利模式、觀察者模式等;

資料結構和演算法:好的資料結構和演算法可以給程式效能帶來很大提升、例如連結串列查詢、快速排序等;

垃圾回收:良好的程式設計習慣,例如即時清理記憶體佔用大的變數、避免操作的資料量大等都可以避免出現記憶體洩漏(OOM)的情況發生。

SQL查詢最佳化:SQL執行效率一般是影響響應速度的關鍵,可以開啟SQL慢查詢日誌,對執行效率慢的SQL語句進行最佳化;

GIT多分支:良好的分支管理對於CI/CD、版本測試有很好的作用,建議參考git-flow進行日常Git協作。

日誌:統一的日誌輸出標準,有利於進行資料追蹤和問題排查。

七、冗餘

資料定期備份:定期全量備份+主從同步增量備份,例如MySQL/Redis主從複製進行增量備份、Mysqldump全量備份、Redis利用RDB或者AOF進行備份;

叢集:一定數量的備用伺服器,可以保障系統的高可用,防止單點故障,可以結合Keepalived+LVS/HAProxy/Nginx等實現資料庫/Web伺服器/快取/訊息中介軟體高可用叢集;

八、自動化

CI/CD:利用成熟的CI/CD機制實現自動化測試、程式碼檢測,自動化釋出,例如可採用Git+Jenkins+Docker搭建CI/CD工作流。

自動化部署:針對超過30臺的伺服器部署,可以採用ansible進行批次管理

自動監控/報警:監控使用者行為日誌、伺服器日誌等 ,可結合zabbix+ELK進行實施;

自動降級和資源排程:微服務架構範疇,作者也在努力學習中。

九、安全

二次驗證:充分手機驗證/人臉識別進行二次驗證,保障操作的真實性;

web防火牆:傳統防火牆僅限於包過濾,網路和埠地址轉換(NAT)和VPN等功能。它根據埠,協議和IP地址做出決策;Web防火牆(WAF)則提供了HTTP/HTTPS訪問請求監控、自定義過濾規則、Web攻擊防護、安全合規等功能;可以利用阿里雲等提供的WAF服務或者基於Nginx+lua等實現的類似API閘道器實施類似功能;

內外網隔斷:暴露出來的IP和埠越少,安全係數越高;例如資料庫服務、快取服務、中介軟體等儘量只允許內外訪問,如果確實需要可以透過路由轉發或反向代理實現;

資料加密:充分利用非對稱加密,例如啟用https, rsa加密等,保障資料傳輸的安全性;

網路攻擊:需要防止DDOS攻擊、XSS攻擊、SQL隱碼攻擊、CSRF等,常見手段CDN加速、IP、Linux核心最佳化、資料輸入輸出過濾、Referer限制、表單新增隨機token/驗證碼等;

資訊保安:對於垃圾資訊、敏感資訊可以採用第三方解決方案(例如網易雲盾、百度AI等)對文字、圖片、音訊、影片等進行過濾和稽核。

十、總結

架構的演變,遵循著”分層->分割->分散式”的思路不斷深入,是隨著業務的增長,不斷積累經驗、最佳化、改良的過程。業務發展是架構發展的主要力量,架構的核心價值是服務業務的靈活發展。

所有的架構設計必須以瞭解業務特點作為出發點,需要考慮互聯互通、負載均衡、網路、開發、快取、儲存、資料庫、安全性等層面,這些層面看似一個整體,任何一個環節出問題都可能導致整個崩潰,所以一個高可用、高併發的平臺還少不了監控、開發、運維等角色通力協作。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69902581/viewspace-2666214/,如需轉載,請註明出處,否則將追究法律責任。

相關文章