Q:也談大型高負(fù)載的網(wǎng)站的體系結(jié)構(gòu)
A:從事發(fā)布系統(tǒng)(web publish system)的研究和開發(fā)快兩年了,從小型應(yīng)用到中型應(yīng)用,基本上沒有參與大型應(yīng)用(千萬pv/day)的部署,網(wǎng)絡(luò)上這種技術(shù)的探討都不是特別全面,有的提及發(fā)布系統(tǒng)對(duì)分布式部署,以及海量負(fù)載,有的干脆只從網(wǎng)絡(luò)層面進(jìn)行講解,我感覺這是個(gè)系統(tǒng)工程,不僅要考慮到應(yīng)用層面(user layer or app layer),也要考慮到系統(tǒng)層面(kernel layer or system layer),還要考慮到數(shù)據(jù)庫層面(database layer),否則可能有失偏頗。
我現(xiàn)在從三個(gè)層面就我的理解說一些我的一些看法,礙于知識(shí)和實(shí)踐的局限性,也會(huì)相當(dāng)有限。
所謂應(yīng)用層面指的是前端應(yīng)用,因?yàn)閷?duì)網(wǎng)站來說,網(wǎng)友接觸最多的就是前端頁面,影響負(fù)載的很大程度上也是每天上千萬的page view帶來的visit,對(duì)web1.0的網(wǎng)站來說,前端頁面往往都是靜態(tài)化的,即html化的,這也是為了降低負(fù)載,因?yàn)閣eb應(yīng)用服務(wù)器解析html頁面的速度是最快的,而頁面的靜態(tài)化一般都是由web級(jí)的(主要)和桌面局域網(wǎng)級(jí)別的(很少)發(fā)布平臺(tái)發(fā)布的,基于分布式的考慮,發(fā)布系統(tǒng)*能夠分發(fā)產(chǎn)生的html頁,分發(fā)到光纖或者高速局域網(wǎng)中的不同host上,以便分散訪問壓力。當(dāng)然也可以使用系統(tǒng)層的同步工具完成這個(gè)工作,注意要對(duì)頁面的域名對(duì)應(yīng)信息進(jìn)行保存,防止產(chǎn)生404 error。我個(gè)人比較喜歡系統(tǒng)層的網(wǎng)絡(luò)同步,速度比較快,穩(wěn)定性也比較高。應(yīng)用層的分發(fā)一般借助ftp的方式,速度不是特別快,容易產(chǎn)生擁塞,穩(wěn)定性自然下降。
如果分布式的分發(fā)靜態(tài)頁面仍然存在瓶頸,怎么辦?國內(nèi)大型的門戶網(wǎng)站往往采取可緩存的反向代理方式部署的負(fù)載均衡技術(shù)來解決,一般都是squid做前端cache和反向代理。負(fù)載均衡也有軟件級(jí)的(dns 輪詢)負(fù)載均衡和硬件上的負(fù)載均衡甚至兩者的結(jié)合進(jìn)行實(shí)現(xiàn),具體實(shí)施細(xì)則將在下一篇中進(jìn)行闡述。說到靜態(tài)化,也不只是web1.0的傳統(tǒng)新聞門戶采用,web2.0的應(yīng)用前端也可靜態(tài)化,或者部分靜態(tài)化,比如:社區(qū)型門戶,帖子就可以靜態(tài)化,可以采取即時(shí)靜態(tài)或者異步靜態(tài)的方式,也可以觸發(fā)靜態(tài)化。這種靜態(tài)化可以降低數(shù)據(jù)庫層的壓力,數(shù)據(jù)庫服務(wù)器如果始終工作在大負(fù)載的訪問壓力下,很容易崩潰,盡可能的將經(jīng)常用到的數(shù)據(jù)靜態(tài)化,緩存起來會(huì)極大的降低壓力。(貓撲、網(wǎng)易、搜狐等社區(qū)都是采用的這種方式)
上文提到了靜態(tài)化能減輕數(shù)據(jù)庫服務(wù)器的壓力,可是卻影響了更新的即時(shí)性,有些應(yīng)用需要數(shù)據(jù)的即時(shí)顯示,不允許緩存或者靜態(tài)化,這就需要對(duì)數(shù)據(jù)庫服務(wù)器的結(jié)構(gòu)進(jìn)行合理部署。除了要在設(shè)計(jì)應(yīng)用之初,很好的設(shè)計(jì)數(shù)據(jù)庫結(jié)構(gòu),使用好的模式之外,還要對(duì)數(shù)據(jù)庫服務(wù)器進(jìn)行分布式部署甚至庫表散列。在數(shù)據(jù)庫集群(database culuster)方面,很多數(shù)據(jù)庫都有不錯(cuò)的解決方案,包括Oracle、Sybase甚至mysql,只不過mysql采用的是master+slave的結(jié)構(gòu),選用了何種數(shù)據(jù)庫,就參照相應(yīng)的解決方案進(jìn)行部署。除了在數(shù)據(jù)庫選擇上進(jìn)行負(fù)載均衡之外,也可以在單數(shù)據(jù)庫本身進(jìn)行考慮,比如庫表的散列,根據(jù)應(yīng)用的特點(diǎn),將大的、影響性能的數(shù)據(jù)庫或者數(shù)據(jù)庫的單表進(jìn)行散列、拆分。比如:按用戶id進(jìn)行散列,按分類進(jìn)行散列,或者按地區(qū)進(jìn)行散列。
說到系統(tǒng)層,可能就是OS和Web Server了,大型應(yīng)用的OS基本都是Unix(包括freebsd或者HP Unix等)或者類Unix(各種linux版本,redhat居多),這不是說Microsoft的OS就不合理了,合理的應(yīng)用也可部署大型應(yīng)用,只不過效能會(huì)很受限制。Web Server層面,還是apache當(dāng)家,尤其是靜態(tài)頁和圖片,當(dāng)然也可以根據(jù)具體的需求,根據(jù)內(nèi)容的特殊性選擇Lighttpd(比較適合做純靜態(tài)、圖片服務(wù)器、視頻服務(wù)器等)、甚至iis(windows下用的居多),系統(tǒng)層的web服務(wù)器的配置還是很有講究的,比如對(duì)cache的配置,反向代理的配置等。比較好的web加速和代理服務(wù)器有:Squid、Nginx、HAProxy、Lighttpd,這四個(gè)可能是用的比較多的了。其中業(yè)內(nèi)比較出名的Flickr、tudou用的是lighttpd,sina和51.com使用了,至少部分使用了Nginx。
緩存系統(tǒng)對(duì)高負(fù)載的重要性是不言而喻的,前面提到的靜態(tài)化,需要進(jìn)行有效緩存,經(jīng)常用到的查詢和結(jié)果需要進(jìn)行緩存,只要設(shè)定好更新緩存的規(guī)則,對(duì)性能的提升是n個(gè)數(shù)量級(jí)的。Linux下,有內(nèi)存級(jí)別的緩存,高速緩存,很多應(yīng)用都是用tmpfs來進(jìn)行數(shù)據(jù)中轉(zhuǎn),php上用的最多的是memcached,apache有文件系統(tǒng)級(jí)別的cache,squid也是做前端cache的主要手段。騰訊、網(wǎng)易等都是用了squid做前端cache server。
前面提到的負(fù)載均衡,有軟件級(jí)別的,比如LVS、HAProxy、Linux-HA項(xiàng)目等,硬件層面的諸如:f5的BigIp、3DNS,alton的解決方案,北電的方案等,都是比較成熟的,不過都需要付出相當(dāng)可觀的¥。
A:從事發(fā)布系統(tǒng)(web publish system)的研究和開發(fā)快兩年了,從小型應(yīng)用到中型應(yīng)用,基本上沒有參與大型應(yīng)用(千萬pv/day)的部署,網(wǎng)絡(luò)上這種技術(shù)的探討都不是特別全面,有的提及發(fā)布系統(tǒng)對(duì)分布式部署,以及海量負(fù)載,有的干脆只從網(wǎng)絡(luò)層面進(jìn)行講解,我感覺這是個(gè)系統(tǒng)工程,不僅要考慮到應(yīng)用層面(user layer or app layer),也要考慮到系統(tǒng)層面(kernel layer or system layer),還要考慮到數(shù)據(jù)庫層面(database layer),否則可能有失偏頗。
我現(xiàn)在從三個(gè)層面就我的理解說一些我的一些看法,礙于知識(shí)和實(shí)踐的局限性,也會(huì)相當(dāng)有限。
所謂應(yīng)用層面指的是前端應(yīng)用,因?yàn)閷?duì)網(wǎng)站來說,網(wǎng)友接觸最多的就是前端頁面,影響負(fù)載的很大程度上也是每天上千萬的page view帶來的visit,對(duì)web1.0的網(wǎng)站來說,前端頁面往往都是靜態(tài)化的,即html化的,這也是為了降低負(fù)載,因?yàn)閣eb應(yīng)用服務(wù)器解析html頁面的速度是最快的,而頁面的靜態(tài)化一般都是由web級(jí)的(主要)和桌面局域網(wǎng)級(jí)別的(很少)發(fā)布平臺(tái)發(fā)布的,基于分布式的考慮,發(fā)布系統(tǒng)*能夠分發(fā)產(chǎn)生的html頁,分發(fā)到光纖或者高速局域網(wǎng)中的不同host上,以便分散訪問壓力。當(dāng)然也可以使用系統(tǒng)層的同步工具完成這個(gè)工作,注意要對(duì)頁面的域名對(duì)應(yīng)信息進(jìn)行保存,防止產(chǎn)生404 error。我個(gè)人比較喜歡系統(tǒng)層的網(wǎng)絡(luò)同步,速度比較快,穩(wěn)定性也比較高。應(yīng)用層的分發(fā)一般借助ftp的方式,速度不是特別快,容易產(chǎn)生擁塞,穩(wěn)定性自然下降。
如果分布式的分發(fā)靜態(tài)頁面仍然存在瓶頸,怎么辦?國內(nèi)大型的門戶網(wǎng)站往往采取可緩存的反向代理方式部署的負(fù)載均衡技術(shù)來解決,一般都是squid做前端cache和反向代理。負(fù)載均衡也有軟件級(jí)的(dns 輪詢)負(fù)載均衡和硬件上的負(fù)載均衡甚至兩者的結(jié)合進(jìn)行實(shí)現(xiàn),具體實(shí)施細(xì)則將在下一篇中進(jìn)行闡述。說到靜態(tài)化,也不只是web1.0的傳統(tǒng)新聞門戶采用,web2.0的應(yīng)用前端也可靜態(tài)化,或者部分靜態(tài)化,比如:社區(qū)型門戶,帖子就可以靜態(tài)化,可以采取即時(shí)靜態(tài)或者異步靜態(tài)的方式,也可以觸發(fā)靜態(tài)化。這種靜態(tài)化可以降低數(shù)據(jù)庫層的壓力,數(shù)據(jù)庫服務(wù)器如果始終工作在大負(fù)載的訪問壓力下,很容易崩潰,盡可能的將經(jīng)常用到的數(shù)據(jù)靜態(tài)化,緩存起來會(huì)極大的降低壓力。(貓撲、網(wǎng)易、搜狐等社區(qū)都是采用的這種方式)
上文提到了靜態(tài)化能減輕數(shù)據(jù)庫服務(wù)器的壓力,可是卻影響了更新的即時(shí)性,有些應(yīng)用需要數(shù)據(jù)的即時(shí)顯示,不允許緩存或者靜態(tài)化,這就需要對(duì)數(shù)據(jù)庫服務(wù)器的結(jié)構(gòu)進(jìn)行合理部署。除了要在設(shè)計(jì)應(yīng)用之初,很好的設(shè)計(jì)數(shù)據(jù)庫結(jié)構(gòu),使用好的模式之外,還要對(duì)數(shù)據(jù)庫服務(wù)器進(jìn)行分布式部署甚至庫表散列。在數(shù)據(jù)庫集群(database culuster)方面,很多數(shù)據(jù)庫都有不錯(cuò)的解決方案,包括Oracle、Sybase甚至mysql,只不過mysql采用的是master+slave的結(jié)構(gòu),選用了何種數(shù)據(jù)庫,就參照相應(yīng)的解決方案進(jìn)行部署。除了在數(shù)據(jù)庫選擇上進(jìn)行負(fù)載均衡之外,也可以在單數(shù)據(jù)庫本身進(jìn)行考慮,比如庫表的散列,根據(jù)應(yīng)用的特點(diǎn),將大的、影響性能的數(shù)據(jù)庫或者數(shù)據(jù)庫的單表進(jìn)行散列、拆分。比如:按用戶id進(jìn)行散列,按分類進(jìn)行散列,或者按地區(qū)進(jìn)行散列。
說到系統(tǒng)層,可能就是OS和Web Server了,大型應(yīng)用的OS基本都是Unix(包括freebsd或者HP Unix等)或者類Unix(各種linux版本,redhat居多),這不是說Microsoft的OS就不合理了,合理的應(yīng)用也可部署大型應(yīng)用,只不過效能會(huì)很受限制。Web Server層面,還是apache當(dāng)家,尤其是靜態(tài)頁和圖片,當(dāng)然也可以根據(jù)具體的需求,根據(jù)內(nèi)容的特殊性選擇Lighttpd(比較適合做純靜態(tài)、圖片服務(wù)器、視頻服務(wù)器等)、甚至iis(windows下用的居多),系統(tǒng)層的web服務(wù)器的配置還是很有講究的,比如對(duì)cache的配置,反向代理的配置等。比較好的web加速和代理服務(wù)器有:Squid、Nginx、HAProxy、Lighttpd,這四個(gè)可能是用的比較多的了。其中業(yè)內(nèi)比較出名的Flickr、tudou用的是lighttpd,sina和51.com使用了,至少部分使用了Nginx。
緩存系統(tǒng)對(duì)高負(fù)載的重要性是不言而喻的,前面提到的靜態(tài)化,需要進(jìn)行有效緩存,經(jīng)常用到的查詢和結(jié)果需要進(jìn)行緩存,只要設(shè)定好更新緩存的規(guī)則,對(duì)性能的提升是n個(gè)數(shù)量級(jí)的。Linux下,有內(nèi)存級(jí)別的緩存,高速緩存,很多應(yīng)用都是用tmpfs來進(jìn)行數(shù)據(jù)中轉(zhuǎn),php上用的最多的是memcached,apache有文件系統(tǒng)級(jí)別的cache,squid也是做前端cache的主要手段。騰訊、網(wǎng)易等都是用了squid做前端cache server。
前面提到的負(fù)載均衡,有軟件級(jí)別的,比如LVS、HAProxy、Linux-HA項(xiàng)目等,硬件層面的諸如:f5的BigIp、3DNS,alton的解決方案,北電的方案等,都是比較成熟的,不過都需要付出相當(dāng)可觀的¥。