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