java系統高并發解決方案(轉載)

轉載博客地址:http://blog.csdn.net/zxl333/article/details/8685157

?

?

一個小型的網站,比如個人網站,可以使用最簡單的html靜態頁面就實現了,配合一些圖片達到美化效果,所有的頁面均存放在一個目錄下,這樣的網站對系統架構、性能的要求都很簡單,隨著互聯網業務的不斷豐富,網站相關的技術經過這些年的發展,已經細分到很細的方方面面,尤其對于大型網站來說,所采用的技術更是涉及面非常廣,從硬件到軟件、編程語言、數據庫、WebServer、防火墻等各個領域都有了很高的要求,已經不是原來簡單的html靜態網站所能比擬的。

大型網站,比如門戶網站。在面對大量用戶訪問、高并發請求方面,基本的解決方案集中在這樣幾個環節:使用高性能的服務器、高性能的數據庫、高效率的編程語言、還有高性能的Web容器。但是除了這幾個方面,還沒法根本解決大型網站面臨的高負載和高并發問題。

上面提供的幾個解決思路在一定程度上也意味著更大的投入,并且這樣的解決思路具備瓶頸,沒有很好的擴展性,下面我從低成本、高性能和高擴張性的角度來說說我的一些經驗。

1、HTML靜態化

其實大家都知道,效率最高、消耗最小的就是純靜態化的html頁面,所以我們盡可能使我們的網站上的頁面采用靜態頁面來實現,這個最簡單的方法其實也是最有效的方法。但是對于大量內容并且頻繁更新的網站,我們無法全部手動去挨個實現,于是出現了我們常見的信息發布系統CMS,像我們常訪問的各個門戶站點的新聞頻道,甚至他們的其他頻道,都是通過信息發布系統來管理和實現的,信息發布系統可以實現最簡單的信息錄入自動生成靜態頁面,還能具備頻道管理、權限管理、自動抓取等功能,對于一個大型網站來說,擁有一套高效、可管理的CMS是必不可少的。

除了門戶和信息發布類型的網站,對于交互性要求很高的社區類型網站來說,盡可能的靜態化也是提高性能的必要手段,將社區內的帖子、文章進行實時的靜態化,有更新的時候再重新靜態化也是大量使用的策略,像Mop的大雜燴就是使用了這樣的策略,網易社區等也是如此。

同時,html靜態化也是某些緩存策略使用的手段,對于系統中頻繁使用數據庫查詢但是內容更新很小的應用,可以考慮使用html靜態化來實現,比如論壇中論壇的公用設置信息,這些信息目前的主流論壇都可以進行后臺管理并且存儲再數據庫中,這些信息其實大量被前臺程序調用,但是更新頻率很小,可以考慮將這部分內容進行后臺更新的時候進行靜態化,這樣避免了大量的數據庫訪問請求。

2、圖片服務器分離

大家知道,對于Web服務器來說,不管是Apache、IIS還是其他容器,圖片是最消耗資源的,于是我們有必要將圖片與頁面進行分離,這是基本上大型網站都會采用的策略,他們都有獨立的圖片服務器,甚至很多臺圖片服務器。這樣的架構可以降低提供頁面訪問請求的服務器系統壓力,并且可以保證系統不會因為圖片問題而崩潰,在應用服務器和圖片服務器上,可以進行不同的配置優化,比如apache在配置ContentType的時候可以盡量少支持,盡可能少的LoadModule,保證更高的系統消耗和執行效率。

3、數據庫集群和庫表散列

大型網站都有復雜的應用,這些應用必須使用數據庫,那么在面對大量訪問的時候,數據庫的瓶頸很快就能顯現出來,這時一臺數據庫將很快無法滿足應用,于是我們需要使用數據庫集群或者庫表散列。

在數據庫集群方面,很多數據庫都有自己的解決方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是類似的方案,您使用了什么樣的DB,就參考相應的解決方案來實施即可。

上面提到的數據庫集群由于在架構、成本、擴張性方面都會受到所采用DB類型的限制,于是我們需要從應用程序的角度來考慮改善系統架構,庫表散列是常用并且最有效的解決方案。我們在應用程序中安裝業務和應用或者功能模塊將數據庫進行分離,不同的模塊對應不同的數據庫或者表,再按照一定的策略對某個頁面或者功能進行更小的數據庫散列,比如用戶表,按照用戶ID進行表散列,這樣就能夠低成本的提升系統的性能并且有很好的擴展性。sohu的論壇就是采用了這樣的架構,將論壇的用戶、設置、帖子等信息進行數據庫分離,然后對帖子、用戶按照板塊和ID進行散列數據庫和表,最終可以在配置文件中進行簡單的配置便能讓系統隨時增加一臺低成本的數據庫進來補充系統性能。

4、緩存

