java處理高并發(fā)高負(fù)載類(lèi)網(wǎng)站的優(yōu)化方法_第1頁(yè)
java處理高并發(fā)高負(fù)載類(lèi)網(wǎng)站的優(yōu)化方法_第2頁(yè)
java處理高并發(fā)高負(fù)載類(lèi)網(wǎng)站的優(yōu)化方法_第3頁(yè)
java處理高并發(fā)高負(fù)載類(lèi)網(wǎng)站的優(yōu)化方法_第4頁(yè)
java處理高并發(fā)高負(fù)載類(lèi)網(wǎng)站的優(yōu)化方法_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、java處理高并發(fā)高負(fù)載類(lèi)網(wǎng)站的優(yōu)化方法 一:高并發(fā)高負(fù)載類(lèi)網(wǎng)站關(guān)注點(diǎn)之?dāng)?shù)據(jù)庫(kù)沒(méi)錯(cuò),首先是數(shù)據(jù)庫(kù),這是大多數(shù)應(yīng)用所面臨的首個(gè)SPOF。尤其是Web2.0的應(yīng)用,數(shù)據(jù)庫(kù)的響應(yīng)是首先要解決的。一般來(lái)說(shuō)MySQL是最常用的,可能最初是一個(gè)mysql主機(jī),當(dāng)數(shù)據(jù)增加到100萬(wàn)以上,那么,MySQL的效能急劇下降。常用的優(yōu)化措施是M-S(主-從)方式進(jìn)行同步復(fù)制,將查詢和操作和分別在不同的服務(wù)器上進(jìn)行操作。我推薦的是M-M-Slaves方式,2個(gè)主Mysql,多個(gè)Slaves,需要注意的是,雖然有2個(gè)Master,但是同時(shí)只有1個(gè)是Active,我們可以在一定時(shí)候切換。之所以用2個(gè)M,是保證M不會(huì)又成為

2、系統(tǒng)的SPOF。Slaves可以進(jìn)一步負(fù)載均衡,可以結(jié)合LVS,從而將select操作適當(dāng)?shù)钠胶獾讲煌膕laves上。以上架構(gòu)可以抗衡到一定量的負(fù)載,但是隨著用戶進(jìn)一步增加,你的用戶表數(shù)據(jù)超過(guò)1千萬(wàn),這時(shí)那個(gè)M變成了SPOF。你不能任意擴(kuò)充Slaves,否則復(fù)制同步的開(kāi)銷(xiāo)將直線上升,怎么辦?我的方法是表分區(qū),從業(yè)務(wù)層面上進(jìn)行分區(qū)。最簡(jiǎn)單的,以用戶數(shù)據(jù)為例。根據(jù)一定的切分方式,比如id,切分到不同的數(shù)據(jù)庫(kù)集群去。全局?jǐn)?shù)據(jù)庫(kù)用于meta數(shù)據(jù)的查詢。缺點(diǎn)是每次查詢,會(huì)增加一次,比如你要查一個(gè)用戶nightsailer,你首先要到全局?jǐn)?shù)據(jù)庫(kù)群找到nightsailer對(duì)應(yīng)的cluster id,然后

3、再到指定的cluster找到nightsailer的實(shí)際數(shù)據(jù)。每個(gè)cluster可以用m-m方式,或者m-m-slaves方式。這是一個(gè)可以擴(kuò)展的結(jié)構(gòu),隨著負(fù)載的增加,你可以簡(jiǎn)單的增加新的mysql cluster進(jìn)去。需要注意的是:1、禁用全部auto_increment的字段2、id需要采用通用的算法集中分配3、要具有比較好的方法來(lái)監(jiān)控mysql主機(jī)的負(fù)載和服務(wù)的運(yùn)行狀態(tài)。如果你有30臺(tái)以上的mysql數(shù)據(jù)庫(kù)在跑就明白我的意思了。4、不要使用持久性鏈接(不要用pconnect),相反,使用sqlrelay這種第三方的數(shù)據(jù)庫(kù)鏈接池,或者干脆自己做,因?yàn)閜hp4中mysql的鏈接池經(jīng)常出問(wèn)題。

