大規模web服務開發技術(轉)

前段時間趁空把《大規模web服務開發技術》這本書看完了,今天用一下午時間重新翻了一遍,把其中的要點記了下來,權當復習和備忘。由于自己對數據壓縮、全文檢索等還算比較熟,所以筆記內容主要涉及前5章內容,后面的零星記了一些。本文可能對如下人士比較有幫助:1、對這本書有興趣,但對內容存疑的;2、對大規模Web服務有一定經驗的,可對照著查漏補缺。

Hatena的規模(20104)

  • 注冊用戶150wUU1900w/
  • 請求數:幾十億/
  • 繁忙時流量:850Mbps(不含圖像)
  • 硬件(服務器)600臺,通過虛擬化技術,主機超過1300
  • 日志每天幾GB級別,數據庫GBTB級別

系統增長的戰略

  • 最小化開端、預見變化的管理和設計

平衡效率和質量

  • 開會、規范化、文檔、敏捷等

GB級別(千萬)的文本數據庫,不用索引,一句select查詢200s也未能執行完

內存和硬盤的速度差異

  • 尋址:前者是后者的10w100w
  • 傳輸速度(總線):前者——7.5G/s,后者——58M/s

找尋單機瓶頸(用足單機的性能,不要推測,要測量)

  • sarvmstat查看是CPU問題還是IO問題
  • 若是CPU問題
    • topsar查看是系統進程還是用戶程序
    • ps查看進程狀態和cpu使用情況,確定問題進程
    • straceoprofile找出程序或進程的具體問題所在
  • 若是IO問題
    • 發生頻繁頁交換--->內存不足
      • ps查看程序所用內存
      • 能否改善程序,減少內存占用
      • 不行增加硬件或分布式
    • 若無,則可能是緩存的內存不夠
      • 增加內存
      • 不行就增加機器,分布式

CPU擴展比較方便,但IO負載的擴展比較困難

  • 查看實際負載:top結果中的load average1分鐘?5分鐘?15分鐘)
  • 查看是IO負載過高還是CPU負載過高:sar -P(多核)

?

處理大規模技術的重點

  • 盡量在內存中進行,可實現分布式,利用局部性
  • 算法的復雜度,O(n) --> O(logn)有質的飛躍
  • 數據壓縮和檢索技術