緩存一詞搞技術的都接觸過,很多地方用到緩存。網站架構和網站開發中的緩存也是非常重要。這里先講述最基本的兩種緩存。高級和分布式的緩存在后面講述。?
架構方面的緩存,對Apache比較熟悉的人都能知道Apache提供了自己的緩存模塊,也可以使用外加的Squid模塊進行緩存,這兩種方式均可以有效的提高Apache的訪問響應能力。?
網站程序開發方面的緩存,Linux上提供的Memory Cache是常用的緩存接口,可以在web開發中使用,比如用Java開發的時候就可以調用MemoryCache對一些數據進行緩存和通訊共享,一些大型社區使用了這樣的架構。另外,在使用web語言開發的時候,各種語言基本都有自己的緩存模塊和方法,PHP有Pear的Cache模塊,Java就更多了,.net不是很熟悉,相信也肯定有。

5、鏡像

鏡像是大型網站常采用的提高性能和數據安全性的方式,鏡像的技術可以解決不同網絡接入商和地域帶來的用戶訪問速度差異,比如ChinaNet和EduNet之間的差異就促使了很多網站在教育網內搭建鏡像站點,數據進行定時更新或者實時更新。在鏡像的細節技術方面,這里不闡述太深,有很多專業的現成的解決架構和產品可選。也有廉價的通過軟件實現的思路,比如Linux上的rsync等工具。

6、負載均衡

負載均衡將是大型網站解決高負荷訪問和大量并發請求采用的終極解決辦法。

負載均衡技術發展了多年,有很多專業的服務提供商和產品可以選擇,我個人接觸過一些解決方法,其中有兩個架構可以給大家做參考。

1)硬件四層交換

第四層交換使用第三層和第四層信息包的報頭信息,根據應用區間識別業務流,將整個區間段的業務流分配到合適的應用服務器進行處理。 第四層交換功能就象是虛IP,指向物理服務器。它傳輸的業務服從的協議多種多樣,有HTTP、FTP、NFS、Telnet或其他協議。這些業務在物理服務器基礎上,需要復雜的載量平衡算法。在IP世界,業務類型由終端TCP或UDP端口地址來決定,在第四層交換中的應用區間則由源端和終端IP地址、TCP和UDP端口共同決定。

在硬件四層交換產品領域,有一些知名的產品可以選擇,比如Alteon、F5等,這些產品很昂貴,但是物有所值,能夠提供非常優秀的性能和很靈活的管理能力。Yahoo中國當初接近2000臺服務器使用了三四臺Alteon就搞定了。

2)軟件四層交換

大家知道了硬件四層交換機的原理后,基于OSI模型來實現的軟件四層交換也就應運而生,這樣的解決方案實現的原理一致,不過性能稍差。但是滿足一定量的壓力還是游刃有余的,有人說軟件實現方式其實更靈活,處理能力完全看你配置的熟悉能力。

軟件四層交換我們可以使用Linux上常用的LVS來解決,LVS就是Linux Virtual Server,他提供了基于心跳線heartbeat的實時災難應對解決方案,提高系統的魯棒性,同時可供了靈活的虛擬VIP配置和管理功能,可以同時滿足多種應用需求,這對于分布式的系統來說必不可少。

一個典型的使用負載均衡的策略就是,在軟件或者硬件四層交換的基礎上搭建squid集群,這種思路在很多大型網站包括搜索引擎上被采用,這樣的架構低成本、高性能還有很強的擴張性,隨時往架構里面增減節點都非常容易。這樣的架構我準備空了專門詳細整理一下和大家探討。

?

?

一:高并發高負載類網站關注點之數據庫

沒錯,首先是數據庫,這是大多數應用所面臨的首個SPOF。尤其是Web2.0的應用,數據庫的響應是首先要解決的。
一般來說MySQL是最常用的,可能最初是一個mysql主機,當數據增加到100萬以上,那么,MySQL的效能急劇下降。常用的優化措施是M-S(主-從)方式進行同步復制,將查詢和操作和分別在不同的服務器上進行操作。我推薦的是M-M-Slaves方式,2個主Mysql,多個Slaves,需要注意的是,雖然有2個Master,但是同時只有1個是Active,我們可以在一定時候切換。之所以用2個M,是保證M不會又成為系統的SPOF。
Slaves可以進一步負載均衡,可以結合LVS,從而將select操作適當的平衡到不同的slaves上。
以上架構可以抗衡到一定量的負載,但是隨著用戶進一步增加,你的用戶表數據超過1千萬,這時那個M變成了SPOF。你不能任意擴充Slaves,否則復制同步的開銷將直線上升,怎么辦?我的方法是表分區,從業務層面上進行分區。最簡單的,以用戶數據為例。根據一定的切分方式,比如id,切分到不同的數據庫集群去。

