《大规模web服务开发技术》阅读笔记
第5課 大規(guī)模數(shù)據(jù)處理的難點(diǎn) -- 內(nèi)存和磁盤
單臺(tái)Linux服務(wù)器瓶頸分析
1、查看平均負(fù)載
用top、uptime命令查看平均負(fù)載;
1、平均負(fù)載很低,系統(tǒng)吞吐量無法提升 --------->檢查軟件設(shè)置是否異常,網(wǎng)絡(luò)、主機(jī)是否存在故障
2、平均負(fù)載很高,用sar或vmstat命令查看cpu使用率和I/O等待率
2、確認(rèn)CPU、I/O是否存在瓶頸;
>如果是CPU負(fù)載過高:
1、使用sar或top命令確認(rèn)是用戶程序的瓶頸還是系統(tǒng)程序的問題;
2、用ps命令查看可見進(jìn)程的狀態(tài)和CPU使用時(shí)間,進(jìn)一步確認(rèn)問題進(jìn)程;
3、確定進(jìn)程后,使用strace進(jìn)行跟蹤或用oprofile進(jìn)行剖測;
如果是排除程序失控、磁盤、內(nèi)存處于理想狀態(tài),則需要增加服務(wù)器、改善程序邏輯和算法;
>如果是I/O負(fù)載過高:
多半是程序發(fā)出的I/O請(qǐng)求過多導(dǎo)致負(fù)載過高或者是發(fā)生頁面交換導(dǎo)致頻繁訪問磁盤,使用sar或vmstat確認(rèn)交換區(qū)狀態(tài);
如果是發(fā)生頁面交換引起:
1. 用ps確認(rèn)是否有進(jìn)程消耗了大量內(nèi)存
2. 如果是程序問題消耗大量內(nèi)存的,需要改進(jìn)程序;
3. 如果是因?yàn)閮?nèi)存安裝不足,則增加內(nèi)存,無法增加內(nèi)存的情況,需要考慮分布式
如果不是發(fā)生頁面交換引起(可能是用于緩存的內(nèi)存不足):
1.如果增加內(nèi)存可以擴(kuò)大緩存,則增加內(nèi)存;
2.如果增加內(nèi)存還是無法解決問題,則考慮分布式或增加緩存服務(wù)器;
第6課:可擴(kuò)展的要點(diǎn)
CPU負(fù)載的擴(kuò)展(較簡單)
??? 1、增加相同結(jié)構(gòu)的服務(wù)器,通過負(fù)載均衡器來分散;
??? 2、如:web應(yīng)用服務(wù)器、網(wǎng)絡(luò)爬蟲等;
I/O負(fù)載的擴(kuò)展(較復(fù)雜)?
1、借助數(shù)據(jù)庫
2、大規(guī)模數(shù)據(jù)
第7課:處理大規(guī)模數(shù)據(jù)的基礎(chǔ)知識(shí)
處理大規(guī)模數(shù)據(jù)的三個(gè)重點(diǎn):
???? 寫程序的技巧:
??? *? 盡量在內(nèi)存中完成,:將磁盤尋道次數(shù)降到最低;可以實(shí)現(xiàn)分布式,有效利用局部性;
??? * 使用能應(yīng)對(duì)數(shù)據(jù)量增加的算法,例如:線性搜索 -->二叉樹搜索,O(n) -->O(logn)
??? * 有時(shí)可以利用數(shù)據(jù)壓縮和搜索的技術(shù)
處理大規(guī)模數(shù)據(jù)之前的三大前提知識(shí):
??? * 操作系統(tǒng)的緩存
??? * 以分布式為前提應(yīng)用RDBMS時(shí)必須要做的事情
??? * 大規(guī)模環(huán)境中的算法和數(shù)據(jù)結(jié)構(gòu)
第9課:降低I/O負(fù)載的策略
以緩存為前提,降低I/O負(fù)載的策略:
??? * 如果數(shù)據(jù)規(guī)模小于物理內(nèi)存,則全部緩存;
??? * 如果數(shù)據(jù)規(guī)模大于物理內(nèi)存,可以考慮數(shù)據(jù)壓縮(使用數(shù)據(jù)壓縮,在從緩存中讀取時(shí)是否要進(jìn)行解壓,這是否會(huì)增加計(jì)算負(fù)載呢?);
??? * 如果數(shù)據(jù)規(guī)模大于物理內(nèi)存 ,可以就是擴(kuò)展到多臺(tái)服務(wù)器。為分散CPU負(fù)載,只需要簡單增加服務(wù)器,為分散I/O負(fù)載,需要考慮局部性;
??? * 考慮經(jīng)濟(jì)成本的平衡性
linux頁面緩存策略:(只要可能linux就會(huì)把空閑的內(nèi)存用作頁面緩存使用)
??? 1. 從磁盤讀取數(shù)據(jù)
??? 2. 如果數(shù)據(jù)在緩存中不存在且有空閑的內(nèi)存
??? 3. 建立新的緩存
??? 4. 如果沒有空閑內(nèi)存供緩存使用,則替換舊的緩存
??? 5. 進(jìn)程要求分配內(nèi)存時(shí),其優(yōu)先級(jí)高于頁面緩存;
服務(wù)器剛啟動(dòng)時(shí),不要投入生產(chǎn)環(huán)境,因?yàn)榻⒕彺嫘枰獣r(shí)間,如果在沒有緩存的情況下,大規(guī)模的訪問造成頻繁的讀寫磁盤,可能會(huì)引起宕機(jī);啟動(dòng)后要將經(jīng)常使用的數(shù)據(jù)庫文件cat一遍,使其放入緩存中;
如何cat?
第10課:利用局部性的分布式
所謂局部性就是Locality,根據(jù)訪問模式實(shí)施分布式;
我理解是按一定的業(yè)務(wù)規(guī)則將訪問進(jìn)行分流,這樣單臺(tái)服務(wù)器只要保存對(duì)應(yīng)規(guī)則部分的緩存數(shù)據(jù)即可,那么應(yīng)用請(qǐng)求分配由誰來完成呢?是LVS?
常用的局部性分布式技術(shù)是:Partitioning(分區(qū))
簡單的說就是將一個(gè)數(shù)據(jù)庫分割到不同的機(jī)器上,
??? * 最簡單的分割方法:以表為單位分割,比如表A、B在機(jī)器1上,表C、D在機(jī)器2上;分割原則是看表的容量和機(jī)器緩存容量的匹配上;這樣的分割是否意味著不同機(jī)器的表之間必須是弱關(guān)系的,不能有關(guān)聯(lián)的需求?
??? * 有一種分割方法是從數(shù)據(jù)中間進(jìn)行分割,即對(duì)一個(gè)表,比如根據(jù)ID的起始字母:a-c在機(jī)器1,d-f在機(jī)器2等;
??? * 還有一種特別的分割方法是根據(jù)業(yè)務(wù)用途,將數(shù)據(jù)分割成“數(shù)據(jù)島”;例如Hatena BookMark是根據(jù)HTTP請(qǐng)求的User-Agent和URL進(jìn)行分離的,例如:一般用戶分配到島1,部分API請(qǐng)求分配到島2,Google bot、Yahoo!等爬蟲分配到島3;
??? * 使用局部性的分布式,要求應(yīng)用程序做相應(yīng)的修改,同時(shí)存在的問題是:如果需要改變分割粒度,需要將數(shù)據(jù)合并一次后再進(jìn)行分割,比較麻煩;
?
第11課:正確應(yīng)用索引 ----分布式MySQL應(yīng)用的大前提
??? * 在設(shè)計(jì)大數(shù)據(jù)量的表時(shí),盡量緊湊一些,讓記錄盡可能的小,因?yàn)楸斫Y(jié)構(gòu)稍微有錯(cuò)誤,數(shù)據(jù)量就會(huì)以GB的單位遞增;
??? * 要注意表設(shè)計(jì)過程中對(duì)冗余列的處理,如果一個(gè)表包含冗余列,會(huì)浪費(fèi)存儲(chǔ)空間,如果將冗余列分割到另一個(gè)表,也許會(huì)節(jié)省空間(不一定,需要評(píng)估),但同時(shí)也增加了查詢的復(fù)雜度,因此在時(shí)間和空間的取舍上要進(jìn)行衡量;
??? * MySQL中建立索引的數(shù)據(jù)結(jié)構(gòu)就是B樹的變種B+樹,B樹可以通過調(diào)整節(jié)點(diǎn)數(shù)參數(shù)M,使得每個(gè)節(jié)點(diǎn)的大小在4KB,從而使得磁盤尋道次數(shù)和節(jié)點(diǎn)訪問次數(shù)相同;而二叉樹是固定為2個(gè)節(jié)點(diǎn),因此不具備這樣的調(diào)節(jié)能力;
??? * 從理論上,B(+)樹的復(fù)雜度為Olog(n),而線性搜索的復(fù)雜度為O(n)
?
Mysql索引的規(guī)則:
??? * where、order by、group by中指定的列會(huì)使用索引
??? * 何時(shí)索引有效?明確添加的索引、主鍵,UNIQUE約束;
??? * 想同時(shí)應(yīng)用多個(gè)列上的索引,就必須使用復(fù)合索引;
??? * 確認(rèn)索引是否有效的命令:explain
?
第12課:MySQL的分布式 -- 以擴(kuò)展為前提的系統(tǒng)設(shè)計(jì)
MySQL的Replication:
??? * master/slave的架構(gòu);
??? * 查詢發(fā)給slave,更新發(fā)給master;通過ORM來控制;
??? * slave前面放負(fù)載均衡器,如:LVS 、MySQL Proxy,從而將查詢分散到多臺(tái)服務(wù)器上;
Master/Slave的特征:
查詢可以擴(kuò)展,只需增加Slave服務(wù)器即可,但在增加前添加適當(dāng)?shù)膬?nèi)存;
Master無法擴(kuò)展,雖然web應(yīng)用90%以上是讀操作,但如果需要擴(kuò)展,則需要通過對(duì)表進(jìn)行分割或更換實(shí)現(xiàn)方法;
- 進(jìn)行表分割:分散寫入操作,將數(shù)據(jù)文件分散到同一機(jī)器的不同磁盤上或不同的機(jī)器上
- 不使用RDBMS,采用key-value存儲(chǔ)結(jié)構(gòu),如:Tokyo Tyrant、Redis
第13課:MySQL的橫向擴(kuò)展和Partitioning
?以Partitioning為前提的設(shè)計(jì):
例如表entry和表tag是一對(duì)多的關(guān)系,如果要取出包含標(biāo)簽“perl”的書簽,需要使用JOIN查詢,將兩個(gè)表關(guān)聯(lián)。但是如果entry和tag表放在不同的機(jī)器上,MYSQL就無法實(shí)現(xiàn)JOIN(MySQL的FEDERATED表可以實(shí)現(xiàn)),只有通過先查找包含“perl”標(biāo)簽的記錄,再到entry表中根據(jù)eid找對(duì)應(yīng)的entry記錄。因此,JOIN查詢只能在保證表以后不會(huì)被分割到不同機(jī)器上的前提下才能使用。
利用where…in…來避免JOIN
select? url from entry INNER JOIN bookmark on entry.eid = bookmark.eid where bookmark.uid = 169848 limit 5;
=>
select eid from bookmark where uid = 169848 limit 5;
select url from entry where eid in (0,4,5,6,7);
第14課:特殊用途索引----處理大規(guī)模數(shù)據(jù)
問題:當(dāng)數(shù)據(jù)規(guī)模超過RDBMS的處理能力時(shí)怎么辦?
方法:利用批處理操作從RDBMS中提取出數(shù)據(jù),建立索引服務(wù)器之類的,再讓W(xué)EB應(yīng)用程序通過RPC等訪問索引服務(wù)器。
?????
第30課:云 vs 自行構(gòu)建基礎(chǔ)設(shè)施
Amazon EC2 (Amazon Elastic Compute Cloud),是不負(fù)責(zé)儲(chǔ)存的,儲(chǔ)存由S3 (Amazon Simple Storage Service)服務(wù)負(fù)責(zé),所以得有腳本每次重啟時(shí)從S3恢復(fù)數(shù)據(jù)庫
Amazon S3 (Amazon Simple Storage Service)
Google App Engine
Microsoft Windows Azure
?
第31課:層和可擴(kuò)展性
一臺(tái)服務(wù)器的處理能力大概為100萬~200萬PV(page views)/月左右? 4核CPU,8G內(nèi)存
各層可擴(kuò)展性:
??????? 應(yīng)用程序服務(wù)器,配置相同,不持有狀態(tài),容易擴(kuò)展
?????? 數(shù)據(jù)源(數(shù)據(jù)庫服務(wù)器、文件服務(wù)器):read的分布式容易,write 的分布式難
第33課:保證冗余性
應(yīng)用程序服務(wù)器:
??? 增加服務(wù)器數(shù)量
??? 用負(fù)載均衡器實(shí)現(xiàn)失敗轉(zhuǎn)移和失敗恢復(fù)
數(shù)據(jù)庫服務(wù)器:
Multi-master:是今年Mysql服務(wù)器構(gòu)建的主要方法。該架構(gòu)中,服務(wù)通常是兩臺(tái),組成Active/Standby結(jié)構(gòu)。其中,一臺(tái)是Active,另一臺(tái)是Standby,通常只向Active寫數(shù)據(jù)。一旦Active停機(jī),Standby通過VRRP協(xié)議監(jiān)視到這一情況,即把自己提升為Active,變成新的master。而停機(jī)的那臺(tái)經(jīng)過人工修復(fù)后變成Standby,或恢復(fù)為原來的結(jié)構(gòu)。為了從外部判斷哪臺(tái)是Active,需要用到虛擬IP(VIP),即Active服務(wù)器除了原有的IP地址,還會(huì)被分配一個(gè)服務(wù)用的虛擬IP地址。應(yīng)用程序服務(wù)器始終訪問這個(gè)虛擬IP。切斷時(shí)將這個(gè)虛擬IP分配給新的Active。從而實(shí)現(xiàn)master的透明切換。
第38課:網(wǎng)絡(luò)的分界點(diǎn)
PC路由器的極限:超過1Gbps(30pps,即每秒30萬包數(shù)據(jù),按每包300字節(jié)算,為1Gbps)
一個(gè)子網(wǎng)的極限:500臺(tái)主機(jī)
一個(gè)數(shù)據(jù)中心無法實(shí)現(xiàn)全球化
CDS:(Content Delivery Network),基本原理就是在世界各地放置服務(wù)器,將媒體文件緩存后,用戶就可以從最近的服務(wù)器下載了。
如:Amazon CloudFront
轉(zhuǎn)載于:https://www.cnblogs.com/xiekeli/archive/2012/05/30/2527103.html
總結(jié)
以上是生活随笔為你收集整理的《大规模web服务开发技术》阅读笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过飞行CALL找到BT飞行偏移 和飞行
- 下一篇: 导入新的一个android项目抱错