前段時間趁空把《大規模web服務開發技術》這本書看完了,今天用一下午時間從新翻了一遍,把其中的要點記了下來,權當複習和備忘。因爲本身對數據壓縮、全文檢索等還算比較熟,因此筆記內容主要涉及前5章內容,後面的零星記了一些。本文可能對以下人士比較有幫助:一、對這本書有興趣,但對內容存疑的;二、對大規模Web服務有必定經驗的,可對照着查漏補缺。nginx
Hatena的規模(2010年4月)web
- 硬件(服務器)600臺,經過虛擬化技術,主機超過1300臺
系統增加的戰略算法
平衡效率和質量數據庫
GB級別(千萬)的文本數據庫,不用索引,一句select查詢200s也未能執行完緩存
內存和硬盤的速度差別服務器
- 尋址:前者是後者的10w到100w倍
- 傳輸速度(總線):前者——7.5G/s,後者——58M/s
找尋單機瓶頸(用足單機的性能,不要推測,要測量)網絡
- 如果CPU問題
- top或sar查看是系統進程仍是用戶程序
- ps查看進程狀態和cpu使用狀況,肯定問題進程
- 用strace或oprofile找出程序或進程的具體問題所在
CPU擴展比較方便,但IO負載的擴展比較困難負載均衡
- 查看實際負載:top結果中的load average(1分鐘 5分鐘 15分鐘)
- 查看是IO負載太高仍是CPU負載太高:sar -P(多核)
處理大規模技術的重點運維
- 算法的複雜度,O(n) --> O(logn)有質的飛躍
緩存機制分佈式
- 頁面緩存(page cache)
- 內核分配過的內存會盡可能留下來,下次無需訪問磁盤,即頁面緩存
- 操做系統以頁爲單位緩存,即虛擬內存的最小單位
- sar命令
- sar -r 便可查看當前的內存狀態(kbbuffered緩存使用的物理內存大小)
下降IO負載的策略
- 提升緩存,即加內存
- 擴展到多臺服務器
- 2實際可能未提升緩存命中率(每臺機器的數據不變),須要切分(Partition)數據
切分(Partition)——利用局部性的分佈式
以頁面緩存爲基礎的基本運維規則
- 操做系統啓動時不要立刻投入生產環境,要先預熱,即讀一遍全部文件
- 性能測試要在緩存優化後進行
數據庫橫向擴展策略
靈活應用操做系統緩存
創建索引
- MySQL的explain命令幫助查看索引是否有效
MySQL的分佈式
- master/slave設計(master更新,slave讀)
- 但master沒法擴展(數據一致性)
- master的負載可經過分庫分表或更換實現方法來解決
MySQL的Partition
- 實現冗餘化最少須要多少臺機器
- 4臺——1臺master,3臺slave
- 3臺slave中,一臺用於提供持續服務,一臺可能會故障,最後一臺用於故障後複製
Web服務的基礎設施重視的三點
- 低成本、高效率
- 設計很重要
- 開發速度很重要
- Web服務常常添加或更改功能,需爲服務提供靈活的資源
一臺服務器能處理的流量極限
調優
冗餘性與系統穩定性
master的冗餘化
- multi-master
- 一般有兩臺服務器,組成Active/Standby結構
- 兩臺服務器互爲slave,一方的寫入數據傳入另一方,雙向replication
- 當Standby經過VRRP協議發現Active停機,則Standby自動提高爲Active,變成新的master
- Active服務器有個虛擬ip,將此ip分配給哪臺機器,哪臺機器就是Active的master
系統的穩定性
虛擬化技術
- Hatena的虛擬化應用
- Xen(CentOS 5.2、Xen 3.0.3)+ 本地磁盤構建LVM
- 用HyperVisor替代IPMI
- 使用準虛擬化(ParaVirtualization)
- 提升資源利用率
- IO空閒 --> 數據庫服務器
- 內存空閒 --> 緩存服務器
- 避免消耗傾向相同的組合在一塊兒
SSD的壽命
- 損耗程度指標:S.M.A.R.T值中的E9(Media Wearout Indicator)---> smartctl命令
網絡的分界點
- 1Gbps,即30wpps,是PC路由器的極限(1Gbps是千兆以太網的界限,30wpps是Linux內核的極限)
RDBMS仍是k-v存儲
- 判斷依據
- 平均數據大小
- 最大數據大小
- 新數據增長頻率
- 更新頻率
- 刪除頻率
- 訪問頻率
- MyISAM vs. InnoDB
- MyISAM
- 優勢
- 未經update、delete的表也能快速insert
- 缺點
- update、delete、insert(追加數據以外)會鎖表,在更新較多的應用中性能很差
緩存系統
- Squid
- 用做HTTP、HTTPS、FTP等多種(反向)代理
- 訪問控制、認證功能
- Varnish
- 高性能HTTP加速器
- 靈活的設置語言
- 基本徹底在內存中執行
- nginx、pound……
- 緩存服務器上線時注意
- 兩臺負載均衡時,一臺故障會致使另外一臺沒法承受負載