全局數據庫用于meta數據的查詢。缺點是每次查詢,會增加一次,比如你要查一個用戶nightsailer,你首先要到全局數據庫群找到nightsailer對應的cluster id,然后再到指定的cluster找到nightsailer的實際數據。
每個cluster可以用m-m方式,或者m-m-slaves方式。這是一個可以擴展的結構,隨著負載的增加,你可以簡單的增加新的mysql cluster進去。

需要注意的是:
1、禁用全部auto_increment的字段
2、id需要采用通用的算法集中分配
3、要具有比較好的方法來監控mysql主機的負載和服務的運行狀態。如果你有30臺以上的mysql數據庫在跑就明白我的意思了。
4、不要使用持久性鏈接(不要用pconnect),相反,使用sqlrelay這種第三方的數據庫鏈接池,或者干脆自己做,因為php4中mysql的鏈接池經常出問題。

二:高并發高負載網站的系統架構之HTML靜態化

其實大家都知道,效率最高、消耗最小的就是純靜態化?http://www.ablanxue.com/shtml/201207/776.shtml的html頁面,所以我們盡可能使我們的網站上的頁面采用靜態頁面來實現,這個最簡單的方法其實也是 最有效的方法。但是對于大量內容并且頻繁更新的網站,我們無法全部手動去挨個實現,于是出現了我們常見的信息發布系統CMS,像我們常訪問的各個門戶站點 的新聞頻道,甚至他們的其他頻道,都是通過信息發布系統來管理和實現的,信息發布系統可以實現最簡單的信息錄入自動生成靜態頁面,還能具備頻道管理、權限 管理、自動抓取等功能,對于一個大型網站來說,擁有一套高效、可管理的CMS是必不可少的。
  
  除了門戶和信息發布類型的網站,對于交互性要求很高的社區類型網站來說,盡可能的靜態化也是提高性能的必要手段,將社區內的帖子、文章進行實時的靜態化,有更新的時候再重新靜態化也是大量使用的策略,像Mop的大雜燴就是使用了這樣的策略,網易社區等也是如此。
  
   同時,html靜態化也是某些緩存策略使用的手段,對于系統中頻繁使用數據庫查詢但是內容更新很小的應用,可以考慮使用html靜態化來實現,比如論壇 中論壇的公用設置信息,這些信息目前的主流論壇都可以進行后臺管理并且存儲再數據庫中,這些信息其實大量被前臺程序調用,但是更新頻率很小,可以考慮將這 部分內容進行后臺更新的時候進行靜態化,這樣避免了大量的數據庫訪問請求高并發。
  

網站HTML靜態化解決方案?
當一個Servlet資源請求到達WEB服務器之后我們會填充指定的JSP頁面來響應請求:

HTTP請求---Web服務器---Servlet--業務邏輯處理--訪問數據--填充JSP--響應請求

HTML靜態化之后:

HTTP請求---Web服務器---Servlet--HTML--響應請求

靜態訪求如下

Servlet:

public void doGet(HttpServletRequest request, HttpServletResponse response)??
??????? throws ServletException, IOException {??
??? if(request.getParameter("chapterId") != null){??
??????? String chapterFileName = "bookChapterRead_"+request.getParameter("chapterId")+".html";??
??????? String chapterFilePath = getServletContext().getRealPath("/") + chapterFileName;??
??????? File chapterFile = new File(chapterFilePath);??
??????? if(chapterFile.exists()){response.sendRedirect(chapterFileName);return;}//如果有這個文件就告訴瀏覽器轉向???
??????? INovelChapterBiz novelChapterBiz = new NovelChapterBizImpl();??
??????? NovelChapter novelChapter = novelChapterBiz.searchNovelChapterById(Integer.parseInt(request.getParameter("chapterId")));//章節信息???
??????? int lastPageId = novelChapterBiz.searchLastCHapterId(novelChapter.getNovelId().getId(), novelChapter.getId());??
??????? int nextPageId = novelChapterBiz.searchNextChapterId(novelChapter.getNovelId().getId(), novelChapter.getId());??
??????? request.setAttribute("novelChapter", novelChapter);??
??????? request.setAttribute("lastPageId", lastPageId);??
??????? request.setAttribute("nextPageId", nextPageId);??
??????? new CreateStaticHTMLPage().createStaticHTMLPage(request, response, getServletContext(),???
??????????????? chapterFileName, chapterFilePath, "/bookRead.jsp");??
??? }??
}??
生成HTML靜態頁面的類:

package com.jb.y2t034.thefifth.web.servlet;??
import java.io.ByteArrayOutputStream;??
import java.io.FileOutputStream;??
import 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 javax.servlet.http.HttpServletResponse;??
import javax.servlet.http.HttpServletResponseWrapper;??
/**?
* 創建HTML靜態頁面?
* 功能:創建HTML靜態頁面?
* 時間:2009年1011日?
* 地點:home?
* @author mavk?
*?
*/??
public class CreateStaticHTMLPage {??
??? /**?
???? * 生成靜態HTML頁面的方法?
???? * @param request 請求對象?
???? * @param response 響應對象?
???? * @param servletContext Servlet上下文?
???? * @param fileName 文件名稱?
???? * @param fileFullPath 文件完整路徑?
???? * @param jspPath 需要生成靜態文件的JSP路徑(相對即可)?
???? * @throws IOException?
???? * @throws ServletException?
???? */??
??? public void createStaticHTMLPage(HttpServletRequest request, HttpServletResponse response,ServletContext servletContext,String fileName,String fileFullPath,String jspPath) throws ServletException, IOException{??
??????? response.setContentType("text/html;charset=gb2312");//設置HTML結果流編碼(即HTML文件編碼)???
??????? RequestDispatcher rd = servletContext.getRequestDispatcher(jspPath);//得到JSP資源???
??????? final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();//用于從ServletOutputStream中接收資源???
??????? 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 PrintWriter(new OutputStreamWriter(byteArrayOutputStream));//把轉換字節流轉換成字符流???
??????? HttpServletResponse httpServletResponse = new HttpServletResponseWrapper(response){//用于從response獲取結果流資源(重寫了兩個方法)???
??????????? public ServletOutputStream getOutputStream(){??
??????????????? return servletOuputStream;??
??????????? }??
??????????? public PrintWriter getWriter(){??
??????????????? return printWriter;??
??????????? }??
??????? };??
??????? rd.include(request, httpServletResponse);//發送結果流???
??????? printWriter.flush();//刷新緩沖區,把緩沖區的數據輸出???
??????? FileOutputStream fileOutputStream = new FileOutputStream(fileFullPath);??
??????? byteArrayOutputStream.writeTo(fileOutputStream);//把byteArrayOuputStream中的資源全部寫入到fileOuputStream中???
??????? fileOutputStream.close();//關閉輸出流,并釋放相關資源???
??????? response.sendRedirect(fileName);//發送指定文件流到客戶端???
??? }??
}?

三:高并發高負載類網站關注點之緩存、負載均衡、存儲

緩存是另一個大問題,我一般用memcached來做緩存集群,一般來說部署10臺左右就差不多(10g內存池)。需要注意一點,千萬不能用使用
swap,最好關閉linux的swap。


負載均衡/加速

可能上面說緩存的時候,有人第一想的是頁面靜態化,所謂的靜態html,我認為這是常識,不屬于要點了。頁面的靜態化隨之帶來的是靜態服務的
負載均衡和加速。我認為Lighttped+Squid是最好的方式了。
LVS <------->lighttped====>squid(s) ====lighttpd

上面是我經常用的。注意,我沒有用apache,除非特定的需求,否則我不部署apache,因為我一般用php-fastcgi配合lighttpd,
性能比apache+mod_php要強很多。

squid的使用可以解決文件的同步等等問題,但是需要注意,你要很好的監控緩存的命中率,盡可能的提高的90%以上。
squid和lighttped也有很多的話題要討論,這里不贅述。


存儲
存儲也是一個大問題,一種是小文件的存儲,比如圖片這類。另一種是大文件的存儲,比如搜索引擎的索引,一般單文件都超過2g以上。
小文件的存儲最簡單的方法是結合lighttpd來進行分布。或者干脆使用Redhat的GFS,優點是應用透明,缺點是費用較高。我是指
你購買盤陣的問題。我的項目中,存儲量是2-10Tb,我采用了分布式存儲。這里要解決文件的復制和冗余。
這樣每個文件有不同的冗余,這方面可以參考google的gfs的論文。
大文件的存儲,可以參考nutch的方案,現在已經獨立為hadoop子項目。(你可以google it)

其他:
此外,passport等也是考慮的,不過都屬于比較簡單的了。
四:高并發高負載網站的系統架構之圖片服務器分離?
大家知道,對于Web 服務器來說,不管是Apache、IIS還是其他容器,圖片是最消耗資源的,于是我們有必要將圖片與頁面進行分離,這是基本上大型網站都會采用的策略,他 們都有獨立的圖片服務器,甚至很多臺圖片服務器。這樣的架構可以降低提供頁面訪問請求的服務器系統壓力,并且可以保證系統不會因為圖片問題而崩潰,在應用 服務器和圖片服務器上,可以進行不同的配置優化,比如apache在配置ContentType的時候可以盡量少支持,盡可能少的LoadModule, 保證更高的系統消耗和執行效率。


