In diesem Artikel werden hauptsächlich Lösungen mit hoher Parallelität für Java-Systeme vorgestellt. Der Inhalt ist sehr umfangreich und ich teile ihn mit allen, die ihn benötigen.
Eine kleine Website, z. B. eine persönliche Website, kann mit der einfachsten statischen HTML-Seite implementiert werden, mit einigen Bildern, um einen verschönernden Effekt zu erzielen. Alle Seiten werden in einem Verzeichnis gespeichert Die Anforderungen an die Systemarchitektur sind sehr einfach. Mit der kontinuierlichen Weiterentwicklung von Internetunternehmen sind die verwendeten Technologien nach Jahren der Entwicklung noch komplexer geworden Breit, von Hardware bis Software, Programmiersprache, MySQL" target="_blank" title="MySQL Knowledge Base"> Datenbank, Webserver, Firewall und andere Bereiche stellen sehr hohe Anforderungen, es handelt sich nicht mehr um das ursprüngliche einfache statische HTML
Große Websites, wie z. B. Portale, sind mit einer großen Anzahl von Benutzerbesuchen und einer hohen Anzahl gleichzeitiger Anfragen konfrontiert. Die grundlegenden Lösungen konzentrieren sich auf die folgenden Links: Verwendung von Hochleistungsservern, Hochleistungsdatenbanken und hoher Effizienz Programmiersprachen und leistungsstarke Webcontainer, aber abgesehen von diesen Aspekten können sie die Probleme mit hoher Last und hoher Parallelität, mit denen große Websites konfrontiert sind, nicht grundsätzlich lösen
Die verschiedenen oben aufgeführten Lösungsideen bedeuten auch mehr Investitionen sind bis zu einem gewissen Grad erforderlich, und solche Lösungsideen haben Engpässe und keine gute Skalierbarkeit. Im Folgenden werde ich sie unter dem Gesichtspunkt niedriger Kosten, hoher Leistung und hoher Skalierbarkeit diskutieren.
1. HTML-Statik
Tatsächlich weiß jeder, dass die effizienteste und kostengünstigste Methode reine HTML-Seiten sind, deshalb versuchen wir, statische Seiten zu verwenden Für die Seiten auf unserer Website ist diese Methode tatsächlich die effektivste. Bei Websites mit einer großen Menge an Inhalten und häufigen Aktualisierungen können wir jedoch nicht alles einzeln implementieren, daher verwenden wir ein gemeinsames Informationsfreigabesystem Die Nachrichtenkanäle verschiedener Portalseiten, die wir häufig besuchen, und sogar ihre anderen Kanäle werden über das Informationsfreigabesystem verwaltet und implementiert. Das Informationsfreigabesystem kann die einfachste Informationseingabe durchführen und statische Seiten automatisch generieren über Funktionen wie Kanalverwaltung, Rechteverwaltung und automatisches Crawling verfügen. Für eine große Website ist ein effizientes und verwaltbares CMS unerlässlich.
Außerdem für Websites vom Typ Portal und Informationsveröffentlichung, für Websites vom Typ Community mit hohen Anforderungen an die Interaktivität. So statisch wie möglich zu sein, ist auch ein notwendiges Mittel, um die Leistung zu verbessern. Beiträge und Artikel in der Community sollten in Echtzeit statisch gemacht werden, und wenn es Aktualisierungen gibt, nutzt Mops Sammelsurium diese Strategie ebenfalls
Gleichzeitig ist die HTML-Statisierung auch eine Methode, die von einigen Caching-Strategien verwendet wird. Für Anwendungen im System, die häufig Datenbankabfragen verwenden, aber nur sehr kleine Inhaltsaktualisierungen aufweisen, können Sie die Verwendung von HTML in Betracht ziehen Statische Implementierung, z. B. öffentliche Einstellungsinformationen in Foren. Diese Informationen können von aktuellen Mainstream-Foren im Hintergrund verwaltet und in der Datenbank gespeichert werden. Tatsächlich wird ein großer Teil dieser Informationen vom Vordergrundprogramm abgerufen, die Aktualisierungshäufigkeit ist jedoch unterschiedlich sehr klein Sie können erwägen, diesen Teil des Inhalts bei der Aktualisierung im Hintergrund statisch zu machen, um eine große Anzahl von Datenbankzugriffsanfragen zu vermeiden.
2. Image-Server-Trennung
Wie wir alle wissen, sind Bilder für Webserver, egal ob es sich um Apache, IIS oder andere Container handelt Das Wichtigste ist, dass es Ressourcen verbraucht, daher müssen wir Bilder von Seiten trennen. Dies ist eine Strategie, die grundsätzlich von großen Websites übernommen wird. Sie verfügen alle über unabhängige Bildserver oder sogar über viele Bildserver. Eine solche Architektur kann den Druck auf das Serversystem verringern, das Seitenzugriffsanforderungen bereitstellt, und sicherstellen, dass das System nicht aufgrund von Bildproblemen abstürzt. Auf dem Anwendungsserver und dem Bildserver können beispielsweise verschiedene Konfigurationsoptimierungen durchgeführt werden Versuchen Sie Ihr Bestes, wenn Sie ContentType so wenig wie möglich konfigurieren und so wenige LoadModules wie möglich verwenden, um einen höheren Systemverbrauch und eine höhere Ausführungseffizienz sicherzustellen.
3. Datenbankcluster und Datenbanktabellen-Hashing
Große Websites verfügen über komplexe Anwendungen, und diese Anwendungen müssen Datenbanken verwenden Wenn eine große Anzahl von Zugriffen auftritt, tritt bald ein Engpass in der Datenbank auf. Zu diesem Zeitpunkt kann eine Datenbank die Anwendung bald nicht mehr erfüllen, sodass wir Datenbank-Clustering oder Datenbanktabellen-Hashing verwenden müssen.
In Bezug auf Datenbankcluster verfügen viele Datenbanken über gute Lösungen. Die von MySQL häufig verwendete Master/Slave-Lösung ist ebenfalls vorhanden Welche Art von DB kann anhand der entsprechenden Lösung implementiert werden?
Der oben erwähnte Datenbankcluster wird durch die Art der verwendeten Datenbank hinsichtlich Architektur, Kosten und Skalierbarkeit eingeschränkt, daher müssen wir eine Verbesserung der Systemarchitektur aus Sicht der Anwendung in Betracht ziehen ist die effektivste Lösung. Wir installieren Geschäfts- und Anwendungs- oder Funktionsmodule in der Anwendung, um die Datenbank zu trennen. Verschiedene Module entsprechen verschiedenen Datenbanken oder Tabellen und verwenden dann bestimmte Strategien, um kleinere Datenbank-Hashes auf einer bestimmten Seite oder Funktion durchzuführen, z. B. der Benutzertabelle Tabelle nach Benutzer-ID, was die Leistung des Systems bei geringen Kosten verbessern und eine gute Skalierbarkeit aufweisen kann. Das Forum von Sohu verwendet eine solche Struktur, die die Benutzer, Einstellungen, Beiträge und andere Informationen des Forums in einer Datenbank aufteilt und dann die Datenbank und die Tabellen der Beiträge und Benutzer nach Abschnitten und IDs hasht. Schließlich kann es einfach in der Konfiguration konfiguriert werden Dadurch kann das System jederzeit eine kostengünstige Datenbank hinzufügen, um die Systemleistung zu ergänzen.
4. Caching
Jeder Techniker ist auf das Wort Cache gestoßen, und Cache wird an vielen Stellen verwendet. Caching ist auch in der Website-Architektur und Website-Entwicklung sehr wichtig. Hier sprechen wir zunächst über die beiden grundlegendsten Caches. Erweitertes und verteiltes Caching werden später beschrieben.
In Bezug auf die Architektur weiß jeder, der mit Apache vertraut ist, dass Apache ein eigenes Caching-Modul bereitstellt, und Sie können auch das zusätzliche Squid-Modul zum Caching verwenden. Beide Methoden können die Zugriffsreaktionsfähigkeit von Apache effektiv verbessern.
Cache in der Website-Programmentwicklung. Der unter Linux bereitgestellte Memory Cache ist eine häufig verwendete Cache-Schnittstelle, die in der Webentwicklung verwendet werden kann. Wenn Sie beispielsweise in Java entwickeln, können Sie MemoryCache aufrufen, um einige zwischenzuspeichern Einige große Communities nutzen diese Architektur, um Daten und Kommunikation zu teilen. Darüber hinaus verfügt jede Sprache bei der Web-Sprachentwicklung grundsätzlich über das Cache-Modul von Pear, und Java ist mit .net noch nicht sehr vertraut, aber ich glaube, dass es vorhanden sein muss.
5. Spiegelung
Spiegelung ist eine Methode, die häufig von großen Websites verwendet wird, um die Leistung und Datensicherheit zu verbessern Unterschiedliche Netzwerke Unterschiede in der Benutzerzugriffsgeschwindigkeit, die durch Zugangsanbieter und Regionen verursacht werden, wie z. B. der Unterschied zwischen ChinaNet und EduNet, haben viele Websites dazu veranlasst, Spiegelseiten innerhalb des Bildungsnetzwerks zu erstellen, und die Daten werden regelmäßig oder in Echtzeit aktualisiert. Was die detaillierte Technologie der Spiegelung angeht, werde ich hier nicht zu sehr ins Detail gehen. Es stehen viele professionelle Standardlösungsarchitekturen und -produkte zur Auswahl. Es gibt auch kostengünstige Möglichkeiten, dies über Software wie rsync und andere Tools unter Linux zu implementieren.
6. Lastausgleich
Der Lastausgleich ist die ultimative Lösung für große Websites, um Zugriffe mit hoher Last und eine große Anzahl gleichzeitiger Zugriffe zu bewältigen Anfragen.
Lastausgleichstechnologie wird seit vielen Jahren entwickelt und es stehen viele professionelle Dienstleister und Produkte zur Auswahl. Ich persönlich bin auf einige Lösungen gestoßen, von denen zwei als Referenz dienen können .
1) Hardware-Layer-4-Switching
Layer-4-Switching nutzt je nach Anwendung die Header-Informationen von Layer-3- und Layer-4-Paketen Das Intervall identifiziert den Geschäftsfluss und weist den Geschäftsfluss des gesamten Intervallsegments dem entsprechenden Anwendungsserver zur Verarbeitung zu. Die Layer-4-Switching-Funktion ist wie eine virtuelle IP, die auf den physischen Server verweist. Die von ihm übertragenen Dienste gehorchen einer Vielzahl von Protokollen, darunter HTTP, FTP, NFS, Telnet oder anderen Protokollen. Diese Dienste erfordern komplexe Lastausgleichsalgorithmen auf Basis physischer Server. In der IP-Welt wird der Diensttyp durch die TCP- oder UDP-Portadresse des Terminals bestimmt. Beim Layer-4-Switching wird der Anwendungsbereich durch die Quell- und Terminal-IP-Adressen, TCP- und UDP-Ports bestimmt.
Im Bereich der Hardware-Vierschicht-Switching-Produkte stehen einige bekannte Produkte zur Auswahl, wie Alteon, F5 usw. Diese Produkte sind teuer, aber ihr Geld wert und kann eine sehr hervorragende Leistung und sehr flexible Verwaltungsfunktionen bieten. Yahoo China nutzte drei oder vier Alteons, um fast 2.000 Server zu verwalten.
2) Software-Vierschicht-Umschaltung
Nachdem jeder das Prinzip der Hardware-Vierschicht-Umschaltung kennt, wird die Software-Vierschicht-Umschaltung basierend darauf implementiert Auf dem OSI-Modell Exchange ist eine solche Lösung entstanden, die das gleiche Prinzip umsetzt, die Leistung ist jedoch etwas schlechter. Es ist jedoch immer noch einfach, einem gewissen Druck standzuhalten. Einige Leute sagen, dass die Software-Implementierungsmethode tatsächlich flexibler ist und die Verarbeitungsleistung vollständig von der Vertrautheit Ihrer Konfiguration abhängt.
Wir können das häufig verwendete LVS unter Linux verwenden, um das vierschichtige Umschalten von Software zu lösen. LVS ist ein Linux Virtual Server. Es bietet eine Echtzeit-Katastrophenreaktionslösung, die die Robustheit des Systems verbessert Bietet Flexibilität. Die virtuellen VIP-Konfigurations- und Verwaltungsfunktionen können mehrere Anwendungsanforderungen gleichzeitig erfüllen, was für verteilte Systeme unerlässlich ist.
Eine typische Lastausgleichsstrategie besteht darin, einen Squid-Cluster basierend auf Software- oder Hardware-Vierschicht-Switching aufzubauen. Diese Idee wird von vielen großen Websites, einschließlich Suchmaschinen, übernommen. Eine solche Architektur ist kostengünstig Durch die hohe Leistung und starke Skalierbarkeit ist es jederzeit sehr einfach, Knoten zur Architektur hinzuzufügen oder zu entfernen. Diese Struktur werde ich im Detail klären und mit Ihnen besprechen.
1: Datenbanken, die sich auf Websites mit hoher Parallelität und hoher Auslastung konzentrieren
Ja, das erste ist die Datenbank, die das erste SPOF ist, mit dem die meisten Anwendungen konfrontiert sind. Insbesondere bei Web2.0-Anwendungen muss zunächst die Antwort der Datenbank gelöst werden.
Im Allgemeinen wird MySQL am häufigsten verwendet. Wenn die Datenmenge zunächst auf mehr als 1 Million ansteigt, sinkt die Leistung von MySQL stark. Eine gängige Optimierungsmaßnahme ist der M-S-Modus (Master-Slave) für die synchrone Replikation, bei dem Abfragen und Vorgänge auf verschiedenen Servern ausgeführt werden. Was ich empfehle, ist die M-M-Slaves-Methode, 2 Master-MySQL, mehrere Slaves. Es ist zu beachten, dass es zwar 2 Master gibt, aber nur einer gleichzeitig aktiv ist. Wir können zu einem bestimmten Zeitpunkt wechseln. Der Grund für die Verwendung von zwei M besteht darin, sicherzustellen, dass M nicht wieder zum SPOF des Systems wird.
Slaves können die Last weiter ausgleichen und können mit LVS kombiniert werden, um ausgewählte Vorgänge angemessen auf verschiedene Slaves zu verteilen.
Die obige Architektur kann eine gewisse Last bewältigen, aber wenn die Anzahl der Benutzer weiter zunimmt und Ihre Benutzertabellendaten 10 Millionen überschreiten, wird M zu SPOF. Sie können Slaves nicht beliebig erweitern, da sonst die Kosten für die Replikationssynchronisierung in die Höhe schnellen. Meine Methode ist die Tabellenpartitionierung, also die Partitionierung auf Unternehmensebene. Am einfachsten ist es, Benutzerdaten als Beispiel zu nehmen. Gemäß einer bestimmten Segmentierungsmethode, z. B. der ID, wird es in verschiedene Datenbankcluster segmentiert.
Die globale Datenbank wird für die Metadatenabfrage verwendet. Der Nachteil besteht darin, dass es bei jeder Abfrage einmal hinzugefügt wird. Wenn Sie beispielsweise einen Benutzer Nightsailer abfragen möchten, müssen Sie zuerst zur globalen Datenbankgruppe gehen, um die Cluster-ID zu finden, die Nightsailer entspricht, und dann zu gehen angegebenen Cluster, um die tatsächlichen Daten von Nightsailer zu finden.
Jeder Cluster kann den M-M-Modus oder den M-M-Slaves-Modus verwenden. Dies ist eine skalierbare Struktur. Wenn die Last zunimmt, können Sie einfach neue MySQL-Cluster hinzufügen.
Es ist zu beachten, dass:
1 alle Auto_Inkrement-Felder deaktivieren
2 Es wird ein universeller Algorithmus zur zentralen Zuweisung verwendet.
3. Es ist eine bessere Methode erforderlich, um die Auslastung des MySQL-Hosts und den Betriebsstatus des Dienstes zu überwachen. Wenn bei Ihnen mehr als 30 MySQL-Datenbanken laufen, werden Sie verstehen, was ich meine.
4. Verwenden Sie keine dauerhaften Links (verwenden Sie nicht pconnect). Verwenden Sie stattdessen einen Datenbankverbindungspool eines Drittanbieters wie SQLRelay oder machen Sie es einfach selbst, da der MySQL-Verbindungspool in PHP4 enthalten ist hat oft Probleme.
2: Statische HTML-Systemarchitektur für Websites mit hoher Parallelität und hoher Auslastung
Tatsächlich weiß jeder, dass die effizienteste und am wenigsten effiziente ist Es handelt sich um rein statische Seiten, daher versuchen wir unser Bestes, statische Seiten für die Seiten auf unserer Website zu verwenden. Diese einfachste Methode ist tatsächlich die effektivste. Bei Websites mit einer großen Menge an Inhalten und häufigen Aktualisierungen können wir jedoch nicht alle manuell einzeln implementieren, sodass unser gemeinsames Informationsveröffentlichungssystem CMS erschien, z. B. die Nachrichtenkanäle verschiedener Portalseiten, die wir häufig besuchen, und sogar andere Kanäle, alle durch Es wird vom Informationsfreigabesystem verwaltet und implementiert. Das Informationsfreigabesystem kann die einfachste Informationseingabe realisieren und automatisch statische Seiten generieren. Es kann auch über Funktionen wie Kanalverwaltung, Berechtigungsverwaltung, automatisches Crawlen usw. verfügen Für eine große Website ist ein effizientes und überschaubares CMS unerlässlich. Neben Portalen und Informationsveröffentlichungs-Websites ist es auch für Community-artige Websites mit hohen Interaktivitätsanforderungen ein notwendiges Mittel, sie so statisch wie möglich zu gestalten, um die Leistung zu verbessern. Beiträge und Artikel in der Community können in Echtzeit statisch gemacht und aktualisiert werden Auch Mops Hodgepodge nutzt diese Strategie, ebenso wie NetEase-Communities.
Gleichzeitig ist die HTML-Statisierung auch ein Mittel, das von einigen Caching-Strategien verwendet wird. Für Anwendungen im System, die häufig Datenbankabfragen verwenden, aber nur sehr kleine Inhaltsaktualisierungen aufweisen, können Sie die Verwendung der HTML-Statisierung in Betracht ziehen. B. in Foren. Diese Informationen können von den aktuellen Mainstream-Foren verwaltet und in der Datenbank gespeichert werden. Tatsächlich werden viele dieser Informationen vom Frontend-Programm abgerufen Die Häufigkeit ist sehr gering. Sie können erwägen, diesen Teil des Inhalts im Hintergrund zu aktualisieren. Dies vermeidet eine hohe Parallelität einer großen Anzahl von Datenbankzugriffsanforderungen.
Statische Website-HTML-Lösung
Wenn eine Servlet-Ressourcenanforderung beim WEB-Server eintrifft, füllen wir die angegebene JSP-Seite aus, um auf die Anfrage zu antworten:
HTTP-Anfrage---Webserver---Servlet--Geschäftslogikverarbeitung--Zugriffsdaten--JSP füllen--Antwortanforderung
Nach der HTML-Statisierung:
HTTP-Anfrage---Webserver---Servlet--HTML--Antwortanforderung
Die statische Zugriffsanforderung lautet wie folgt
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"); } }
Klasse zum Generieren statischer HTML-Seiten:
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);//发送指定文件流到客户端 } }
Drei: Bei Websites mit hoher gleichzeitiger Auslastung liegt der Schwerpunkt auf Caching, Lastausgleich und Speicherung.
Cache ist ein weiteres großes Problem, das ich normalerweise als Cache-Cluster verwende Stellen Sie etwa 10 Einheiten bereit (10 g Speicherpool). Beachten Sie, dass Sie
swap nicht verwenden dürfen. Am besten deaktivieren Sie Linux-Swap.
Lastausgleich/Beschleunigung
可能上面说缓存的时候,有人第一想的是页面静态化,所谓的静态html,我认为这是常识,不属于要点了。页面的静态化随之带来的是静态服务的
负载均衡和加速。我认为Lighttped+Squid是最好的方式了。
LVS b3c39e73f82b358bad409308ba9884dclighttped====>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的),并指定域名为res1.***.com,res2.***.com,采用
ajp协议
步骤二:修改Apache httpd.conf配置
原来应用的文件上传功能网址为:
1、/fileupload.html
2、/otherupload.html
在httpd.conf中增加如下配置
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 # 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 < /VirtualHost>
步骤三,修改业务逻辑:
所有上传文件在数据库中均采用全url的方式保存,例如产品图片路径存成:http://res1.***.com/upload/20090101/product120302005.jpg
现在,你可以高枕无忧了,带宽不够时,增加个几十台图片服务器,只需要稍微修改一下apache的配置文件即可。
五:高并发高负载网站的系统架构之数据库集群和库表散列
大型网站都有复杂的应用,这些应用必须使用数据库,那么在面对大量访问的时候,数据库的瓶颈很快就能显现出来,这时一台数据库将很快无法满足应用,于是我们需要使用数据库集群或者库表散列。
在数据库集群方面,很多数据库都有自己的解决方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是类似的方案,您使用了什么样的DB,就参考相应的解决方案来实施即可。
Der oben erwähnte Datenbankcluster wird hinsichtlich Architektur, Kosten und Skalierbarkeit durch den DB-Typ eingeschränkt, daher müssen wir eine Verbesserung der Systemarchitektur aus Sicht der Anwendung in Betracht ziehen. Bibliothekstabellen-Hashing wird häufig und am häufigsten verwendet wirksame Lösung. Wir installieren Geschäfts- und Anwendungs- oder Funktionsmodule in der Anwendung, um die Datenbank zu trennen. Verschiedene Module entsprechen verschiedenen Datenbanken oder Tabellen und verwenden dann bestimmte Strategien, um kleinere Datenbank-Hashes auf einer bestimmten Seite oder Funktion durchzuführen, z. B. der Benutzertabelle Tabelle nach Benutzer-ID, was die Leistung des Systems zu geringen Kosten verbessern und eine gute Skalierbarkeit aufweisen kann. Das Forum von Sohu übernimmt eine solche Struktur, die die Benutzer, Einstellungen, Beiträge und andere Informationen des Forums in einer Datenbank aufteilt und dann die Datenbank und die Tabellen der Beiträge und Benutzer nach Abschnitten und IDs hasht. Schließlich kann es einfach in der Konfiguration konfiguriert werden Dadurch kann das System jederzeit eine kostengünstige Datenbank hinzufügen, um die Systemleistung zu ergänzen.
Klassifizierung von Cluster-Software:
Im Allgemeinen wird Cluster-Software in drei Hauptkategorien unterteilt, basierend auf der Schwerpunktrichtung und dem damit verbundenen Problem versucht zu lösen: Hochleistungscluster (HPC), Lastausgleichscluster (LBC), Hochverfügbarkeitscluster (HAC).
Hochleistungscluster (HPC), der mehrere Maschinen in einem Cluster verwendet, um dieselbe Aufgabe zu erledigen, wodurch die Geschwindigkeit und Zuverlässigkeit der Aufgabenerledigung viel höher ist als bei einer einzelnen Maschine. Betriebseffekt. Es gleicht die Mängel der Standalone-Leistung aus. Dieser Cluster wird häufig in Umgebungen mit großen Datenmengen und komplexen Berechnungen wie Wettervorhersage und Umweltüberwachung verwendet.
Load Balance Cluster (LBC), der mehrere Cluster in einem Cluster verwenden kann viele kleine parallele Aufgaben erledigen. Im Allgemeinen erhöht sich die Reaktionszeit auf Benutzeranfragen, wenn mehr Personen eine Anwendung verwenden, und auch die Leistung der Maschine wird beeinträchtigt. Wenn ein Lastausgleichscluster verwendet wird, kann jede Maschine im Cluster auf die Anfragen des Benutzers reagieren Anfragen. Nachdem der Benutzer eine Serviceanfrage gestellt hat, wählt der Cluster die Maschine mit der geringsten Auslastung und dem besten Service aus, um die Anfrage anzunehmen und zu antworten. Auf diese Weise kann der Cluster zur Erhöhung der Verfügbarkeit und Stabilität verwendet werden des Systems. Diese Art von Cluster wird häufig auf Websites verwendet.
Hochverfügbarkeitscluster (HAC), der die Redundanz des Systems im Cluster nutzt. Wenn eine Maschine im System beschädigt ist, können andere Backup-Maschinen dies tun Sie übernehmen schnell den Service und warten auf die Reparatur und Rückgabe der defekten Maschine. Maximieren Sie die Verfügbarkeit von Diensten im Cluster. Diese Art von System wird im Allgemeinen häufig in Bereichen wie Banken und Telekommunikationsdiensten eingesetzt, die hohe Anforderungen an die Systemzuverlässigkeit stellen.
2 Aktueller Status von Datenbank-Clustern
Datenbank-Clustering wird durch die Einführung von Computer-Clustering-Technologie in die Datenbank erreicht, obwohl jeder Hersteller behauptet, dass seine Nr Egal wie perfekt die Architektur ist, es kann nie etwas an der Tatsache ändern, dass Oracle die Führung übernimmt und alle anderen Datenbankanbietern, einschließlich Microsoft, in Bezug auf Clusterlösungen immer noch voraus sind Leistung und Datenbanklastausgleich sowie die Notwendigkeit einer einfachen Erweiterung.
Oracles Real Application Cluster (RAC)
Microsoft SQL Cluster Server (MSCS)
IBMs DB2 UDB High Availability Cluster (UDB)
Sybase ASE High Availability Cluster (ASE)
MySQL High Availability Cluster (MySQL CS)
IO-basierter Dritter Drei-Parteien-HA-Cluster (Hochverfügbarkeit)
Die aktuellen Hauptdatenbank-Cluster-Technologien umfassen die oben genannten sechs Kategorien, einige werden von Datenbankherstellern selbst entwickelt, andere werden von Cluster-Drittunternehmen entwickelt ; und es gibt Datenbanken, die von Herstellern in Zusammenarbeit mit Cluster-Drittunternehmen entwickelt wurden, die von verschiedenen Clustern implementierten Funktionen und Architekturen sind ebenfalls unterschiedlich.
RAC (Real Application Cluster, echter Anwendungscluster) ist eine neue Technologie, die in der Oracle9i-Datenbank verwendet wird und auch die Kerntechnologie der Oracle-Datenbank zur Unterstützung der Grid-Computing-Umgebung ist. Seine Entstehung löst ein wichtiges Problem traditioneller Datenbankanwendungen: den Widerspruch zwischen hoher Leistung, hoher Skalierbarkeit und niedrigem Preis. Seit langem dominiert Oracle mit seiner Real Application Cluster (RAC)-Technologie den Markt für Cluster-Datenbanken
Sechs: Systemarchitektur für Website-Caching mit hoher Parallelität und hoher Auslastung
Jeder Techniker ist auf das Wort Cache gestoßen, und Cache wird an vielen Stellen verwendet. Caching ist auch in der Website-Architektur und Website-Entwicklung sehr wichtig. Hier sprechen wir zunächst über die beiden grundlegendsten Caches. Erweitertes und verteiltes Caching werden später beschrieben.
Was das architektonische Caching betrifft, weiß jeder, der mit Apache vertraut ist, dass Apache ein eigenes Caching-Modul bereitstellt, und Sie können auch das zusätzliche Squid-Modul zum Caching verwenden. Beide Methoden können die Zugriffsreaktionsfähigkeit von Apache effektiv verbessern.
Der unter Linux bereitgestellte Cache ist eine häufig verwendete Cache-Schnittstelle, die beispielsweise bei der Entwicklung mit Java zum Zwischenspeichern und Kommunizieren einiger Daten verwendet werden kann groß angelegt Die Community nutzt diese Architektur. Darüber hinaus verfügt jede Sprache bei der Web-Sprachentwicklung grundsätzlich über das Cache-Modul von Pear, und Java ist mit .net nicht sehr vertraut, aber ich glaube, dass es vorhanden sein muss.
Java Open Source Cache Framework
JBossCache/TreeCache JBossCache ist ein replizierter Transaktionscache, mit dem Sie Unternehmensanwendungsdaten zwischenspeichern können, um Nice Improved zu aktualisieren Leistung. Cache-Daten werden automatisch repliziert, sodass Sie problemlos Cluster-Arbeiten zwischen Jboss-Servern durchführen können. JBossCache kann einen MBean-Dienst über den Jboss Application Service oder andere J2EE-Container ausführen. Natürlich kann es auch unabhängig ausgeführt werden. JBossCache umfasst zwei Module: TreeCache und TreeCacheAOP. TreeCache – ist ein baumstrukturierter replizierter Transaktionscache. TreeCacheAOP – ist ein „objektorientierter“ Cache, der AOP zur dynamischen Verwaltung von POJO verwendet.
OSCache Die OSCache-Tag-Bibliothek wurde von OpenSymphony entwickelt. Es handelt sich um eine bahnbrechende benutzerdefinierte JSP-Tag-Anwendung, die die Funktion implementiert der schnellen Speicherpufferung innerhalb bestehender JSP-Seiten. OSCache ist ein weit verbreitetes, leistungsstarkes J2EE-Caching-Framework, das als allgemeine Caching-Lösung für jede Java-Anwendung verwendet werden kann. OSCache hat die folgenden Eigenschaften: Zwischenspeichern jedes Objekts, Sie können Teile von JSP-Seiten oder HTTP-Anforderungen ohne Einschränkungen zwischenspeichern und jedes Java-Objekt kann zwischengespeichert werden. Verfügt über eine umfassende API – Die OSCache-API bietet Ihnen ein umfassendes Programm zur Steuerung aller OSCache-Funktionen. Persistenter Cache – Der Cache kann nach Belieben auf die Festplatte geschrieben werden, sodass kostspielig zu erstellende Daten auch nach Neustarts der Anwendung zwischengespeichert bleiben. Unterstützt Clustering – Cluster-Cache-Daten können individuell konfiguriert werden, ohne den Code zu ändern. Ablauf von Cache-Datensätzen – Sie haben maximale Kontrolle über den Ablauf von zwischengespeicherten Objekten, einschließlich anpassbarer Aktualisierungsstrategien (sofern dies nicht für die Standardleistung erforderlich ist).
JCACHE JCACHE ist eine kommende Standardspezifikation (JSR 107), die eine Methode zum vorübergehenden Zwischenspeichern von Java-Objekten im Speicher beschreibt, einschließlich Objekterstellung, gemeinsamem Zugriff und Spooling, Fehler, Konsistenz jeder JVM, usw. Es kann verwendet werden, um die am häufigsten gelesenen Daten innerhalb von JSPs zwischenzuspeichern, beispielsweise Produktkataloge und Preislisten. Mit JCACHE werden die Antwortzeiten für die meisten Abfragen durch die Datenzwischenspeicherung beschleunigt (interne Tests zeigen, dass die Antwortzeiten etwa 15-mal schneller sind).
Ehcache Ehcache stammt aus dem Ruhezustand und wird in Hibernate als Daten-Caching-Lösung verwendet.
Java Caching System JCS ist ein Teilprojekt von Jakartas Projekt Turbine. Es handelt sich um ein zusammengesetztes Puffertool. Objekte können im Speicher und auf der Festplatte zwischengespeichert werden. Verfügt über Einstellungen für den Zeitablauf des Pufferobjekts. Sie können auch eine verteilte Architektur mit Pufferung über JCS aufbauen, um Hochleistungsanwendungen zu erreichen. Auf einige Objekte, auf die häufig zugegriffen werden muss und die bei jedem Zugriff viele Ressourcen verbrauchen, können sie vorübergehend im Puffer gespeichert werden, was die Leistung des Dienstes verbessern kann. Und JCS ist ein gutes Puffertool. Pufferungstools können die Leistung von Anwendungen erheblich verbessern, bei denen weit mehr Lesevorgänge als Schreibvorgänge ausgeführt werden.
SwarmCache SwarmCache ist ein einfacher, aber leistungsstarker verteilter Caching-Mechanismus. Es nutzt IP-Multicast, um effizient zwischen zwischengespeicherten Instanzen zu kommunizieren. Es ist ideal, um die Leistung geclusterter Webanwendungen schnell zu verbessern.
ShiftOne ShiftOne Object Cache ist eine Java-Bibliothek, die grundlegende Objekt-Caching-Funktionen bereitstellt. Die implementierten Strategien sind First-in-First-out (FIFO), kürzlich verwendete (LRU) und am wenigsten häufig verwendete (LFU). Alle Strategien maximieren die Größe eines Elements und maximieren seine Überlebenszeit.
WhirlyCache Whirlycache ist ein schneller, konfigurierbarer Cache von Objekten, die im Speicher vorhanden sind. Es kann eine Website oder Anwendung beschleunigen, indem Objekte zwischengespeichert werden, die sonst durch Abfragen einer Datenbank oder andere kostspielige Prozesse erstellt werden müssten.
Jofti Jofti kann Objekte in der Cache-Ebene (unterstützt EHCache, JBossCache und OSCache) oder in Speicherstrukturen, die die Map-Schnittstelle unterstützen, indizieren und durchsuchen. Das Framework bietet außerdem Transparenz für das Hinzufügen, Löschen und Ändern von Objekten im Index sowie benutzerfreundliche Abfragefunktionen für die Suche.
cache4j Cache4j ist ein Java-Objekt-Cache mit einer einfachen API und einer schnellen Implementierung. Zu seinen Funktionen gehören: Caching im Speicher, entwickelt für Multithread-Umgebungen, zwei Implementierungen: Synchronisierung und Blockierung, mehrere Cache-Löschstrategien: LFU, LRU, FIFO, die Verwendung von starkem Referenzspeicher (starke Referenz) und weichem Referenzspeicher (Softreferenz). Objekt.
Open Terracotta ist ein Open-Source-Cluster-Framework auf JVM-Ebene, das Folgendes bietet: HTTP-Sitzungsreplikation, verteiltes Caching, POJO-Clustering und JVMs im gesamten Cluster, um eine verteilte Anwendungskoordination zu erreichen (mithilfe von Code-Injection). Sie müssen nichts ändern).
sccache Das von SHOP.COM verwendete Objekt-Caching-System. sccache ist ein In-Process-Cache und ein gemeinsam genutzter Cache der zweiten Ebene. Es speichert zwischengespeicherte Objekte auf der Festplatte. Unterstützt zugehörige Schlüssel, Schlüssel beliebiger Größe und Daten beliebiger Größe. Möglichkeit zur automatischen Speicherbereinigung.
Shoal Shoal ist ein Java-basiertes skalierbares dynamisches Cluster-Framework, das Infrastrukturunterstützung für die Erstellung fehlertoleranter, zuverlässiger und verfügbarer Java-Anwendungen bietet. Dieses Framework kann auch in jedes Java-Produkt integriert werden, das nicht an ein bestimmtes Kommunikationsprotokoll gebunden sein möchte, sondern Cluster- und verteilte Systemunterstützung benötigt. Shoal ist die Clustering-Engine für GlassFish- und JonAS-Anwendungsserver.
Simple-Spring-Memcached Simple-Spring-Memcached kapselt Aufrufe an MemCached und macht die MemCached-Client-Entwicklung extrem einfach.
Zusammenfassung
Das obige ist der detaillierte Inhalt vonLösen von Problemen mit hoher Parallelität in Java-Systemen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!