緩存機制

  • 頁面緩存(page cache
    • 現代操作系統均采用虛擬內存
    • 內核分配過的內存會盡量留下來,下次無需訪問磁盤,即頁面緩存
    • 操作系統以頁為單位緩存,即虛擬內存的最小單位
    • 增加內存可提高緩存的命中率,降低IO負載
  • sar命令
    • sar -r?即可查看當前的內存狀態(kbbuffered緩存使用的物理內存大小)
    • sar? 1 3?一秒1次,總共3
    • sar -u?查看CPU使用率
    • sar -q?查看平均負載
    • sar -r?查看內存使用情況

降低IO負載的策略

  1. 提高緩存,即加內存
  1. 擴展到多臺服務器
  1. 2實際可能未提高緩存命中率(每臺機器的數據不變),需要切分(Partition)數據

切分(Partition)——利用局部性的分布式

  • RDBMS的表為單位
  • 從數據中間切分
    • a-c服務器1d-f服務器2……
    • 一致性哈希
  • 按用途將系統分成不同的“島”
    • 爬蟲
    • 圖像API
    • 一般訪問

以頁面緩存為基礎的基本運維規則

  • 操作系統啟動時不要馬上投入生產環境,要先預熱,即讀一遍所有文件
  • 性能測試要在緩存優化后進行

?

數據庫橫向擴展策略

靈活應用操作系統緩存

  • 盡量讓數據庫大小小于物理內存
  • 考慮表的結構設計對數據庫大小的影響

建立索引

  • B+
  • 提高搜索效率(logn),改善磁盤尋道次數
  • MySQLexplain命令幫助查看索引是否有效

MySQL的分布式

  • master/slave設計(master更新,slave讀)
    • 查詢可以擴展(slave
    • master無法擴展(數據一致性)
      • Web應用大多數情況下90%都是讀取查詢
      • master的負載可通過分庫分表或更換實現方法來解決

MySQLPartition

  • 將聯系不緊密的表放在不同機器上
  • 避免對不同機器上表進行JOIN操作
    • 使用INNER JOINwhere...in…
    • 使用自定義的ORM
  • Partition的代價
    • 運維變得復雜,故障率上升,成本上升
  • 實現冗余化最少需要多少臺機器
    • 4臺——1master3slave
    • 3slave中,一臺用于提供持續服務,一臺可能會故障,最后一臺用于故障后復制

?

Web服務的基礎設施重視的三點

  1. 低成本、高效率
    • 不應追求100%可靠性
  1. 設計很重要
    • 可擴展性和響應時間
  1. 開發速度很重要
    • Web服務經常添加或更改功能,需為服務提供靈活的資源

?

一臺服務器能處理的流量極限

  • Hatena標準服務器:4CPU8G內存;
  • 性能:繁忙時每分鐘幾千請求
  • 4CPU*232G內存
    • 100w~200wPV/

調優

  • 掌握負載
    • 服務器監控工具

?

冗余性與系統穩定性

master的冗余化

  • multi-master
    • 通常有兩臺服務器,組成Active/Standby結構
    • 一臺是Active的,另一臺Standby
    • 兩臺服務器互為slave,一方的寫入數據傳入另外一方,雙向replication
    • Standby通過VRRP協議發現Active停機,則Standby自動提升為Active,變成新的master
    • Active服務器有個虛擬ip,將此ip分配給哪臺機器,哪臺機器就是Activemaster
    • 缺點
      • 還是有不一致的風險

系統的穩定性

  • 資源應都保留一定余量,只用到70%左右
  • 去除不穩定因素(盡量自動化處理)
    • 規定SQL負載上限
    • 減少內存泄露,遇到可自動重啟
    • 異常行為的自律控制
      • 自動DOS判斷
      • 自動重啟
      • 自動終止耗時查詢

?

虛擬化技術

  • 好處
    • 可擴展性
      • 將額外開銷降至最低
      • 動態遷移
    • 性價比
      • 提高資源利用率
      • 提高運維的靈活程度
        • 軟件層面的主機控制
    • 高可用性
      • 環境隔離
  • Hatena的虛擬化應用
    • XenCentOS 5.2Xen 3.0.3+?本地磁盤構建LVM
    • HyperVisor替代IPMI
    • 使用準虛擬化(ParaVirtualization
    • 控制資源消耗
      • 負載過高時警告
      • 調整負載
    • 檢測工具:monit
    • 提高資源利用率
      • CPU空閑?--> Web服務器
      • IO空閑?-->?數據庫服務器
      • 內存空閑?-->?緩存服務器
      • 避免消耗傾向相同的組合在一起
    • 虛擬化的額外開銷
      • CPU2%~3%
      • 內存性能:10%
      • 網絡性能:50%
      • IO性能:5%

SSD的壽命

  • 損耗程度指標:S.M.A.R.T值中的E9Media Wearout Indicator---> smartctl命令
  • Hatena寫入最頻繁的SSD用了9個月左右

?

網絡的分界點

  • 1Gbps,即30wpps,是PC路由器的極限(1Gbps是千兆以太網的界限,30wppsLinux內核的極限)
    • 對策:多個PC路由,購買昂貴成品路由
  • 500臺主機,是子網、ARP表的極限
    • 對策:對網絡進行層次化

?

RDBMS還是k-v存儲

  • 判斷依據
    • 平均數據大小
    • 最大數據大小
    • 新數據增加頻率
    • 更新頻率
    • 刪除頻率
    • 訪問頻率
  • MyISAM vs. InnoDB
    • MyISAM
      • 優點
        • 未經updatedelete的表也能快速insert
        • 啟動、停止十分迅速
        • 表移動、改名稱可直接從文件系統中操作
      • 缺點
        • 異常停止可能會損壞表
        • 不支持事務
        • updatedeleteinsert(追加數據之外)會鎖表,在更新較多的應用中性能不好
      • 適合場景
        • 只有數據追加
        • 使用SELECT COUNT(*)
    • InnoDB
      • 優點
        • 支持事務
        • 異常停止恢復
        • 數據更新時執行行鎖定
      • 缺點
        • 啟動、停止慢
        • 表操作完全通過數據庫
      • 適合場景
        • 更新頻率高
        • 需要事務
  • 分布式k-v
    • memcached
    • TokyoTyrant

?

緩存系統

  • Squid
    • 用作HTTPHTTPSFTP等多種(反向)代理
    • 訪問控制、認證功能
  • Varnish
    • 高性能HTTP加速器
    • 靈活的設置語言
    • 基本完全在內存中執行
    • 速度比Squid
  • nginxpound……
  • 緩存服務器上線時注意
    • 兩臺負載均衡時,一臺故障會導致另一臺無法承受負載
      • 備足服務器
    • 即使備足服務器也要注意
      • 新服務器(或剛啟動)要預熱,流量從小到大慢慢增大

轉載于:https://www.cnblogs.com/qq78292959/archive/2012/12/27/2835930.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376967.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376967.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376967.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IO多路復用的三種機制Select,Poll,Epoll

IO多路復用的本質是通過系統內核緩沖IO數據讓單個進程可以監視多個文件描述符,一旦某個進程描述符就緒(讀/寫就緒),就能夠通知程序進行相應的讀寫操作。 select poll epoll都是Linux提供的IO復用方式,它們本質上都是同步IO,因為它…

qt中按鈕貼圖

一.QT之QPushButton按鈕貼圖 二.QT之QToolButton按鈕貼圖 一.QT之QPushButton按鈕貼圖具體操作流程 1. Qt Designer中拖入一Tool Button 2. 選擇圖標的圖片放入工程目錄下,如放在Resources內 3. 雙擊工程的Resource Files下的qrc文件,如圖 4. 在彈出的窗…

Ubuntu手動編譯gVim7.3修復終端啟動時與ibus的沖突

個bug伴隨著Ubuntu/ibus的升級苦憋已久,癥狀為終端啟動gvim時卡死,gvim -f可以緩解此問題,但偶爾還是要發作,況且每次末尾托個&也不方便。其實新版gvim已經修復此bug,不過ubuntu安裝包一直沒更新,那我們…

Android Activity類講解(一)

--by CY[kotomifigmail.com] 1.protected void onCreate(Bundle savedInstanceState) { throw new RuntimeException("Stub!");   } 當創建一個Activity時,系統會自動調用onCreate方法來完成創建工作.該創建工作包括布…

Mysql的undo、redo、bin log分析

目錄關于undo log關于redolog關于binlog一個事務的提交流程undo log :記錄數據被修改之前的樣子 redo log:記錄數據被修改之后的樣子 bin log:記錄整個操作。 關于undo log 關于undo log: 在執行一條涉及數據變更的sql時,在數據…

typedef 字符串_typedef在C中使用字符數組(定義別名來聲明字符串)的示例

typedef 字符串Here, we have to define an alias for a character array with a given number of maximum characters length to read strings? 在這里,我們必須為具有給定最大字符長度數的字符數組定義別名,以讀取字符串 ? In the below-…

最小堆實現代碼

參考算法導論、數據結構相關書籍&#xff0c;寫得最小堆實現的源代碼如下&#xff1a; 1 //2 //--最小堆實例3 //4 5 #include <iostream>6 #include <vector>7 #include <string>8 using namespace std;9 10 template<typename Comparable>11 class m…

非常好的在網頁中顯示pdf的方法

今天有一需求&#xff0c;要在網頁中顯示pdf&#xff0c;于是立馬開始搜索解決方案&#xff0c;無意中發現一個非常好的解決方法&#xff0c;詳見http://blogs.adobe.com/pdfdevjunkie/web_designers_guide。 其實就光看這個網站也足夠了&#xff0c;http://www.pdfobject.com/…

Redis字典實現、Hash鍵沖突以及漸進式rehash

本筆記參考《Redis設計與實現》 P24~ 37 目錄Redis字典實現哈希表節點結構哈希表結構字典哈希算法解決hash沖突rehash漸進式hashRedis字典實現 哈希表節點結構 typedef struct dictEntry {// 鍵void *key;// 值 : 可以是一個指針&#xff0c;或者是一個uint64/int64 的整數un…

Java線程類void setContextClassLoader(ClassLoader loader)方法,帶示例

線程類void setContextClassLoader(ClassLoader loader) (Thread Class void setContextClassLoader(ClassLoader loader)) This method is available in package java.lang.Thread.setContextClassLoader(ClassLoader loader). 軟件包java.lang.Thread.setContextClassLoader(…

JPA概要

本文最新版已更新至&#xff1a;http://thinkinside.tk/2012/12/30/JPA.html JPA定義了Java ORM及實體操作API的標準。本文摘錄了JPA的一些關鍵信息以備查閱。 如果有hibernate的基礎&#xff0c;通過本文也可以快速掌握JPA的基本概念及使用。 Table of Contents 1 JPA概述2 實…

如何配置能讓fiddler抓去https的請求?

1、打開fiddler&#xff0c;>>Tools>>Fiddler Options&#xff0c; 打開如圖所示的HTTPS配置項&#xff1a;點擊Export Rppt Certifica to Desktop :桌面上多了一個證書&#xff1a;下面就是將證書導入&#xff1a;點擊開始-運行&#xff0c;輸入&#xff1a;mmc,…

Redis對象的refcount與lru屬性(內存回收、對象共享、空轉時長)

本筆記參考《Redis設計與實現》 P84~P88 內存回收 Redis在對象系統中使用reference counting技術實現了內存回收機制。程序可以通過跟蹤對象的引用計數信息&#xff0c;在適當的時候自動釋放對象并進行內存回收。 typedef struct redisObject {// ...// 引用計數int refcoun…

【閑聊】Baidu Map,excellent !!!Diaoyv island is China 's

【釣魚島】釣魚島是中國的&#xff01;Diaoyu Islands are Chinas! 釣魚島は中國のアール! ————————————youngLaker轉載于:https://www.cnblogs.com/younglaker/archive/2012/12/31/2840190.html

08:vigenère密碼_密碼技術:Vigenére密碼,Playfair密碼,Hill密碼

08:vigenre密碼1)Vigenre密碼 (1) Vigenre Cipher) This technique is an example of Polyalphabetic Substitution technique which uses 26 Caesar ciphers make up the mono-alphabetic substitution rules which follow a count shifting mechanism from 0 to 25. That is,…

Redis的RDB文件與AOF文件

本筆記參考《Redis設計與實現》 P118 ~ P150 RDB文件 1、RDB文件用于保存和還原Redis服務器所有數據庫中的所有鍵值對數據 2、SAVE命令由服務器進程直接執行保存操作&#xff0c;該命令會阻塞服務器 3、BGSAVE命令由子進程執行保存操作&#xff0c;不會阻塞服務器 注意此時服…

eclipse擴容

eclipse擴容 -vmD:/jdk-6u17-windows-i586/jdk1.6.0_17/bin/javaw.exe-startupplugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar-nlen_US--launcher.libraryplugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.200.v20120913-144807-productorg.eclipse…

node oauth2驗證_如何設置和使用護照OAuth Facebook身份驗證(第2部分)| Node.js

node oauth2驗證In my last article (How to set up and use passport OAuth Facebook Authentication (Section 1) | Node.js), we looked at another form of authentication called the OAuth authentication which involves sign in or signup using social media. 在我的上…

Python and Microsoft Word

國外網站看到的文章&#xff1a;Accessing Microsoft Word with Python follows the same syntax that we used for Excel. Let’s take a quick look at how to access Word.from time import sleep import win32com.client as win32RANGE range(3, 8)def word():word win32…

東哥讀書小記 之 《一個廣告人的自白》

掰著指頭一算&#xff0c;端午假期確實完成不少事情&#xff0c;過的太尼瑪充實鳥&#xff1a;去健身房2小時&#xff0c;且老夫的平板支撐終于能堅持超過1分鐘&#xff0c;普大喜奔有木有&#xff1b;給合租的室友買蛋糕過了個生日&#xff1b;去 去哪兒 參加W3ctech的技術交流…