利用Apache實現圖片服務器的分離
緣由:?
起步階段的應用,都可能部署在一臺服務器上(費用上的原因)?
第一個優先分離的,肯定是數據庫和應用服務器。?
第二個分離的,會是什么呢?各有各的考慮,我所在的項目組重點考慮的節約帶寬,服務器性能再好,帶寬再高,并發來了,也容易撐不住。因此,我這篇文章的重點在這里。這里重點是介紹實踐,不一定符合所有情況,供看者參考吧,?
環境介紹:?
WEB應用服務器:4CPU雙核2G, 內存4G?
? 部署:Win2003/Apache Http Server 2.1/Tomcat6?
數據庫服務器:4CPU雙核2G, 內存4G?
? 部署:Win2003/MSSQL2000?
步驟:?
步驟一:增加2臺配置為:2CPU雙核2G,內存2G普通服務器,做資源服務器?
? 部署:Tomcat6,跑了一個圖片上傳的簡單應用,(記得指定web.xml的<distributable/>),并指定域名為res1.***.com,res2.***.com,采用ajp協議?
步驟二:修改Apache httpd.conf配置?
? 原來應用的文件上傳功能網址為:?
?? 1、/fileupload.html?
?? 2、/otherupload.html?
? 在httpd.conf中增加如下配置

<VirtualHost *:80>???
? ServerAdmin webmaster@***.com???
? ProxyPass /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??????
? #<!--負載均衡-->???
? <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>??
步驟三,修改業務邏輯:?
? 所有上傳文件在數據庫中均采用全url的方式保存,例如產品圖片路徑存成:http://res1.***.com/upload/20090101/product120302005.jpg

現在,你可以高枕無憂了,帶寬不夠時,增加個幾十臺圖片服務器,只需要稍微修改一下apache的配置文件,即可。

五:高并發高負載網站的系統架構之數據庫集群和庫表散列

大型網站都有復雜的應用,這些應用必須使用數據庫,那么在面對大量訪問的時候,數據庫的瓶頸很快就能顯現出來,這時一臺數據庫將很快無法滿足應用,于是我們需要使用數據庫集群或者庫表散列。
  
  在數據庫集群方面,很多數據庫都有自己的解決方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是類似的方案,您使用了什么樣的DB,就參考相應的解決方案來實施即可。
  
   上面提到的數據庫集群由于在架構、成本、擴張性方面都會受到所采用DB類型的限制,于是我們需要從應用程序的角度來考慮改善系統架構,庫表散列是常用并 且最有效的解決方案。我們在應用程序中安裝業務和應用或者功能模塊將數據庫進行分離,不同的模塊對應不同的數據庫或者表,再按照一定的策略對某個頁面或者 功能進行更小的數據庫散列,比如用戶表,按照用戶ID進行表散列,這樣就能夠低成本的提升系統的性能并且有很好的擴展性。sohu的論壇就是采用了這樣的 架構,將論壇的用戶、設置、帖子等信息進行數據庫分離,然后對帖子、用戶按照板塊和ID進行散列數據庫和表,最終可以在配置文件中進行簡單的配置便能讓系 統隨時增加一臺低成本的數據庫進來補充系統性能。


集群軟件的分類:
一般來講,集群軟件根據側重的方向和試圖解決的問題,分為三大類:高性能集群(High performance cluster,HPC)、負載均衡集群(Load balance cluster, LBC),高可用性集群(High availability cluster,HAC)。
高性能集群(High performance cluster,HPC),它是利用一個集群中的多臺機器共同完成同一件任務,使得完成任務的速度和可靠性都遠遠高于單機運行的效果。彌補了單機性能上的不足。該集群在天氣預報、環境監控等數據量大,計算復雜的環境中應用比較多;
負載均衡集群(Load balance cluster, LBC),它是利用一個集群中的多臺單機,完成許多并行的小的工作。一般情況下,如果一個應用使用的人多了,那么用戶請求的響應時間就會增大,機器的性能也會受到影響,如果使用負載均衡集群,那么集群中任意一臺機器都能響應用戶的請求,這樣集群就會在用戶發出服務請求之后,選擇當時負載最小,能夠提供最好的服務的這臺機器來接受請求并相應,這樣就可用用集群來增加系統的可用性和穩定性。這類集群在網站中使用較多;
高可用性集群(High availability cluster,HAC),它是利用集群中系統 的冗余,當系統中某臺機器發生損壞的時候,其他后備的機器可以迅速的接替它來啟動服務,等待故障機的維修和返回。最大限度的保證集群中服務的可用性。這類系統一般在銀行,電信服務這類對系統可靠性有高的要求的領域有著廣泛的應用。
2 數據庫集群的現狀
數據庫集群是將計算機集群技術引入到數據庫中來實現的,盡管各廠商宣稱自己的架構如何的完美,但是始終不能改變Oracle當先,大家追逐的事實,在集群的解決方案上Oracle RAC還是領先于包括微軟在內的其它數據庫廠商,它能滿足客戶高可用性、高性能、數據庫負載均衡和方便擴展的需求。
Oracle’s Real Application Cluster (RAC)
Microsoft SQL Cluster Server (MSCS)
IBM’s DB2 UDB High Availability Cluster(UDB)
Sybase ASE High Availability Cluster (ASE)
MySQL High Availability Cluster (MySQL CS)
基于IO的第三方HA(高可用性)集群
當前主要的數據庫集群技術有以上六大類,有數據庫廠商自己開發的;也有第三方的集群公司開發的;還有數據庫廠商與第三方集群公司合作開發的,各類集群實現的功能及架構也不盡相同。
RAC(Real Application Cluster,真正應用集群)是Oracle9i數據庫中采用的一項新技術,也是Oracle數據庫支持網格計算環境的核心技術。它的出現解決了傳統數據庫應用中面臨的一個重要問題:高性能、高可伸縮性與低價格之間的矛盾。在很長一段時間里,甲骨文都以其實時應用集群技術(Real Application Cluster,RAC)統治著集群數據庫市場