4、二:高并發(fā)高負(fù)載網(wǎng)站的系統(tǒng)架構(gòu)之HTML靜態(tài)化 其實(shí)大家都知道,效率最高、消耗最小的就是純靜態(tài)化的html頁(yè)面,所以我們盡可能使我們的網(wǎng)站上的頁(yè)面采用靜態(tài)頁(yè)面來(lái)實(shí)現(xiàn),這個(gè)最簡(jiǎn)單的方法其實(shí)也是 最有效的方法。但是對(duì)于大量?jī)?nèi)容并且頻繁更新的網(wǎng)站,我們無(wú)法全部手動(dòng)去挨個(gè)實(shí)現(xiàn),于是出現(xiàn)了我們常見(jiàn)的信息發(fā)布系統(tǒng)CMS,像我們常訪問(wèn)的各個(gè)門(mén)戶站點(diǎn) 的新聞?lì)l道,甚至他們的其他頻道,都是通過(guò)信息發(fā)布系統(tǒng)來(lái)管理和實(shí)現(xiàn)的,信息發(fā)布系統(tǒng)可以實(shí)現(xiàn)最簡(jiǎn)單的信息錄入自動(dòng)生成靜態(tài)頁(yè)面,還能具備頻道管理、權(quán)限 管理、自動(dòng)抓取等功能,對(duì)于一個(gè)大型網(wǎng)站來(lái)說(shuō),擁有一套高效、可管理的CMS是必不可少的。除了門(mén)戶和信息發(fā)布類(lèi)型的網(wǎng)站,

5、對(duì)于交互性要求很高的社區(qū)類(lèi)型網(wǎng)站來(lái)說(shuō),盡可能的靜態(tài)化也是提高性能的必要手段,將社區(qū)內(nèi)的帖子、文章進(jìn)行實(shí)時(shí)的靜態(tài)化,有更新的時(shí)候再重新靜態(tài)化也是大量使用的策略,像Mop的大雜燴就是使用了這樣的策略,網(wǎng)易社區(qū)等也是如此。同時(shí),html靜態(tài)化也是某些緩存策略使用的手段,對(duì)于系統(tǒng)中頻繁使用數(shù)據(jù)庫(kù)查詢但是內(nèi)容更新很小的應(yīng)用,可以考慮使用html靜態(tài)化來(lái)實(shí)現(xiàn),比如論壇 中論壇的公用設(shè)置信息,這些信息目前的主流論壇都可以進(jìn)行后臺(tái)管理并且存儲(chǔ)再數(shù)據(jù)庫(kù)中,這些信息其實(shí)大量被前臺(tái)程序調(diào)用,但是更新頻率很小,可以考慮將這 部分內(nèi)容進(jìn)行后臺(tái)更新的時(shí)候進(jìn)行靜態(tài)化,這樣避免了大量的數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求高并發(fā)。網(wǎng)站HTML靜態(tài)化

