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