六:高并發高負載網站的系統架構之緩存

緩存一詞搞技術的都接觸過,很多地方用到緩存。網站架構和網站開發中的緩存也是非常重要。這里先講述最基本的兩種緩存。高級和分布式的緩存在后面講述。?
  架構方面的緩存,對Apache比較熟悉的人都能知道Apache提供了自己的緩存模塊,也可以使用外加的Squid模塊進行緩存,這兩種方式均可以有效的提高Apache的訪問響應能力。
   網站程序開發方面的緩存,Linux上提供的Memory Cache是常用的緩存接口,可以在web開發中使用,比如用Java開發的時候就可以調用MemoryCache對一些數據進行緩存和通訊共享,一些大 型社區使用了這樣的架構。另外,在使用web語言開發的時候,各種語言基本都有自己的緩存模塊和方法,PHP有Pear的Cache模塊,Java就更多 了,.net不是很熟悉,相信也肯定有。

?

Java開源緩存框架?
JBossCache/TreeCache JBossCache是一個復制的事務處理緩存,它允許你緩存企業級應用數據來更好的改善性能。緩存數據被自動復制,讓你輕松進行Jboss服務器之間的集群工作。JBossCache能夠通過Jboss應用服務或其他J2EE容器來運行一個Mbean服務,當然,它也能獨立運行。 JBossCache包括兩個模塊:TreeCache和TreeCacheAOP。 TreeCache --是一個樹形結構復制的事務處理緩存。 TreeCacheAOP --是一個“面向對象”緩存,它使用AOP來動態管理POJO
OSCache OSCache標記庫由OpenSymphony設計,它是一種開創性的JSP定制標記應用,提供了在現有JSP頁面之內實現快速內存緩沖的功能。OSCache是個一個廣泛采用的高性能的J2EE緩存框架,OSCache能用于任何Java應用程序的普通的緩存解決方案。OSCache有以下特點:緩存任何對象,你可以不受限制的緩存部分jsp頁面或HTTP請求,任何java對象都可以緩存。 擁有全面的API--OSCache API給你全面的程序來控制所有的OSCache特性。 永久緩存--緩存能隨意的寫入硬盤,因此允許昂貴的創建(expensive-to-create)數據來保持緩存,甚至能讓應用重啟。 支持集群--集群緩存數據能被單個的進行參數配置,不需要修改代碼。 緩存記錄的過期--你可以有最大限度的控制緩存對象的過期,包括可插入式的刷新策略(如果默認性能不需要時)。
JCACHE JCACHE是一種即將公布的標準規范(JSR 107),說明了一種對Java對象臨時在內存中進行緩存的方法,包括對象的創建、共享訪問、假脫機(spooling)、失效、各JVM的一致性等。它可被用于緩存JSP內最經常讀取的數據,如產品目錄和價格列表。利用JCACHE,多數查詢的反應時間會因為有緩存的數據而加快(內部測試表明反應時間大約快15倍)。
Ehcache Ehcache出自Hibernate,在Hibernate中使用它作為數據緩存的解決方案。
Java Caching System JCS是Jakarta的項目Turbine的子項目。它是一個復合式的緩沖工具。可以將對象緩沖到內存、硬盤。具有緩沖對象時間過期設定。還可以通過JCS構建具有緩沖的分布式構架,以實現高性能的應用。 對于一些需要頻繁訪問而每訪問一次都非常消耗資源的對象,可以臨時存放在緩沖區中,這樣可以提高服務的性能。而JCS正是一個很好的緩沖工具。緩沖工具對于讀操作遠遠多于寫操作的應用性能提高非常顯著。
SwarmCache SwarmCache是一個簡單而功能強大的分布式緩存機制。它使用IP組播來有效地在緩存的實例之間進行通信。它是快速提高集群式Web應用程序的性能的理想選擇。
ShiftOne ShiftOne Object Cache這個Java庫提供了基本的對象緩存能力。實現的策略有先進先出(FIFO),最近使用(LRU),最不常使用(LFU)。所有的策略可以最大化元素的大小,最大化其生存時間。
WhirlyCache Whirlycache是一個快速的、可配置的、存在于內存中的對象的緩存。它能夠通過緩存對象來加快網站或應用程序的速度,否則就必須通過查詢數據庫或其他代價較高的處理程序來建立。
Jofti Jofti可對在緩存層中(支持EHCache,JBossCache和OSCache)的對象或在支持Map接口的存儲結構中的對象進行索引與搜索。這個框架還為對象在索引中的增刪改提供透明的功能同樣也為搜索提供易于使用的查詢功能。
cache4j cache4j是一個有簡單API與實現快速的Java對象緩存。它的特性包括:在內存中進行緩存,設計用于多線程環境,兩種實現:同步與阻塞,多種緩存清除策略:LFU, LRU, FIFO,可使用強引用(strong reference)與軟引用(soft reference)存儲對象。
Open Terracotta 一個JVM級的開源群集框架,提供:HTTP Session復制,分布式緩存,POJO群集,跨越群集的JVM來實現分布式應用程序協調(采用代碼注入的方式,所以你不需要修改任何)。
sccache SHOP.COM使用的對象緩存系統。sccache是一個in-process cache和二級、共享緩存。它將緩存對象存儲到磁盤上。支持關聯Key,任意大小的Key和任意大小的數據。能夠自動進行垃圾收集。
Shoal Shoal是一個基于Java可擴展的動態集群框架,能夠為構建容錯、可靠和可用的Java應用程序提供了基礎架構支持。這個框架還可以集成到不希望綁定到特定通信協議,但需要集群和分布式系統支持的任何Java產品中。Shoal是GlassFish和JonAS應用服務器的集群引擎。
Simple-Spring-Memcached Simple-Spring-Memcached,它封裝了對MemCached的調用,使MemCached的客戶端開發變得超乎尋常的簡單。

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

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

