网站卡密怎么做,wordpress评论怎么去掉网址,深圳企业seo,企业工商公示信息查询系统java处理高并发高负载类网站问题 一#xff1a;高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF。尤其是Web2.0的应用#xff0c;数据库的响应是首先要解决的。 一般来说MySQL是最常用的#xff0c;可能最初是一个mysql主机#xff0c… java处理高并发高负载类网站问题 一高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个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;charsetgb2312);//设置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){www.liquan.org 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我认为这是常识不属于要点了。页面的静态化随之带来的是静态服务的 负载均衡和加速。我认为LighttpedSquid是最好的方式了。 LVS -------lighttpedsquid(s) lighttpd 上面是我经常用的。注意我没有用apache除非特定的需求否则我不部署apache因为我一般用php-fastcgi配合lighttpd, 性能比apachemod_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 lbmethodbyrequests stickysessionJSESSIONID nofailoverOff timeout5 maxattempts3 ProxyPass /otherupload.html balancer://rescluster/otherupload.html lbmethodbyrequests stickysessionJSESSIONID nofailoverOff timeout5 maxattempts3 #!--负载均衡-- Proxy balancer://rescluster/ BalancerMember ajp://res1.***.com:8009 smax5 max500 ttl120 retry300 loadfactor100 routetomcat1 BalancerMember ajp://res2.***.com:8009 smax5 max500 ttl120 retry300 loadfactor100 routetomcat2 /Proxy /VirtualHost 步骤三修改业务逻辑 所有上传文件在数据库中均采用全url的方式保存例如产品图片路径存成http://res1.***.com/upload/20090101/product120302005.jpg 现在你可以高枕无忧了带宽不够时增加个几十台图片服务器只需要稍微修改一下apache的配置文件即可。 五高并发高负载网站的系统架构之数据库集群和库表散列 大型网站都有复杂的应用这些应用必须使用数据库那么在面对大量访问的时候数据库的瓶颈很快就能显现出来这时一台数据库将很快无法满足应用于是我们需要使用数据库集群或者库表散列。 在数据库集群方面很多数据库都有自己的解决方案Oracle、Sybase等都有很好的方案常用的MySQL提供的Master/Slave也是类似的方案您使用了什么样的DB就参考相应的解决方案来实施即可。 上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制于是我们需要从应用程序的角度来考虑改善系统架构库表散列是常用并 且最有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离不同的模块对应不同的数据库或者表再按照一定的策略对某个页面或者 功能进行更小的数据库散列比如用户表按照用户ID进行表散列这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采用了这样的 架构将论坛的用户、设置、帖子等信息进行数据库分离然后对帖子、用户按照板块和ID进行散列数据库和表最终可以在配置文件中进行简单的配置便能让系 统随时增加一台低成本的数据库进来补充系统性能。 集群软件的分类 一般来讲集群软件根据侧重的方向和试图解决的问题分为三大类高性能集群High performance clusterHPC、负载均衡集群Load balance cluster LBC高可用性集群High availability clusterHAC。 高性能集群High performance clusterHPC它是利用一个集群中的多台机器共同完成同一件任务使得完成任务的速度和可靠性都远远高于单机运行的效果。弥补了单机性能上的 不足。该集群在天气预报、环境监控等数据量大计算复杂的环境中应用比较多 负载均衡集群Load balance cluster LBC它是利用一个集群中的多台单机完成许多并行的小的工作。一般情况下如果一个应用使用的人多了那么用户请求的响应时间就会增大机器的性能 也会受到影响如果使用负载均衡集群那么集群中任意一台机器都能响应用户的请求这样集群就会在用户发出服务请求之后选择当时负载最小能够提供最好 的服务的这台机器来接受请求并相应这样就可用用集群来增加系统的可用性和稳定性。这类集群在网站中使用较多 高可用性集群High availability clusterHAC它是利用集群中系统 的冗余当系统中某台机器发生损坏的时候其他后备的机器可以迅速的接替它来启动服务等待故障机的维修和返回。最大限度的保证集群中服务的可用性。这类 系统一般在银行电信服务这类对系统可靠性有高的要求的领域有着广泛的应用。 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(高可用性)集群 当前主要的数据库集群技术有以上六大类有数据库厂商自己开发的也有第三方的集群公司开发的还有数据库厂商与第三方集群公司合作开发的各类集群实现的功能及架构也不尽相同。 RACReal Application Cluster真正应用集群是Oracle9i数据库中采用的一项新技术也是Oracle数据库支持网格计算环境的核心技术。它的出现解决了传统数 据库应用中面临的一个重要问题高性能、高可伸缩性与低价格之间的矛盾。在很长一段时间里甲骨文都以其实时应用集群技术(Real Application ClusterRAC)统治着集群数据库市场 六高并发高负载网站的系统架构之缓存 缓存一词搞技术的都接触过很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。 架构方面的缓存对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。 www.qqfenzu.ccTreeCache --是一个树形结构复制的事务处理缓存。 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可对在缓存层中(支持EHCacheJBossCache和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的客户端开发变得超乎寻常的简单。 转载于:https://blog.51cto.com/fdrer/1168725