本文地址
分享提綱:
1. 概述
2. 知識點
3. 待整理點
4. 參考文檔
1. 概述
1.1)【該書信息】
《構建高性能Web站點》:
-- 百度百科
-- 本書目錄:
-- 下載地址
--【內容簡介】:
《構建高性能Web站點(修訂版)》是暢銷修訂版,圍繞如何構建高性能Web站點,從多個方面、多個角度進行了全面的闡述,幾乎涵蓋了Web站點性能優化的所有內容,包括數據的網絡傳輸、服務器並發處理能力、動態網頁緩存、動態網頁靜態化、應用層數據緩存、分布式緩存、Web服務器緩存、反向代理緩存、腳本解釋速度、頁面組件分離、浏覽器本地緩存、浏覽器並發請求、文件的分發、數據庫I/O優化、數據庫訪問、數據庫分布式設計、負載均衡、分布式文件系統、性能監控等。在這些內容中充分抓住本質並結合實踐,通過通俗易懂的文字和生動有趣的配圖,讓讀者充分並深入理解高性能架構的真相。
--題外話:
這本書,我是在 微信讀書app上看的,感覺很不錯。可以分享想法,有計劃還會買紙質的書,好好研讀。
2. 知識點
1) 【函數追蹤】
Xdebug的另一個重要跟蹤功能便是函數跟蹤,它可以根據程序在實際運行時的執行順序,跟蹤記錄所有函數的執行時間,以及函數調用時的上下文,包括實際參數和返回值。沒錯,這聽起來正是我們迫切需要的。
2) 【聯合索引】
因為一次查詢對於一個數據表只能使用一個索引
3) 【最左前綴】
你一定已經聽說過“最左前綴”這個組合索引的基本原則
4)【數據庫鎖機制】
機制是影響查詢性能的另一個重要因素。當有多個用戶並發訪問數據庫中某一資源的時候,為了保證並發訪問的一致性,數據庫必須通過鎖機制來協調這些訪問。
5) 【第三范式】
第三范式要求在一個數據表中,非主鍵字段之間不能存在依賴關系
6)【不同層的負載均衡】
事實上,在數據鏈路層(第二層)、網絡層(第三層)以及傳輸層(四層)都可以實現不同機制的負載均衡,但有所不同的是,這些負載均衡調度器的工作必須由Linux內核來完成
7) 【獨享帶寬】
這才叫獨享帶寬,它獨享的是路由器的一部分出口帶寬,而不是交換機的帶寬,因為交換機本來就是各個端口獨享帶寬而互不影響。
8) 【中國互聯網】
中國,由中國電信運營的互聯網,也就是我們常說的“中國寬帶互聯網(CHINANET)”,它的骨干網絡核心節點位於北京上地電信數據中心,它通過直接接入包括北京在內的國內8個重要城市節點,進而連接二級網絡,然後層層延伸擴展,一直到周邊城市、IDC、家庭寬帶接入等。
9)【Nmon】
我們使用Nmon工具監視服務器每秒上下文切換次數。Nmon是一個非常不錯的Linux性能監視工具
10) 【Apache多進程模型】
我們知道Apache這種多進程模型的開銷限制了它的並發連接數,但是Apache也有自身的優勢,比如從穩定性和兼容性的角度看,多進程模型的優勢正體現在它相對安全的獨立進程,任何一個子進程的崩潰都不會影響Aapche本身,Apache父進程可以創建新的子進程
11) 【腳本解釋器】
腳本解釋器通常運行在Web服務器的進程中(如Apache-prefork模型的子進程),或者以fastcgi進程的形式獨立運行。
12)【PHP中引入Java】
舉個例子,對於一些PHP開發者來說,要想直接在Web應用程序中引用Java類庫,就得在PHP中加載Java擴展模塊,
13) 【ESI】
ESI是由W3C制定的標准,它的語法非常類似於SSI(Server Side Includes),可以像SSI一樣在網頁中嵌入子頁面,但不同的是,SSI是在Web服務器端組裝內容,而ESI則是在HTTP代理服務器上組裝內容,包括反向代理。
14) 【wordpress】
比如用Wordpress搭建的一個blog,動態內容和數據庫完全可以通過UNIX Socket來建立更加快速的數據交換。
15)【數據庫狀態】
mysql> show status;
mysql> show innodb status;
show processlist命令
比如我們通過dig命令看到www.sina.com.cn指向了16台服務器
16)【索引的數據結構】
索引本身的數據結構(MySQL使用BTree、Hash以及RTree)決定了它們擁有非常高效的查找算法,我們基本上不用擔心這部分的開銷
17) 【創建索引的情況】
一般來說,如果一個字段出現在查詢語句中基於行的選擇、過濾或排序條件中,那麼為該字段建立索引便是有價值的
18)【最左原則】
你一定已經聽說過“最左前綴”這個組合索引的基本原則
19)【鎖定和等待】
機制是影響查詢性能的另一個重要因素。當有多個用戶並發訪問數據庫中某一資源的時候,為了保證並發訪問的一致性,數據庫必須通過鎖機制來協調這些訪問
20)【反向代理nginx】
我們知道反向代理服務器工作在HTTP層面,對於所有HTTP請求都要親自轉
21)【粘滯回話】
我們需要做的就是調整調度策略,讓用戶在一次會話周期內的所有請求始終轉發到一台特定的後端服務器上,這種機制也稱為粘滯會話(Sticky Sessions),要實現它的關鍵在於如何設計持續性調度算法。
22) 【持久性算法】
還可以利用Cookies機制來設計持久性算法,比如調度器將某個後端服務器的編號追加到寫給用戶的Cookies中,這樣調度器便可以在該用戶隨後的請求中知道應該轉發給哪台後端服務器。這樣做可以更加細粒度地追蹤到每一個用戶,試想一下,當有很多用戶隱藏在一個公開IP地址後面時,利用Cookies的持久性算法將顯得更加有效。
23)【最好與本地無關】
在後端服務器上保存Session數據和本地化緩存,的確是一件不明智的事情,它使得後端服務器顯得過於個性化,以至於和整個系統格格不入,如果允許的話,我們應該盡量避免這樣的設計,比如采用分布式Session或者分布式緩存等,讓後端服務器的應用盡量與本地無關,也可更好地適應環境
24)【IP負載均衡】
回憶一下網絡分層模型,事實上,在數據鏈路層(第二層)、網絡層(第三層)以及傳輸層(四層)都可以實現不同機制的負載均衡,但有所不同的是,這些負載均衡調度器的工作必須由Linux內核來完成
25) 【Iptables實現負載均衡】
說到iptables,最多的應用場景就是防火牆了,我幾乎為每台Linux服務器都毫不猶豫地進行iptables防火牆配置
26) 【一個網卡多個IP】
一個網絡接口理所當然地擁有一個IP地址,但是除此之外,我們還可以為它配置更多個IP地址,它們稱為IP別名。這裡的網絡接口可以是物理網卡(如eth0、eth1),也可以是虛擬接口(如回環網絡接口lo)。根據規定,一個網絡接口最多可以設置256個IP別名,沒錯,你可以把一個C類網段的所有IP地址都設置到一個網卡上,理論上沒有任何問題。
你也許已經張大了嘴巴,一個網卡竟然可以設置多個IP地址,並且擁有同樣的MAC地址,沒錯,它們可以很好地工作。
27) 【LVS-DR.DNS-RR】
幸運的是,對於LVS-DR,一旦調度器失效,你可以馬上將LVS-DR切換到DNS-RR模式,這幾乎只需要增加幾條DNS記錄,將域名解析到多台實際服務器的真實IP地址即可。一旦調度器恢復後,你便可以再次修改DNS記錄,將域名僅指向調度器,切換回LVS-DR。
28)【基於IP隧道的請求轉發】
與LVS-DR的原理非常類似,基於IP隧道(IP Tunneling)的負載均衡系統同樣可以用LVS來實現,也稱為LVS-TUN。
29)【共享文件系統】
對於共享文件系統的實現,常用的有NFS(Network File System)和Samba
30)【RPC】
對於傳輸層,RPC服務默認使用了UDP,
31)【SSH】
提到SSH(Secure Shell),大家並不陌生,它是建立在應用層和傳輸層基礎上的安全協議,可以用於傳輸任何數據,我們希望用它來實現文件復制,當然,這屬於主動分發的方式。
32)【實現文件分發的http擴展協議 WebDAV】
WebDAV的設計目的還包括了對於版本控制的支持,還記得Subversion的HTTP工作方式嗎?它便是使用WebDAV來實現的。
33)【更新上級目錄時間】
操作系統本身對於文件的修改並不會自動更新上級目錄的修改時間,一些特定的應用程序會這樣做,比如通過VI編輯某個文件並保存後,你會發現它的所有上級目錄都會自動更新修改時間。那麼,對於文件同步,我們也必須想辦法自己來實現。
34) 【降低開銷,提高擴展】
越是響應數據包遠遠超過請求數據包的服務(如視頻),就越應該降低調度器轉移請求的開銷,也就越能夠提高整體擴展能力,最終也就越依賴於WAN出口帶寬
35)【MogileFS】
MogileFS是一個開源的分布式文件系統,它采用Perl編寫,包括追蹤器、存儲節點,以及一些管理工具,除此之外,追蹤器使用MySQL來存儲分布式文件系統運行中的所有信息。
36)【MySQL主從復制】
我們以MySQL為例,它支持主從復制,配置並不復雜,簡單地說,你只需要做到以下兩點:
● 開啟主服務器上的二進制日志(log-bin)。
● 在主服務器和從服務器上分別進行簡單的配置和授權。
我們知道,MySQL的主從復制是依據主服務器的二進制日志進行的,也就是說主服務器日志中記錄的操作會在從服務器上進行重放,從而實現復制,所以主服務器必須開啟二進制日志,它會自動記錄所有對數據庫產生更新的操作,也包括潛在的更新操作,比如沒有刪除任何實際記錄的DELETE操作。
顯然,這種復制是異步進行
37)【數據庫反向代理】
使用數據庫反向代理
如果你在使用MySQL,那麼可以嘗試MySQL Proxy,它工作在應用程序和MySQL服務器之間,負責所有請求和響應數據的轉發
38)【站點成長】
事實上,很多大規模的站點基本上都經歷了從簡單主從復制到垂直分區,再到水平分區的步驟,這是一個必然的成長過程
39)【分區反向代理】
分區反向代理
還記得前面提到的MySQL Proxy嗎?它幫助應用程序實現了讀寫分離,而在這裡,另一個開源產品Spock Proxy也起到了類似的作用,它可以幫助應用程序實現水平分區的訪問調度,這意味著我們不需要在應用程序中維護那些分區對應關系了。
40) 【Gearman】
Gearman是一個開源產品,它的初衷是用來實現遠程函數調用,這樣一來,它便可以將計算轉移到其他服務器上,而這一切都巧妙地隱藏在它提供的API中
41)【Map/Reduce】
但是存在一定的並行計算框架,我們來看隨後介紹的Map/Reduce。
42)【Nmon】
Nmon是一款工作在服務器本地的實時監控軟件,它可以提供時間間隔為秒的系統監控
43)【監控中心】
當然,我們還需要建立監控中心,對這些狀態數據進行統計和呈現。幸運的是,有很多開源產品可以幫助我們,這裡我們主要以Cacti為例,它完全可以支持剛剛提到的這些系統監控,並且繪制出相應的圖表,便於我們浏覽。
Cacti采用RRDtool作為監控數據的存儲引擎,它是一種專門針對繪制坐標圖而設計的存儲格式,相對於其他存儲結構來說要節省很多存儲空間,這為我們長期監控大量服務器提供
3. 待整理點
4. 參考文檔