相關文章

Request/Response【學習筆記03】

Request Request 部分源碼&#xff1a; # 部分代碼 class Request(object_ref):def __init__(self, url, callbackNone, methodGET, headersNone, bodyNone, cookiesNone, metaNone, encodingutf-8, priority0,dont_filterFalse, errbackNone):self._encoding encoding # t…

TotoiseSVN的上手教程

本文轉自&#xff1a;http://www.cnblogs.com/xilentz/archive/2010/05/06/1728945.html TotoiseSVN的基本使用方法&#xff1a; 一、簽入源代碼到SVN服務器 假如我們使用Visual Studio在文件夾StartKit中創建了一個項目&#xff0c;我們要把這個項目的源代碼簽入到SVN Serv…

ALV可輸入狀態下輸入金額字段變小數的問題

http://blog.163.com/mxb_sapyeah/blog/static/10335262520167109022155/ 小數位數兩位 當我在給ALV上給該字段輸入整數 ‘1234 ‘ 時&#xff0c;該數據居然會默認變成‘12.34’ 可以在這里解決這個問題。就是定義字段目錄的時候&#xff0c;對于金額字段指定參考數據類型就…

Downloader Middlewares反反爬蟲【學習筆記04】

反反爬蟲相關機制 Some websites implement certain measures to prevent bots from crawling them, with varying degrees of sophistication. Getting around those measures can be difficult and tricky, and may sometimes require special infrastructure. Please consi…

【轉載】Android 關于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容問題

轉自&#xff1a;【歐陽鵬】http://blog.csdn.net/ouyang_peng Android 設備的CPU類型(通常稱為”ABIs”) armeabiv-v7a: 第7代及以上的 ARM 處理器。2011年15月以后的生產的大部分Android設備都使用它.arm64-v8a: 第8代、64位ARM處理器&#xff0c;很少設備&#xff0c;三星 G…

HDFS的簡介及基本操作(常用的命令參數介紹)

目錄前言&#xff1a;1、HDFS基本概念2、HDFS基本操作總結&#xff1a; 目錄 前言&#xff1a; 總算有空來接著寫大數據的學習筆記了&#xff0c;今天就把之前學過的HDFS的基礎知識詳細的介紹一下&#xff0c;如有哪點寫的不足希望大家多多指教。 1、HDFS基本概念 1.1、前…

Settings【學習筆記05】

Settings Scrapy設置(settings)提供了定制Scrapy組件的方法。可以控制包括核心(core)&#xff0c;插件(extension)&#xff0c;pipeline及spider組件。比如 設置Json Pipeliine、LOG_LEVEL等。 參考文檔&#xff1a;http://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/setti…

java命令

javac.exe是編譯.java文件java.exe是執行編譯好的.class文件javadoc.exe是生成Java說明文檔jdb.exe是Java調試器javaprof.exe是剖析工具轉載于:https://www.cnblogs.com/Berryxiong/p/6143016.html

