最近又把《大型網站技術架構》看了一遍.而中間讀了一本《電腦操作系統》的教材後,感覺對大型網站的技術架構有更深的瞭解。在此結合對這兩本書的理解做一些筆記 傳統的OS(Operator System)有四個基本的功能: a) 進程式控制制 b) 進程同步 c) 進程通信 d) 調度 2.存儲器管理 a) ...
最近又把《大型網站技術架構》看了一遍.而中間讀了一本《電腦操作系統》的教材後,感覺對大型網站的技術架構有更深的瞭解。在此結合對這兩本書的理解做一些筆記
傳統的OS(Operator System)有四個基本的功能:
- 處理機管理:以進程為基本單位,對其創建和撤銷
a) 進程式控制制
b) 進程同步
c) 進程通信
d) 調度
2.存儲器管理
a) 記憶體分配
b) 記憶體保護
c) 地址映射
d) 記憶體擴充
3.設備管理:完成I/O請求.提高CPU和I/O設備的利用率,提高I/O速度.方便用戶使用I/O設備
a) 緩衝 如果在I/O和CPU之間引入緩衝區,則可有效的緩和它倆速度不匹配的矛盾,提高CPU的吞吐量,進而提高系統的吞吐量
b) 設備分配
c) 設備處理:設備處理器又被成為設備驅動程式
4.文件管理
a) 文件存儲空間的管理
b) 目錄管理
c) 文件的讀/寫管理和保護
架構的演變過程
一、起初的網站直接用LAMP(Linux+Apache+MySQL+PHP)部署在一臺伺服器上
這樣會造成:
- 用戶所有的請求都由這台伺服器的多線程處理
- 所有的記憶體都在此伺服器上(記憶體的獲取速度比磁碟讀取快N倍.最好把經常需要讀取的數據放在記憶體中)
- 請求的處理(數據的處理:mysql中的數據都是通過磁碟存取的,這時候務必會涉及I/O處理)
- 用戶上傳的所有文件都在此伺服器上
綜上所述:
- 這台伺服器必須要有足夠多的CPU處理器來同事處理用戶的請求
- 必須有足夠大的記憶體存儲空間
- 磁碟存取的速度必須夠快(例如固態硬碟)
- 硬碟必須足夠大來存儲文件
除此之外,還有一些其他的問題.例如網路寬頻等
如我的博客伺服器上行100k/s ,10個人就沒人10K,2M的圖片就得20秒,如果100人的話..
綜上所述,需對單一伺服器進行分開部署:
- 請求伺服器(多處理器.專門處理用戶的請求)
- 緩存伺服器(記憶體足夠大.用於存儲經常訪問的數據.如用redis)
- 資料庫伺服器(採用固態硬碟)
- 文件伺服器(足夠大的硬碟空間)
通過分開部署.每台伺服器都發揮自己的特長,大大提高了效率
而衡量一個網站的優越性,經常會考慮到一下五點
- 高性能
a) 載入頁面時,將靜態文件部署到CDN第三方供應商伺服器.以減少向伺服器請求資源.
b) 使用緩存.命中資源便立即返回,減少資料庫讀取操作(磁碟讀取數據的速度比緩存慢N倍)
c) 採用分散式.不同業務採用單獨的伺服器分開(避免請求集中化)
d) 進行分散式集群.通過負載均衡演算法把請求分發到集群伺服器中的某台(一般用nginx反向代理伺服器進行集群)
e) 分散式緩存.讓所有的緩存集中在這些專門做緩存的伺服器(如redis)
f) 將資料庫的讀寫分離.(後期業務做大還有分庫的可能)
g) 採用消息隊列(也就是非同步)把次要的事件加到消息隊列不用等待返回結果立即響應用戶.最典型的例子就是12306的訂單郵件提醒,一般買到票後好一段時間後才收到.這就是把郵箱提醒功能加到消息隊列中
2.可用性
a) 對於用戶而言,網站7*24小時可用不間斷.這個是理想狀態,一般來說4個9(99.99%)就差不多了
b) 任意一臺伺服器的宕機都不會造成網站不可用.並且集群伺服器之間有互相備份的功能,任何一臺伺服器宕機後不會影響應用的整體可用或者導致數據丟失
3.可拓展性
a) 當增加功能時只是增加開放介面,而不會對原有的功能產生影響,達到松耦合的效果
b) 增值性業務的拓展.也是不會影響到其他業務
c) 網站可收縮性的主要手段是事件驅動架構和分散式服務
4.可伸縮性
a) 向集群中增加或減少伺服器的時候可以平滑過渡.用戶的請求依然可以高命中.
所以緩存路由演算法非常重要(一般來說會用nginx負載均衡.的用輪詢演算法.像哈希求餘等效果不好)
5.安全性
a) 能夠防禦XSS攻擊
b) 腳本註入的方式
c) 發無效的源地址tcp包