構建高性能WEB站點筆記三
第10章 分布式緩存
10.1數據庫的前端緩存區
- 文件系統內核緩沖區,位于物理內存的內核地址空間,除了使用O_DIRECT標記打開的文件以外,所有對磁盤文件的讀寫操作都要經過它,所以也可看做是磁盤的前端設備。又稱作 頁高速緩沖
- 讀緩沖區 保存最近系統從磁盤上讀取的數據。
- 寫緩沖區 主要在于減少磁盤的物理寫操作。通過將多次寫操作的指令累積起來,使用一次物理磁頭的移動來完成。
10.2 使用memcached
分布式緩存系統
- key-value memcached使用物理內存作為緩沖區,啟動時候指定分配給緩沖區的內存大小。使用key-value的方式存儲數據,單索引的結構化數據組織形式。
- 數據項過期時間 一旦緩沖區沒有足夠的空間,基于LRU(Least Recently Used)算法。將最近不常訪問的數據項淘汰掉。當然也可以設置過期時間。
- 網絡并發模型
- 作為分布式緩存系統,memcached可以運行在獨立的服務器上,動態內容通過TCP Socket來訪問。
- 對象序列化
- 基于序列化的機制,我們可以將更高層的抽象數據類型轉化為二進制字符串,以便通過網絡進入緩存服務器,同時,讀取這些數據的時候,二級制字符串又可以轉換回原有的數據類型。
10.3 讀操作緩存
都可使用memcached緩存,并且memcacd提供原子遞增操作。
第11章 數據庫性能優化
11.1 狀態報告
show status;
構建高性能web站點。show innodb status;
mysqlreport
11.2 正確使用索引
- 組合索引
- 使用慢查詢分析工具
開啟慢查詢 my.cnf中增加配置,意味著Mysql自動將執行超過1秒的查詢記錄在文件中。
還可以將沒有使用索引的查詢記錄下來long_query_time = 1long-slow-queries = /data/var/mysql_slow.log
log-queries-not-using-indexes
- 索引緩存
11.3 鎖定與等待
查詢的時間開銷包括:查詢本身的計算時間和查詢開始前的等待時間,索引影響的是前者,鎖機制影響的是后者。
- 減少表鎖定時間
- MySQL為MyISAM類型提供了表級別的鎖定。允許多個線程同時讀數據,比如select,它們之間不需要等待,但對于更新操作(update),排斥對當前表的所有其他查詢,包括select查詢。除此之外,更新操作有著默認的高優先級。
- 適合大部分查詢為讀取操作,混合一小部分快速的更新操作。
- 行鎖定
- MySQL為Innodb提供了行鎖的支持。
- 在select和update混合的情況下,行鎖定可以很巧妙的解決讀和寫互斥的問題。
- 行鎖定只是一種邏輯層面的約束,即便是同時擁有updating的狀態,也不能加速update操作的總時間,因為磁盤的物理寫操作最終還是以此進行的。
11.4 事物性表的性能
MySQL的Innodb除了支持行鎖定外,還支持事務,這也是使用Innodb的另一個原因。
web前端性能優化的方法、當然Innodb還有其他特性,比如行鎖定、外鍵以及易于修復。
11.5 使用查詢緩存
將select查詢的結果緩存在內存中,以供下次直接獲取。MySQL采取的機制是,當一個數據表有更新操作,那么涉及這個表的所有查詢緩存都會失效。
11.6 臨時表
MySQL將臨時表創建在磁盤、內存、以及臨時文件中。
11.7 線程池
MySQL采用多線程處理并發的連接,通過mysqlreport中的threads部分,可以看到線程創建的統計結果。
11.8 反范式設計
- 數據庫范式
- 第一范式:指數據庫表的每一列都是不可分割的基本數據項
第二范式:數據庫表中不存在非關鍵字段對任一候選鍵的部分函數依賴,也即所有非關鍵字 段都完全依賴于任意一組候選關鍵字。
2NF的違例只會出現在候選鍵由超過一個字段構成的表中,因為對單關鍵字字段不存在部分依賴問題。web前端性能關注點。第三范式:在第二范式的基礎上,數據表中如果不存在非關鍵字段對任一候選關鍵字段的傳遞函數依賴則符合第三范式
11.9 放棄關系型數據庫
第12章 Web負載均衡
12.2 HTTP重定向
轉移HTTP請求,在Web開發中經常使用它來完成自動跳轉。eg. 用戶登錄成功后跳轉到相應的管理頁面。
順序調度的性能總是比不上隨機調度的性能。
12.3 DNS負載均衡
- 多個A記錄
- 指定域名對應的IP地址。
- DNS的負載均衡實現依賴于DNS服務器的設置。
- 擴展能力和可管理性
- 智能解析
- 根據用戶IP來進行智能解析,DNS服務器在所有可用的A記錄中挑選一個離用戶最近的服務器。
- 故障轉移
- 在檢測到某臺實際服務器發生故障以后,便可以通過動態DNS協議來迅速修復DNS記錄。
- DNS記錄的修改需要一定時間才能生效,例如一個DNS記錄的TTL為3600秒,那么對它的更新最多要過一個小時才會生效。
- 動態DNS,允許DNS服務器開放特定的服務,為我們自動化修改DNS記錄提供了可能。
12.4 反向代理負載均衡
反向代理服務器的核心工作便是轉發HTTP請求,在TCP七層協議的第七層。
- 按照權重分配任務——按能力分配請求到不同的服務器
- 調度器的并發處理能力
- 粘滯會話
- 同一用戶對同一內容的多次請求,可能被轉發到不同的后端服務器。
- 調整策略,讓用戶在一次會話周期內的所有請求始終轉發到一臺特定的后端服務器。這種機制也稱為粘滯會話。——將用戶的IP地址進行Hash計算并散列到不同的后端服務器。
- 利用Cookie機制設計持久化算法。eg. 調度器將某個后端服務器的編號追加到寫給用戶的Cookies中,這樣調度器便在該用戶的隨后的請求中知道應該轉發給哪臺后端服務器。
12.5 IP負載均衡
- DNAT 反向NAT,實際服務器部署在內網網絡,而作為網關的NAT服務器將來自用戶端的數據包轉發給內部網絡的實際服務器。工作在傳輸層
- 它需要修改數據包的目的地址和端口。
- Netfilter/iptables
- 當網絡數據包到達服務器的網卡并且進入某個進程的地址空間之前,先要通過內核緩沖區,這時候內核中Netfilter便對數據包有著絕對的控制權,可以修改數據包,改變路由規則。
- iptables,是工作在用戶空間的一個命令行工具,通過它來對Netfilter的過濾表進行插入、修改或者刪除等操作。
12.6 直接路由
工作在數據鏈路層(第二層)。通過修改數據包的mac地址,將數據包轉發到實際服務器上,并且最重要的是,實際服務器的相應數據包將直接發送給用戶端,而不經過調度器。
- 實際服務器必須直接接入外部網絡。
- IP別名
- 為一個網絡接口(物理網卡,虛擬接口)配置多個IP地址。根據規定,一個網絡接口最多可以設置256個IP別名。
web前端筆記?將實際服務器添加和調度器IP地址相同的IP別名。
12.7 IP隧道
第16章 數據庫擴展
16.1 復制和分離
- 主從復制
- 開啟主服務器上的二進制日志
- 從主服務器和從服務器上分別進行簡單的配置和授權。
- 從服務器定時向主服務器請求最新日志,而主服務器通過一個I/O線程來讀取本地二進制文件,并輸送給從服務器。
- 讀寫分離
- 對于所有的更新才做,必須作用于主服務器上
- 讀操作指向從服務器,寫操作指向主服務器。
- 數據庫反向代理
Mysql Proxy 負責所有請求和相應數據的轉發。
16.2 垂直分區
對于數據庫寫操作頻繁的站點,將不同的數據庫分布到不同的服務器。
16.3 水平分區
將同一數據表中的記錄通過特定的算法進行分離,分別保存在不同的數據表中,從而可以部署在不同的數據庫服務器上。
- 分區算法
- 哈希算法
- 范圍
- 映射關系