大型網(wǎng)站架構設計是一個循序漸進的過程,圍繞“性能、可用性、伸縮性、擴展性、安全性”展開,下面是個人關于網(wǎng)站架構方面的一些總結,不到之處請大家多多批評。
前端
CDN加速:CSS/JS/圖片等靜態(tài)資源使用CDN加速,設置緩存時間、Referer限制(防盜鏈)等進行流量優(yōu)化;
減少HTTP請求:將CSS/JS/圖片等靜態(tài)資源合并,可以利用webpack等前端構建工具進行處理
啟用瀏覽器緩存和文件壓縮:壓縮圖片、JS/CSS混淆壓縮、Web服務器開啟Gzip壓縮&設置文件expire緩存時間;
異步加載:動態(tài)接口通過Ajax異步加載,減少網(wǎng)絡請求(可以通過JSONP或者設置Access-Control-Allow-Origin進行跨域);
使用驗證碼:使用短信或圖像驗證碼,提高驗證碼的復雜度及多樣性,緩解羊毛黨帶來的流量沖擊;
減少Cookie傳輸:Cookie包含在每次請求和響應中,太大的Cookie會嚴重影響數(shù)據(jù)傳輸,例如針對CDN采用獨立域名,可以減少靜態(tài)資源加載攜帶Cookie信息;
緩存
關于緩存,永遠要記住二八定律:80%的業(yè)務訪問集中在20%的數(shù)據(jù)上。將熱點數(shù)據(jù)進行緩存,可以降低網(wǎng)絡I/O和磁盤I/O,極大提升響應速度,除了前端本地資源緩存外,服務端緩存常見做法如下:
頁面靜態(tài)化:緩存整個頁面,或者局部緩存,減少數(shù)據(jù)讀取和運算頻率;
數(shù)據(jù)緩存:充分利用NoSQL數(shù)據(jù)庫,例如memcached、redis、mongodb等,可以部署集群或分布式緩存,提高緩存命中率,減少數(shù)據(jù)訪問的壓力,可以進行緩存預熱、預先加載熱點數(shù)據(jù),同時需要防止緩存穿透;
消息隊列
異步解耦:利用Httpsqs、RabbitMQ、Kafka等隊列或消息中間件,將耗時/非即時性操作通過隊列進行異步處理,提高服務器響應速度,以此降低對資源的并發(fā)訪問。遵循一個原則:任何可以晚點做的事情都應該晚點再做。
削峰填谷:由于流量是波動變化的,高峰和低谷差距很大,可以將一些操作存儲到MQ隊列中,消費端通過拉取的方式,并且拉去速度有消費端來控制,則就可以控制流量趨于平穩(wěn),達到了削峰填谷的目的,或者說起到了流控的目標。
數(shù)據(jù)庫
使用緩存后,大部分數(shù)據(jù)讀取操作都不用通過數(shù)據(jù)庫完成,但是在緩存不命中、緩存過期和全部的寫操作時需要訪問數(shù)據(jù)庫。當用戶達到一定規(guī)模后,數(shù)據(jù)庫會因為負載壓力過高而成為瓶頸,常見做法如下:
讀寫分離:利用Mysql主從復制機制搭建讀寫分離集群,在客戶端實現(xiàn)或者服務端利用中間件(例如MyCAT)實現(xiàn)讀寫分離;
分庫分表:針對不同業(yè)務類型,進行分庫,部署到不同服務器上,減少單服務器壓力,同時針對大表,根據(jù)一定條件(如用戶ID取模、ID范圍)進行水平分表,減少單表讀寫壓力;
數(shù)據(jù)庫連接池:充分利用連接復用,解決數(shù)據(jù)庫連接過程需要占用資源,影響響應速度等問題,PHP本身沒有連接池,可以利用第三方框架實現(xiàn)(例如SMProxy);
硬件優(yōu)化:利用磁盤陣列(RAID)提升數(shù)據(jù)可靠性,資金充足的話可以換SSD硬盤;
負載均衡
業(yè)務拆分:根據(jù)URL拆分業(yè)務,分發(fā)流量到不同的服務器組,防止單一功能模塊卡住,而影響整個業(yè)務,主要遵循SOA的架構思路,將業(yè)務模塊打散(雞蛋不要放在一個籃子里面)
反向代理負載均衡:充分利用Nginx/Haproxy/LVS反向代理負載均衡,搭建服務器集群,提升并發(fā)處理能力;
DNS負載均衡:DNS解析可以依據(jù)不同網(wǎng)絡運營商、地區(qū)進行分別解析、從而實現(xiàn)DNS層面負載均衡;
代碼
多線程:充分利用多CPU優(yōu)勢進行數(shù)據(jù)批處理
鎖:在高并發(fā)情況下,對統(tǒng)一資源讀寫訪問容易出現(xiàn)臟讀、幻讀,這個時候需要對核心資源枷鎖,利用Redis或者Zookeeper等可以實現(xiàn)分布式鎖;
設計模式:充分利用設計模式,實現(xiàn)邏輯解耦、分層和資源服用,例如單利模式、觀察者模式等;
數(shù)據(jù)結構和算法:好的數(shù)據(jù)結構和算法可以給程序性能帶來很大提升、例如鏈表查找、快速排序等;
垃圾回收:良好的編程習慣,例如即時清理內(nèi)存占用大的變量、避免操作的數(shù)據(jù)量大等都可以避免出現(xiàn)內(nèi)存泄漏(OOM)的情況發(fā)生。
SQL查詢優(yōu)化:SQL執(zhí)行效率一般是影響響應速度的關鍵,可以開啟SQL慢查詢?nèi)罩荆瑢?zhí)行效率慢的SQL語句進行優(yōu)化;
GIT多分支:良好的分支管理對于CI/CD、版本測試有很好的作用,建議參考git-flow進行日常Git協(xié)作。
日志:統(tǒng)一的日志輸出標準,有利于進行數(shù)據(jù)追蹤和問題排查。
冗余
數(shù)據(jù)定期備份:定期全量備份+主從同步增量備份,例如MySQL/Redis主從復制進行增量備份、Mysqldump全量備份、Redis利用RDB或者AOF進行備份;
集群:一定數(shù)量的備用服務器,可以保障系統(tǒng)的高可用,防止單點故障,可以結合Keepalived+LVS/HAProxy/Nginx等實現(xiàn)數(shù)據(jù)庫/Web服務器/緩存/消息中間件高可用集群;
自動化
CI/CD:利用成熟的CI/CD機制實現(xiàn)自動化測試、代碼檢測,自動化發(fā)布,例如可采用Git+Jenkins+Docker搭建CI/CD工作流。
自動化部署:針對超過30臺的服務器部署,可以采用ansible進行批量管理
自動監(jiān)控/報警:監(jiān)控用戶行為日志、服務器日志等 ,可結合zabbix+ELK進行實施;
自動降級和資源調度:微服務架構范疇,作者也在努力學習中。
安全
二次驗證:充分手機驗證/人臉識別進行二次驗證,保障操作的真實性;
web防火墻:傳統(tǒng)防火墻僅限于包過濾,網(wǎng)絡和端口地址轉換(NAT)和VPN等功能。它根據(jù)端口,協(xié)議和IP地址做出決策;Web防火墻(WAF)則提供了HTTP/HTTPS訪問請求監(jiān)控、自定義過濾規(guī)則、Web攻擊防護、安全合規(guī)等功能;可以利用阿里云等提供的WAF服務或者基于Nginx+lua等實現(xiàn)的類似API網(wǎng)關實施類似功能;
內(nèi)外網(wǎng)隔斷:暴露出來的IP和端口越少,安全系數(shù)越高;例如數(shù)據(jù)庫服務、緩存服務、中間件等盡量只允許內(nèi)外訪問,如果確實需要可以通過路由轉發(fā)或反向代理實現(xiàn);
數(shù)據(jù)加密:充分利用非對稱加密,例如啟用https, rsa加密等,保障數(shù)據(jù)傳輸?shù)陌踩?
網(wǎng)絡攻擊:需要防止DDOS攻擊、XSS攻擊、SQL注入、CSRF等,常見手段CDN加速、高仿IP、Linux內(nèi)核優(yōu)化、數(shù)據(jù)輸入輸出過濾、Referer限制、表單添加隨機token/驗證碼等;
信息安全:對于垃圾信息、敏感信息可以采用第三方解決方案(例如網(wǎng)易云盾、百度AI等)對文本、圖片、音頻、視頻等進行過濾和審核。
總結
架構的演變,遵循著”分層->分割->分布式”的思路不斷深入,是隨著業(yè)務的增長,不斷積累經(jīng)驗、優(yōu)化、改良的過程。業(yè)務發(fā)展是架構發(fā)展的主要力量,架構的核心價值是服務業(yè)務的靈活發(fā)展。所有的架構設計必須以了解業(yè)務特點作為出發(fā)點,需要考慮互聯(lián)互通、負載均衡、網(wǎng)絡、開發(fā)、緩存、存儲、數(shù)據(jù)庫、安全性等層面,這些層面看似一個整體,任何一個環(huán)節(jié)出問題都可能導致整個崩潰,所以一個高可用、高并發(fā)的平臺還少不了監(jiān)控、開發(fā)、運維等角色通力協(xié)作。
大型網(wǎng)站的架構設計,作者也在不斷的學習和實踐,特別是微服務架構和K8S的運用,必然是未來主流的架構思想,作者正在努力學習。關于本文內(nèi)容,歡迎大家積極補充。
本文由網(wǎng)上采集發(fā)布,不代表我們立場,轉載聯(lián)系作者并注明出處:http://m.zmlzfb.cn/gouwuzhinan/202210/48657.html