TensorFlow訓練單特征和多特征的線性回歸

線性回歸 線性回歸是很常見的一種回歸&#xff0c;線性回歸可以用來預測或者分類&#xff0c;主要解決線性問題。相關知識可看“相關閱讀”。 主要思想 在TensorFlow中進行線性回歸處理重點是將樣本和樣本特征矩陣化。 單特征線性回歸 單特征回歸模型為&#xff1a;ywxb 構建模…

大數據之HDFS應用開發(java API)

目錄1、搭建開發環境2、獲取api中的客戶端對象3、DistributedFileSystem實例對象所具備的方法4、HDFS客戶端操作數據代碼示例 目錄 1、搭建開發環境 window下開發的說明: A、在windows的某個目錄下解壓一個hadoop的安裝包 B、將安裝包下的lib和bin目錄用對應windows版本平…

shell腳本執行方式,更方便更快捷。

在進行linux測試時編寫腳本是必不可少的。最近經常使用Linux&#xff0c;感覺太頻繁地敲擊鍵盤有些累了&#xff0c;于是想到了Shell腳本。可以把太多的命令寫成一個腳本&#xff0c;這樣每次執行一遍 shell文件&#xff0c;就可以省去了敲擊鍵盤的時間。于是在網上搜了一些有…

行為科學統計第1章

行為科學統計 Statistics for the Behavioral Sciences 一周只學習一次不如每周學習比較多的幾次高效噢&#xff5e;&#xff3b;一開始&#xff0c;你并不知道這是一個會寫著畫風突變的讀書筆記?…&#xff3d; 第I部分 簡述與描述性統計 第1章 統計學入門 這本書我就是覺得這…

閉包---在函數內部再定義一個函數

什么是閉包 # 定義一個函數 def test(number):# 在函數內部再定義一個函數&#xff0c;并且這個函數用到了外邊函數的變量&#xff0c;那么將這個函數以及用到的一些變量稱之為閉包def test_in(number_in):print("in test_in 函數, number_in is %d" % number_in)re…

慕課網_《Java實現對稱加密》學習總結

時間&#xff1a;2017年4月11日星期二說明&#xff1a;本文部分內容均來自慕課網。慕課網&#xff1a;http://www.imooc.com教學示例源碼&#xff1a;https://github.com/zccodere/s...個人學習源碼&#xff1a;https://github.com/zccodere/s... 第一章&#xff1a;對稱加密算…

大數據之MapReduce詳解(MR的運行機制及配合WordCount實例來說明運行機制)

目錄前言&#xff1a;1、MapReduce原理2、mapreduce實踐&#xff08;WordCount實例&#xff09; 目錄 今天先總體說下MapReduce的相關知識&#xff0c;后續將會詳細說明對應的shuffle、mr與yarn的聯系、以及mr的join操作的等知識。以下內容全是個人學習后的見解&#xff0c;如…

生動形象的理解什么是裝飾器!

裝飾器 裝飾器是程序開發中經常會用到的一個功能&#xff0c;用好了裝飾器&#xff0c;開發效率如虎添翼&#xff0c;所以這也是Python面試中必問的問題&#xff0c;但對于好多初次接觸這個知識的人來講&#xff0c;這個功能有點繞&#xff0c;自學時直接繞過去了&#xff0c;…

PLSQL 申明和游標

--從鍵盤輸入一個數 accept b prompt 請輸入一個大于零的數字; declareanum number : &b; beginwhile anum>0loopdbms_output.put_line(anum);anum:anum-1;end loop; end;declarev_num number; begin -- 從stsu表中選出id最大的值&#xff0c;并根據該值打印次數select …

20155222 2016-2017-2 《Java程序設計》第8周學習總結

20155222 2016-2017-2 《Java程序設計》第8周學習總結 教材學習內容總結 Java NIO(New IO)是一個可以替代標準Java IO API的IO API&#xff08;從Java 1.4開始)&#xff0c;Java NIO提供了與標準IO不同的IO工作方式。 Java NIO: Channels and Buffers&#xff08;通道和緩沖區&…

BAT經典面試題精簡版(基礎知識附答案)

文章目錄目錄J2SE基礎JVM操作系統TCP/IP數據結構與算法目錄 J2SE基礎 九種基本數據類型的大小&#xff0c;以及他們的封裝類。 原始類型封裝類 booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble Switch能否用string做參數&…

使用2to3.py 轉換 python2.x 代碼 到python3

1.使用Windows 命令提示符&#xff08;cmd&#xff09;cd到2to3.py 腳本所在位置&#xff0c;如下圖&#xff1a; 找不到的2 to 3.py的去 pycharm中雙擊shift搜索一下 2.緊接著運行 2to3.py 腳本&#xff08;可省略&#xff09; 3.執行你想要轉換的文件 python 2to3.py -w H:…