6、解決方案 當(dāng)一個(gè)Servlet資源請(qǐng)求到達(dá)WEB服務(wù)器之后我們會(huì)填充指定的JSP頁(yè)面來(lái)響應(yīng)請(qǐng)求:HTTP請(qǐng)求-Web服務(wù)器-Servlet-業(yè)務(wù)邏輯處理-訪問(wèn)數(shù)據(jù)-填充JSP-響應(yīng)請(qǐng)求HTML靜態(tài)化之后:HTTP請(qǐng)求-Web服務(wù)器-Servlet-HTML-響應(yīng)請(qǐng)求靜態(tài)訪求如下Servlet:java view plaincopyprint?1. public void doGet(HttpServletRequest request, HttpServletResponse response) 2. throws ServletException, IOException 3. if(req

7、uest.getParameter("chapterId") != null) 4. String chapterFileName = "bookChapterRead_"+request.getParameter("chapterId")+".html" 5. String chapterFilePath = getServletContext().getRealPath("/") + chapterFileName; 6. File chapterFile = new File(chapte

8、rFilePath); 7. if(chapterFile.exists()response.sendRedirect(chapterFileName);return;/如果有這個(gè)文件就告訴瀏覽器轉(zhuǎn)向 8. INovelChapterBiz novelChapterBiz = new NovelChapterBizImpl(); 9. NovelChapter novelChapter = novelChapterBiz.searchNovelChapterById(Integer.parseInt(request.getParameter("chapterId");/章節(jié)

9、信息 10. int lastPageId = novelChapterBiz.searchLastCHapterId(novelChapter.getNovelId().getId(), novelChapter.getId(); 11. int nextPageId = novelChapterBiz.searchNextChapterId(novelChapter.getNovelId().getId(), novelChapter.getId(); 12. request.setAttribute("novelChapter", novelChapter); 13.

10、 request.setAttribute("lastPageId", lastPageId); 14. request.setAttribute("nextPageId", nextPageId); 15. new CreateStaticHTMLPage().createStaticHTMLPage(request, response, getServletContext(), 16. chapterFileName, chapterFilePath, "/bookRead.jsp"); 17. 18. public void d

11、oGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException if(request.getParameter("chapterId") != null) String chapterFileName = "bookChapterRead_"+request.getParameter("chapterId")+".html" String chapterFilePath = get

12、ServletContext().getRealPath("/") + chapterFileName; File chapterFile = new File(chapterFilePath); if(chapterFile.exists()response.sendRedirect(chapterFileName);return;/如果有這個(gè)文件就告訴瀏覽器轉(zhuǎn)向 INovelChapterBiz novelChapterBiz = new NovelChapterBizImpl(); NovelChapter novelChapter = novelChapterBiz

13、.searchNovelChapterById(Integer.parseInt(request.getParameter("chapterId");/章節(jié)信息 int lastPageId = novelChapterBiz.searchLastCHapterId(novelChapter.getNovelId().getId(), novelChapter.getId(); int nextPageId = novelChapterBiz.searchNextChapterId(novelChapter.getNovelId().getId(), novelChapte

14、r.getId(); request.setAttribute("novelChapter", novelChapter); request.setAttribute("lastPageId", lastPageId); request.setAttribute("nextPageId", nextPageId); new CreateStaticHTMLPage().createStaticHTMLPage(request, response, getServletContext(), chapterFileName, chapte

15、rFilePath, "/bookRead.jsp"); 生成HTML靜態(tài)頁(yè)面的類(lèi): java view plaincopyprint?1. package com.jb.y2t034.thefifth.web.servlet; 2. import java.io.ByteArrayOutputStream; 3. import java.io.FileOutputStream; 4. import java.io.IOException; 5. import java.io.OutputStreamWriter; 6. import java.io.PrintWriter

16、; 7. import javax.servlet.RequestDispatcher; 8. import javax.servlet.ServletContext; 9. import javax.servlet.ServletException; 10. import javax.servlet.ServletOutputStream; 11. import javax.servlet.http.HttpServletRequest; 12. import javax.servlet.http.HttpServletResponse; 13. import javax.servlet.h

17、ttp.HttpServletResponseWrapper; 14. /* 15. * 創(chuàng)建HTML靜態(tài)頁(yè)面 16. * 功能:創(chuàng)建HTML靜態(tài)頁(yè)面 17. * 時(shí)間:2009年1011日 18. * 地點(diǎn):home 19. * author mavk 20. * 21. */ 22. public class CreateStaticHTMLPage 23. /* 24. * 生成靜態(tài)HTML頁(yè)面的方法 25. * param request 請(qǐng)求對(duì)象 26. * param response 響應(yīng)對(duì)象 27. * param servletContext Servlet上下文 28. *

18、 param fileName 文件名稱(chēng) 29. * param fileFullPath 文件完整路徑 30. * param jspPath 需要生成靜態(tài)文件的JSP路徑(相對(duì)即可) 31. * throws IOException 32. * throws ServletException 33. */ 34. public void createStaticHTMLPage(HttpServletRequest request, HttpServletResponse response,ServletContext servletContext,String fileName,Stri

19、ng fileFullPath,String jspPath) throws ServletException, IOException 35. response.setContentType("text/html;charset=gb2312");/設(shè)置HTML結(jié)果流編碼(即HTML文件編碼) 36. RequestDispatcher rd = servletContext.getRequestDispatcher(jspPath);/得到JSP資源 37. final ByteArrayOutputStream byteArrayOutputStream = new

20、ByteArrayOutputStream();/用于從ServletOutputStream中接收資源 38. final ServletOutputStream servletOuputStream = new ServletOutputStream()/用于從HttpServletResponse中接收資源 39. public void write(byte b, int off,int len) 40. byteArrayOutputStream.write(b, off, len); 41. 42. public void write(int b) 43. byteArrayOut

21、putStream.write(b); 44. 45. ; 46. final PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(byteArrayOutputStream);/把轉(zhuǎn)換字節(jié)流轉(zhuǎn)換成字符流 47. HttpServletResponse httpServletResponse = new HttpServletResponseWrapper(response)/用于從response獲取結(jié)果流資源(重寫(xiě)了兩個(gè)方法) 48. public ServletOutputStream getOutputStr

22、eam() 49. return servletOuputStream; 50. 51. public PrintWriter getWriter() 52. return printWriter; 53. 54. ; 55. rd.include(request, httpServletResponse);/發(fā)送結(jié)果流 56. printWriter.flush();/刷新緩沖區(qū),把緩沖區(qū)的數(shù)據(jù)輸出 57. FileOutputStream fileOutputStream = new FileOutputStream(fileFullPath); 58. byteArrayOutputSt

23、ream.writeTo(fileOutputStream);/把byteArrayOuputStream中的資源全部寫(xiě)入到fileOuputStream中 59. fileOutputStream.close();/關(guān)閉輸出流,并釋放相關(guān)資源 60. response.sendRedirect(fileName);/發(fā)送指定文件流到客戶端 61. 62. package com.jb.y2t034.thefifth.web.servlet; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; impor

24、t java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import jav

25、ax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; /* * 創(chuàng)建HTML靜態(tài)頁(yè)面 * 功能:創(chuàng)建HTML靜態(tài)頁(yè)面 * 時(shí)間:2009年1011日 * 地點(diǎn):home * author mavk * */ public class CreateStaticHTMLPage /* * 生成靜態(tài)HTML頁(yè)面的方法 * param request 請(qǐng)求對(duì)象 * param response 響應(yīng)對(duì)象 * param servletContext Servlet上下文 *

26、param fileName 文件名稱(chēng) * param fileFullPath 文件完整路徑 * param jspPath 需要生成靜態(tài)文件的JSP路徑(相對(duì)即可) * throws IOException * throws ServletException */ public void createStaticHTMLPage(HttpServletRequest request, HttpServletResponse response,ServletContext servletContext,String fileName,String fileFullPath,String js

27、pPath) throws ServletException, IOException response.setContentType("text/html;charset=gb2312");/設(shè)置HTML結(jié)果流編碼(即HTML文件編碼) RequestDispatcher rd = servletContext.getRequestDispatcher(jspPath);/得到JSP資源 final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();/用于從ServletOu

28、tputStream中接收資源 final ServletOutputStream servletOuputStream = new ServletOutputStream()/用于從HttpServletResponse中接收資源 public void write(byte b, int off,int len) byteArrayOutputStream.write(b, off, len); public void write(int b) byteArrayOutputStream.write(b); ; final PrintWriter printWriter = new Pri

29、ntWriter(new OutputStreamWriter(byteArrayOutputStream);/把轉(zhuǎn)換字節(jié)流轉(zhuǎn)換成字符流 HttpServletResponse httpServletResponse = new HttpServletResponseWrapper(response)/用于從response獲取結(jié)果流資源(重寫(xiě)了兩個(gè)方法) public ServletOutputStream getOutputStream() return servletOuputStream; public PrintWriter getWriter() return printWrite

30、r; ; rd.include(request, httpServletResponse);/發(fā)送結(jié)果流 printWriter.flush();/刷新緩沖區(qū),把緩沖區(qū)的數(shù)據(jù)輸出 FileOutputStream fileOutputStream = new FileOutputStream(fileFullPath); byteArrayOutputStream.writeTo(fileOutputStream);/把byteArrayOuputStream中的資源全部寫(xiě)入到fileOuputStream中 fileOutputStream.close();/關(guān)閉輸出流,并釋放相關(guān)資源 re

31、sponse.sendRedirect(fileName);/發(fā)送指定文件流到客戶端 三:高并發(fā)高負(fù)載類(lèi)網(wǎng)站關(guān)注點(diǎn)之緩存、負(fù)載均衡、存儲(chǔ)緩存是另一個(gè)大問(wèn)題,我一般用memcached來(lái)做緩存集群,一般來(lái)說(shuō)部署10臺(tái)左右就差不多(10g內(nèi)存池)。需要注意一點(diǎn),千萬(wàn)不能用使用swap,最好關(guān)閉linux的swap。負(fù)載均衡/加速可能上面說(shuō)緩存的時(shí)候,有人第一想的是頁(yè)面靜態(tài)化,所謂的靜態(tài)html,我認(rèn)為這是常識(shí),不屬于要點(diǎn)了。頁(yè)面的靜態(tài)化隨之帶來(lái)的是靜態(tài)服務(wù)的負(fù)載均衡和加速。我認(rèn)為L(zhǎng)ighttped+Squid是最好的方式了。LVS <->lighttped=>squid(s) =

32、lighttpd上面是我經(jīng)常用的。注意,我沒(méi)有用apache,除非特定的需求,否則我不部署apache,因?yàn)槲乙话阌胮hp-fastcgi配合lighttpd,性能比apache+mod_php要強(qiáng)很多。squid的使用可以解決文件的同步等等問(wèn)題,但是需要注意,你要很好的監(jiān)控緩存的命中率,盡可能的提高的90%以上。squid和lighttped也有很多的話題要討論,這里不贅述。存儲(chǔ)存儲(chǔ)也是一個(gè)大問(wèn)題,一種是小文件的存儲(chǔ),比如圖片這類(lèi)。另一種是大文件的存儲(chǔ),比如搜索引擎的索引,一般單文件都超過(guò)2g以上。小文件的存儲(chǔ)最簡(jiǎn)單的方法是結(jié)合lighttpd來(lái)進(jìn)行分布。或者干脆使用Redhat的GFS,優(yōu)

33、點(diǎn)是應(yīng)用透明,缺點(diǎn)是費(fèi)用較高。我是指你購(gòu)買(mǎi)盤(pán)陣的問(wèn)題。我的項(xiàng)目中,存儲(chǔ)量是2-10Tb,我采用了分布式存儲(chǔ)。這里要解決文件的復(fù)制和冗余。這樣每個(gè)文件有不同的冗余,這方面可以參考google的gfs的論文。大文件的存儲(chǔ),可以參考nutch的方案,現(xiàn)在已經(jīng)獨(dú)立為hadoop子項(xiàng)目。(你可以google it)其他:此外,passport等也是考慮的,不過(guò)都屬于比較簡(jiǎn)單的了。四:高并發(fā)高負(fù)載網(wǎng)站的系統(tǒng)架構(gòu)之圖片服務(wù)器分離 大家知道,對(duì)于Web 服務(wù)器來(lái)說(shuō),不管是Apache、IIS還是其他容器,圖片是最消耗資源的,于是我們有必要將圖片與頁(yè)面進(jìn)行分離,這是基本上大型網(wǎng)站都會(huì)采用的策略,他 們都有獨(dú)立的

34、圖片服務(wù)器,甚至很多臺(tái)圖片服務(wù)器。這樣的架構(gòu)可以降低提供頁(yè)面訪問(wèn)請(qǐng)求的服務(wù)器系統(tǒng)壓力,并且可以保證系統(tǒng)不會(huì)因?yàn)閳D片問(wèn)題而崩潰,在應(yīng)用 服務(wù)器和圖片服務(wù)器上,可以進(jìn)行不同的配置優(yōu)化,比如apache在配置ContentType的時(shí)候可以盡量少支持,盡可能少的LoadModule, 保證更高的系統(tǒng)消耗和執(zhí)行效率。利用Apache實(shí)現(xiàn)圖片服務(wù)器的分離緣由: 起步階段的應(yīng)用,都可能部署在一臺(tái)服務(wù)器上(費(fèi)用上的原因) 第一個(gè)優(yōu)先分離的,肯定是數(shù)據(jù)庫(kù)和應(yīng)用服務(wù)器。 第二個(gè)分離的,會(huì)是什么呢?各有各的考慮,我所在的項(xiàng)目組重點(diǎn)考慮的節(jié)約帶寬,服務(wù)器性能再好,帶寬再高,并發(fā)來(lái)了,也容易撐不住。因此,我這篇文章的

35、重點(diǎn)在這里。這里重點(diǎn)是介紹實(shí)踐,不一定符合所有情況,供看者參考吧。環(huán)境介紹: WEB應(yīng)用服務(wù)器:4CPU雙核2G, 內(nèi)存4G 部署:Win2003/Apache Http Server 2.1/Tomcat6 數(shù)據(jù)庫(kù)服務(wù)器:4CPU雙核2G, 內(nèi)存4G 部署:Win2003/MSSQL2000 步驟: 步驟一:增加2臺(tái)配置為:2CPU雙核2G,內(nèi)存2G普通服務(wù)器,做資源服務(wù)器 部署:Tomcat6,跑了一個(gè)圖片上傳的簡(jiǎn)單應(yīng)用,(記得指定web.xml的<distributable/>),并指定域名為res1.*.com,res2.*.com,采用ajp協(xié)議步驟二:修改Apache

36、httpd.conf配置 原來(lái)應(yīng)用的文件上傳功能網(wǎng)址為: 1、/fileupload.html 2、/otherupload.html 在httpd.conf中增加如下配置 html view plaincopyprint?1. <VirtualHost *:80> 2. ServerAdmin webmaster*.com 3. ProxyPass /fileupload.html balancer:/rescluster/fileupload lbmethod=byrequests stickysession=JSESSIONID nofailover=Off timeout=

37、5 maxattempts=3 4. ProxyPass /otherupload.html balancer:/rescluster/otherupload.html lbmethod=byrequests stickysession=JSESSIONID nofailover=Off timeout=5 maxattempts=3 5. #<!-負(fù)載均衡-> 6. <Proxy balancer:/rescluster/> 7. BalancerMember ajp:/res1.*.com:8009 smax=5 max=500 ttl=120 retry=300

38、loadfactor=100 route=tomcat1 8. BalancerMember ajp:/res2.*.com:8009 smax=5 max=500 ttl=120 retry=300 loadfactor=100 route=tomcat2 9. </Proxy> 10. </VirtualHost> <SPAN style="FONT-FAMILY: SimSun"> </SPAN> <VirtualHost *:80> ServerAdmin webmaster*.com ProxyPass

39、/fileupload.html balancer:/rescluster/fileupload lbmethod=byrequests stickysession=JSESSIONID nofailover=Off timeout=5 maxattempts=3 ProxyPass /otherupload.html balancer:/rescluster/otherupload.html lbmethod=byrequests stickysession=JSESSIONID nofailover=Off timeout=5 maxattempts=3 #<!-負(fù)載均衡->

40、<Proxy balancer:/rescluster/> BalancerMember ajp:/res1.*.com:8009 smax=5 max=500 ttl=120 retry=300 loadfactor=100 route=tomcat1 BalancerMember ajp:/res2.*.com:8009 smax=5 max=500 ttl=120 retry=300 loadfactor=100 route=tomcat2 </Proxy> </VirtualHost> 步驟三,修改業(yè)務(wù)邏輯:所有上傳文件在數(shù)據(jù)庫(kù)中均采用全url的方式

41、保存,例如產(chǎn)品圖片路徑存成:http:/res1.*.com/upload/20090101/product120302005.jpg 現(xiàn)在,你可以高枕無(wú)憂了,帶寬不夠時(shí),增加個(gè)幾十臺(tái)圖片服務(wù)器,只需要稍微修改一下apache的配置文件,即可。五:高并發(fā)高負(fù)載網(wǎng)站的系統(tǒng)架構(gòu)之?dāng)?shù)據(jù)庫(kù)集群和庫(kù)表散列大型網(wǎng)站都有復(fù)雜的應(yīng)用,這些應(yīng)用必須使用數(shù)據(jù)庫(kù),那么在面對(duì)大量訪問(wèn)的時(shí)候,數(shù)據(jù)庫(kù)的瓶頸很快就能顯現(xiàn)出來(lái),這時(shí)一臺(tái)數(shù)據(jù)庫(kù)將很快無(wú)法滿足應(yīng)用,于是我們需要使用數(shù)據(jù)庫(kù)集群或者庫(kù)表散列。在數(shù)據(jù)庫(kù)集群方面,很多數(shù)據(jù)庫(kù)都有自己的解決方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master

42、/Slave也是類(lèi)似的方案,您使用了什么樣的DB,就參考相應(yīng)的解決方案來(lái)實(shí)施即可。上面提到的數(shù)據(jù)庫(kù)集群由于在架構(gòu)、成本、擴(kuò)張性方面都會(huì)受到所采用DB類(lèi)型的限制,于是我們需要從應(yīng)用程序的角度來(lái)考慮改善系統(tǒng)架構(gòu),庫(kù)表散列是常用并 且最有效的解決方案。我們?cè)趹?yīng)用程序中安裝業(yè)務(wù)和應(yīng)用或者功能模塊將數(shù)據(jù)庫(kù)進(jìn)行分離,不同的模塊對(duì)應(yīng)不同的數(shù)據(jù)庫(kù)或者表,再按照一定的策略對(duì)某個(gè)頁(yè)面或者 功能進(jìn)行更小的數(shù)據(jù)庫(kù)散列,比如用戶表,按照用戶ID進(jìn)行表散列,這樣就能夠低成本的提升系統(tǒng)的性能并且有很好的擴(kuò)展性。sohu的論壇就是采用了這樣的 架構(gòu),將論壇的用戶、設(shè)置、帖子等信息進(jìn)行數(shù)據(jù)庫(kù)分離,然后對(duì)帖子、用戶按照板塊和ID

43、進(jìn)行散列數(shù)據(jù)庫(kù)和表,最終可以在配置文件中進(jìn)行簡(jiǎn)單的配置便能讓系 統(tǒng)隨時(shí)增加一臺(tái)低成本的數(shù)據(jù)庫(kù)進(jìn)來(lái)補(bǔ)充系統(tǒng)性能。1 集群軟件的分類(lèi):一般來(lái)講,集群軟件根據(jù)側(cè)重的方向和試圖解決的問(wèn)題,分為三大類(lèi):高性能集群(High performance cluster,HPC)、負(fù)載均衡集群(Load balance cluster, LBC),高可用性集群(High availability cluster,HAC)。高性能集群(High performance cluster,HPC),它是利用一個(gè)集群中的多臺(tái)機(jī)器共同完成同一件任務(wù),使得完成任務(wù)的速度和可靠性都遠(yuǎn)遠(yuǎn)高于單機(jī)運(yùn)行的效果。彌補(bǔ)了單機(jī)性能上的不

44、足。該集群在天氣預(yù)報(bào)、環(huán)境監(jiān)控等數(shù)據(jù)量大,計(jì)算復(fù)雜的環(huán)境中應(yīng)用比較多;負(fù)載均衡集群(Load balance cluster, LBC),它是利用一個(gè)集群中的多臺(tái)單機(jī),完成許多并行的小的工作。一般情況下,如果一個(gè)應(yīng)用使用的人多了,那么用戶請(qǐng)求的響應(yīng)時(shí)間就會(huì)增大,機(jī)器的性能也會(huì)受到影響,如果使用負(fù)載均衡集群,那么集群中任意一臺(tái)機(jī)器都能響應(yīng)用戶的請(qǐng)求,這樣集群就會(huì)在用戶發(fā)出服務(wù)請(qǐng)求之后,選擇當(dāng)時(shí)負(fù)載最小,能夠提供最好的服務(wù)的這臺(tái)機(jī)器來(lái)接受請(qǐng)求并相應(yīng),這樣就可用用集群來(lái)增加系統(tǒng)的可用性和穩(wěn)定性。這類(lèi)集群在網(wǎng)站中使用較多;高可用性集群(High availability cluster,HAC),它是

45、利用集群中系統(tǒng) 的冗余,當(dāng)系統(tǒng)中某臺(tái)機(jī)器發(fā)生損壞的時(shí)候,其他后備的機(jī)器可以迅速的接替它來(lái)啟動(dòng)服務(wù),等待故障機(jī)的維修和返回。最大限度的保證集群中服務(wù)的可用性。這類(lèi)系統(tǒng)一般在銀行,電信服務(wù)這類(lèi)對(duì)系統(tǒng)可靠性有高的要求的領(lǐng)域有著廣泛的應(yīng)用。2 數(shù)據(jù)庫(kù)集群的現(xiàn)狀數(shù)據(jù)庫(kù)集群是將計(jì)算機(jī)集群技術(shù)引入到數(shù)據(jù)庫(kù)中來(lái)實(shí)現(xiàn)的,盡管各廠商宣稱(chēng)自己的架構(gòu)如何的完美,但是始終不能改變Oracle當(dāng)先,大家追逐的事實(shí),在集群的解決方案上Oracle RAC還是領(lǐng)先于包括微軟在內(nèi)的其它數(shù)據(jù)庫(kù)廠商,它能滿足客戶高可用性、高性能、數(shù)據(jù)庫(kù)負(fù)載均衡和方便擴(kuò)展的需求。Oracles Real Application Cluster (R

46、AC)Microsoft SQL Cluster Server (MSCS)IBMs DB2 UDB High Availability Cluster(UDB)Sybase ASE High Availability Cluster (ASE)MySQL High Availability Cluster (MySQL CS)3 基于IO的第三方HA(高可用性)集群當(dāng)前主要的數(shù)據(jù)庫(kù)集群技術(shù)有以上六大類(lèi),有數(shù)據(jù)庫(kù)廠商自己開(kāi)發(fā)的;也有第三方的集群公司開(kāi)發(fā)的;還有數(shù)據(jù)庫(kù)廠商與第三方集群公司合作開(kāi)發(fā)的,各類(lèi)集群實(shí)現(xiàn)的功能及架構(gòu)也不盡相同。RAC(Real Application Cluster,真正

47、應(yīng)用集群)是Oracle9i數(shù)據(jù)庫(kù)中采用的一項(xiàng)新技術(shù),也是Oracle數(shù)據(jù)庫(kù)支持網(wǎng)格計(jì)算環(huán)境的核心技術(shù)。它的出現(xiàn)解決了傳統(tǒng)數(shù)據(jù)庫(kù)應(yīng)用中面臨的一個(gè)重要問(wèn)題:高性能、高可伸縮性與低價(jià)格之間的矛盾。在很長(zhǎng)一段時(shí)間里,甲骨文都以其實(shí)時(shí)應(yīng)用集群技術(shù)(Real Application Cluster,RAC)統(tǒng)治著集群數(shù)據(jù)庫(kù)市場(chǎng)六:高并發(fā)高負(fù)載網(wǎng)站的系統(tǒng)架構(gòu)之緩存緩存一詞搞技術(shù)的都接觸過(guò),很多地方用到緩存。網(wǎng)站架構(gòu)和網(wǎng)站開(kāi)發(fā)中的緩存也是非常重要。這里先講述最基本的兩種緩存。高級(jí)和分布式的緩存在后面講述。架構(gòu)方面的緩存,對(duì)Apache比較熟悉的人都能知道Apache提供了自己的緩存模塊,也可以使用外加的Sq

48、uid模塊進(jìn)行緩存,這兩種方式均可以有效的提高Apache的訪問(wèn)響應(yīng)能力。網(wǎng)站程序開(kāi)發(fā)方面的緩存,Linux上提供的Memory Cache是常用的緩存接口,可以在web開(kāi)發(fā)中使用,比如用Java開(kāi)發(fā)的時(shí)候就可以調(diào)用MemoryCache對(duì)一些數(shù)據(jù)進(jìn)行緩存和通訊共享,一些大 型社區(qū)使用了這樣的架構(gòu)。另外,在使用web語(yǔ)言開(kāi)發(fā)的時(shí)候,各種語(yǔ)言基本都有自己的緩存模塊和方法,PHP有Pear的Cache模塊,Java就更多了,.net不是很熟悉,相信也肯定有。Java開(kāi)源緩存框架 JBossCache/TreeCache JBossCache是一個(gè)復(fù)制的事務(wù)處理緩存,它允許你緩存企業(yè)級(jí)應(yīng)用數(shù)據(jù)來(lái)更好

49、的改善性能。緩存數(shù)據(jù)被自動(dòng)復(fù)制,讓你輕松進(jìn)行Jboss服務(wù)器之間的集群工作。JBossCache能夠通過(guò)Jboss應(yīng)用服務(wù)或其他J2EE容器來(lái)運(yùn)行一個(gè)Mbean服務(wù),當(dāng)然,它也能獨(dú)立運(yùn)行。 JBossCache包括兩個(gè)模塊:TreeCache和TreeCacheAOP。 TreeCache -是一個(gè)樹(shù)形結(jié)構(gòu)復(fù)制的事務(wù)處理緩存。 TreeCacheAOP -是一個(gè)“面向?qū)ο蟆本彺?,它使用AOP來(lái)動(dòng)態(tài)管理POJOOSCache OSCache標(biāo)記庫(kù)由OpenSymphony設(shè)計(jì),它是一種開(kāi)創(chuàng)性的JSP定制標(biāo)記應(yīng)用,提供了在現(xiàn)有JSP頁(yè)面之內(nèi)實(shí)現(xiàn)快速內(nèi)存緩沖的功能。OSCache是個(gè)一個(gè)廣泛采用的高性能的J2EE緩存框架,OSCache能用于任何Java應(yīng)用程序的普通的緩存解決方案。OSCache有以下特點(diǎn):緩存任何對(duì)象,你可以不受限制的緩存部分jsp頁(yè)面或HTTP請(qǐng)求,任何java對(duì)象都可以緩存。 擁有全面的API-

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論