web高并发解决方案.docx

上传人:b****2 文档编号:24183296 上传时间:2023-05-25 格式:DOCX 页数:14 大小:21.92KB
下载 相关 举报
web高并发解决方案.docx_第1页
第1页 / 共14页
web高并发解决方案.docx_第2页
第2页 / 共14页
web高并发解决方案.docx_第3页
第3页 / 共14页
web高并发解决方案.docx_第4页
第4页 / 共14页
web高并发解决方案.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

web高并发解决方案.docx

《web高并发解决方案.docx》由会员分享,可在线阅读,更多相关《web高并发解决方案.docx(14页珍藏版)》请在冰豆网上搜索。

web高并发解决方案.docx

web高并发解决方案

web高并发解决方案

  篇一:

JAVAWEB高并发解决方案

  java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,java高负载数据)

  一:

高并发高负载类网站关注点之数据库没错,首先是数据库,这是大多数应用所面临的首个SPOF。

尤其是的应用,数据库的响应是首先要解决的。

  一般来说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对应的clusterid,然后再到指定的cluster找到nightsailer的实际数据。

  每个cluster可以用m-m方式,或者m-m-slaves方式。

这是一个可以扩展的结构,随着负载的增加,你可以简单的增加新的mysqlcluster进去。

  需要注意的是:

  1、禁用全部auto_increment的字段

  2、id需要采用通用的算法集中分配

  3、要具有比较好的方法来监控mysql主机的负载和服务的运行状态。

如果你有30台以上的mysql数据库在跑就明白我的意思了。

  4、不要使用持久性链接(不要用pconnect),相反,使用sqlrelay这种第三方的数据库链接池,或者干脆自己做,因为php4中mysql的链接池经常出问题。

  二:

高并发高负载网站的系统架构之HTML静态化

  其实大家都知道,效率最高、消耗最小的就是纯静态化

  /shtml/XX07/的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。

但是对于大量内容并且频繁更新的网站,我们无法全部手动去挨个实现,于是出现了我们常见的信息发布系统CMS,像我们常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的,信息发布系统可以实现最简单的信息录入自动生成静态页面,还能具备频道管理、权限管理、自动抓取等功能,对于一个大型网站来说,拥有一套高效、可管理的CMS是必不可少的。

  除了门户和信息发布类型的网站,对于交互性要求很高的社区类型网站来说,尽可能的静态化也是提高性能的必要手段,将社区内的帖子、文章进行实时的静态化,有更新的时候再重新静态化也是大量使用的策略,像Mop的大杂烩就是使用了这样的策略,网易社区等也是如此。

  同时,html静态化也是某些缓存策略使用的手段,对于系统中频繁使用数据库查询但是内容更新很小的应用,可以考虑使用html静态化来实现,比如论坛中论坛的公用设置信息,这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中,这些信息其实大量被前台程序调用,但是更新频率很小,可以考虑将这部分内容进行后台更新的时候进行静态化,这样避免了大量的数据库访问请求高并发。

  网站HTML静态化解决方案

  当一个Servlet资源请求到达WEB服务器之后我们会填充指定的JSP页面来响应请求:

  HTTP请求---Web服务器---Servlet--业务逻辑处理--访问数据--填充JSP--响应请求

  HTML静态化之后:

  HTTP请求---Web服务器---Servlet--HTML--响应请求

  静态访求如下

  Servlet:

  publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{

  if(("chapterId")!

=null){

  StringchapterFileName=

  "bookChapterRead_"+("chapterId")+".html";

  StringchapterFilePath=getServletContext().getRealPath("/")+chapterFileName;FilechapterFile=newFile(chapterFilePath);

  if(()){(chapterFileName);return;}//如果有这个文件就告诉浏览器转向

  INovelChapterBiznovelChapterBiz=newNovelChapterBizImpl();

  NovelChapternovelChapter=

  ((("chapterId")));//章节信息

  intlastPageId=

  (().getId(),

  ());

  intnextPageId=

  (().getId(),

  ());

  ("novelChapter",novelChapter);

  ("lastPageId",lastPageId);

  ("nextPageId",nextPageId);

  newCreateStaticHTMLPage().createStaticHTMLPage(request,response,getServletContext(),

  chapterFileName,chapterFilePath,"/");

  }

  }

  生成HTML静态页面的类:

  package;

  import;

  import;

  import;

  import;

  import;

  import;

  import;

  import;

  import;

  import;

  import;

  import;

  /**

  *创建HTML静态页面

  *功能:

创建HTML静态页面

  *时间:

XX年1011日

  *地点:

home

  *@authormavk

  *

  */

  publicclassCreateStaticHTMLPage{

  /**

  *生成静态HTML页面的方法

  *@paramrequest请求对象

  *@paramresponse响应对象

  *@paramservletContextServlet上下文

  *@paramfileName文件名称

  *@paramfileFullPath文件完整路径

  *@paramjspPath需要生成静态文件的JSP路径(相对即可)

  *@throwsIOException

  *@throwsServletException

  */

  publicvoidcreateStaticHTMLPage(HttpServletRequestrequest,

  HttpServletResponseresponse,ServletContextservletContext,StringfileName,StringfileFullPath,StringjspPath)throwsServletException,IOException{

  ("text/html;charset=gb2312");//设置HTML结果流编码(即HTML文件编码)

  RequestDispatcherrd=(jspPath);//得到JSP资源

  finalByteArrayOutputStreambyteArrayOutputStream=new

  ByteArrayOutputStream();//用于从ServletOutputStream中接收资源

  finalServletOutputStreamservletOuputStream=newServletOutputStream(){//用于从HttpServletResponse中接收资源

  publicvoidwrite(byte[]b,intoff,intlen){

  (b,off,len);

  }

  publicvoidwrite(intb){

  (b);

  }

  };

  finalPrintWriterprintWriter=newPrintWriter(new

  OutputStreamWriter(byteArrayOutputStream));//把转换字节流转换成字符流

  HttpServletResponsehttpServletResponse=new

  HttpServletResponseWrapper(response){//用于从response获取结果流资源(重写了两个方法)

  publicServletOutputStreamgetOutputStream(){

  篇二:

开源企业级web高并发解决方案

  开源企业级web高并发解决方案

  主要介绍利用开源的解决方案,来为企业搭建web高并发服务器架构花了一个多小时,画了张图片,希望能先帮你理解整个架构,之后我在一一介绍.linux的大型架构其实是一点点小架构拼接起来的,笔者从各个应用开始配置,最后在完全整合起来,以实现效果。

  笔者所使用的环境为内核版本实现过程在虚拟机中,所用到的安装包为DVD光盘自带rpm包

  装过DevelopmentLibrariesDevelopmentTools包组

  笔者所使用的环境为内核版本实现过程在虚拟机中,所用到的安装包为DVD光盘自带rpm包

  装过DevelopmentLibrariesDevelopmentTools包组

  笔者虚拟机有限,只演示单边varnish配置

  一、配置前端LVS负载均衡

  笔者选用LVS的DR模型来实现集群架构,如果对DR模型不太了了解的朋友建议先去看看相关资料。

  本模型实例图为:

  现在director

  上安装ipvsadm,笔者yum配置指向有集群源所以直接用yum安装。

yuminstallipvsadm

  下面是Director配置:

  DIP配置在接口上

  VIP配置在接口别名上:

  varnish服务器配置:

RIP配置在接口上:

;VIP配置在lo别名上

  如果你要用到下面的heartbeat的ldirectord来实现资源转换,则下面的#Director配置不用配置

  1.#Director配置

  2.ifconfigeth0/16

  3.ifconfigeth0:

0broadcastnetmask

  up

  4.routeadd-hostdeveth0:

0

  5.echo1>/proc/sys/net/ipv4/ip_forward

  1.#varnish服务器修改内核参数来禁止响应对VIP的ARP广播请求

  2.echo1>/proc/sys/net/ipv4/conf/lo/arp_ignore

  3.echo1>/proc/sys/net/ipv4/conf/all/arp_ignore

  4.echo2>/proc/sys/net/ipv4/conf/lo/arp_announce

  5.echo2>/proc/sys/net/ipv4/conf/all/arp_announce

  1.#配置VIP

  2.ifconfiglo:

0broadcastnetmask

  up

  3.#凡是到主机的一律使用lo:

0响应

  4.routeadd-hostdevlo:

0

  1.#在Director上配置Ipvs,笔者虚拟机有限,只演示单台配置

  2.ipvsadm-A-t:

80-swlc

  3.ipvsadm-a-t:

80-r-g-w2

  4.ipvsadm-Ln

  至此,前端lvs负载均衡基本实现,下面配置高可用集群二、heartbeat高可用集群

  本应用模型图:

  高可用则是当主服务器出现故障,备用服务器会在最短时间内代替其地位,并且保证服务不间断。

  简单说明:

从服务器和主服务器要有相同配置,才能在故障迁移时让无界感受不到,从而保证服务不间断运行。

在你的两台机器(一台作为主节点,另一台为从节点)上运行

  heartbeat,并配置好相关的选项,最重要的是lvs资源一定要配置进去。

那么开始时主节点提供lvs服务,一旦主节点崩溃,那么从节点立即接管lvs服务。

  SO:

  director主服务器和从服务器都有两块网卡,一块eth0是和后面varnish服务器通信,另一块eth1是彼此之间监听心跳信息和故障迁移是资源转移。

笔者用的eth0是网段vip为监听心跳为eth1网卡,主从的IP分别为(node1)和(node2)

  修改上面模型图两台主从服务器的信息

  1.vim/etc/hosts

  2.

  3.node2

  4.#用于实现两台director节点间域名解析,此操作node1、node2相同

  1.vim/etc/sysconfig/network

  2.#设置主机名

  3.hostname

  4.#修改主机名使之立即生效,node2也同样修改为

  为了安全起见,node1和node2的通信需要加密进行

  1.

  2.

  3.

  4.

  5.

  6.ssh-keygen-trsa#生成密钥ssh-copy-id-i.ssh/id_root@#将公钥复制给node2sshnode2--ifconfig#执行命令测试,此时应该显示node2的ip信息

  准备工作完成,下面开始安装heartbeat和ldirectord

  所需要的安装包为

  本人直接用yum来实现,能自动解决依赖关系,node1和node2都需要安装

  1.yumlocalinstall-y--nogpgcheck./*2.#安装此目录中的所有rpm包

  安装后配置:

  1.cd/usr/share/doc/

  2.cpauthkeys/etc//

  3.cpharesources/etc//

  4.cp/etc//

  5.#拷贝heartbeat所需配置文件到指定目录下

  1.vim/etc//

  2.bcasteth1

  3.#定义心跳信息从那一块网卡传输

  4.node

  5.node

  6.#添加这两行,用于指明心跳信号传输范围

  7.vim/etc//authkeys

  8.auth2

  9.2sha1[键入随机数]

  10.chmod400authkeys

  11.#保存退出并修改权限400

  12.vim/etc//haresource

  13./24/eth0/ldir

  ectord:

:

httpd

  14.#末行添加主节点域名,vip资源,广播地址,ldirectord资源,以及用户提供显示错误

  页面的httpd资源

  同步配置文件到node2

  1./usr/lib/heartbeat/ha_propagate

  2.#脚本用来同步和authkeys文件到node2

  3.scpharesourcesnode2:

/etc//

  4.

  #复制haresource到nod2

  篇三:

高并发网站架构解决方案

  一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求都很简单,随着互联网业务的不断丰富,网站相关的技术经过这些年的发展,已经细分到很细的方方面面,尤其对于大型网站来说,所采用的技术更是涉及面非常广,从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求,已经不是原来简单的html静态网站所能比拟的。

  大型网站,比如门户网站。

在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:

使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。

但是除了这几个方面,还没法根本解决大型网站面临的高负载和高并发问题。

  上面提供的几个解决思路在一定程度上也意味着更大的投入,并且这样的解决思路具备瓶颈,没有很好的扩展性,下面我从低成本、高性能和高扩张性的角度来说说我的一些经验。

  1、HTML静态化

  其实大家都知道,效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。

但是对于大量内容并且频繁更新的网站,我们无法全部手动去挨个实现,于是出现了我们常见的信息发布系统CMS,像我们常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的,信息发布系统可以实现最简单的信息录入自动生成静态页面,还能具备频道管理、权限管理、自动抓取等功能,对于一个大型网站来说,拥有一套高效、可管理的CMS是必不可少的。

  除了门户和信息发布类型的网站,对于交互性要求很高的社区类型网站来说,尽可能的静态化也是提高性能的必要手段,将社区内的帖子、文章进行实时的静态化,有更新的时候再重新静态化也是大量使用的策略,像Mop的大杂烩就是使用了这样的策略,网易社区等也是如此。

  同时,html静态化也是某些缓存策略使用的手段,对于系统中频繁使用数据库查询但是内容更新很小的应用,可以考虑使用html静态化来实现,比如论坛中论坛的公用设置信息,这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中,这些信息其实大量被前台程序调用,但是更新频率很小,可以考虑将这部分内容进行后台更新的时候进行静态化,这样避免了大量的数据库访问请求。

  一下是一个SSH下的html静态化例子

  用Article表来演示下页面静态化,在此做记录,便于今后参考。

这里是基于SSH2架构来演示的。

  1.演示工程整体结构概览

  这里我引入了htdz_lib这么个UserLibraliry,包含了SSH2整合所需的jar以及。

  同时也已创建于WEB-INF下。

  表预览

  我们给Article表增加个HadStatic字段,用以标识此文章是否已静态化。

  我们不建议添加一篇文章就直接生成对应的静态页面,如果都没有用户来阅读,服务器就徒增了大量html文件,浪费资源。

  所以我们一般采用访问生成策略:

  用户访问某文章,判断服务器是否存在此文章对应的静态页,存在则直接重定向到此静态页面,不存在则执行静态化,然后再重定向到生成的静态页。

  然而每次通过IO去查找文件是否存在,耗费性能,所以像Article这类表加个HadStatic字段,直接判断字段的值来决定是否静态化显得合理多了。

  3.配置1.2.

  

  3.contextConfigLocation

  4.

  5.classpath:

conf/spring/

  6.

  7.

  8.

  9.

  10.

  11.

  12.

  13.

  14.

  15.

  16.

  17.struts2

  18.

  19.

  20.

  21.

  22.

  23.

  24.

  25.

  26.

  27.

  28.

  29.

  30.

  31.

  32.

  33.

  34.

  35.

  36.

  37.

  38.

  39.

  40.

  41.struts2/*REQUESTFORWARDINCLUDEUrlRewriteFilterlogLevelWARNUrlRewriteFilter/*

  其它你懂的,就是修改了struts2的过滤器的,增加了几个

  ,WHY?

后面会讲到。

另外再加了个urlrewrite的过滤器。

  4.配置

  1.

  2.

  3.

  其他dataSource、sessionFactory、事务等配置,不是本帖的重点,略去了。

  这里我在中用了default-autowire="byName"让spring自动装配依赖的bean了。

  5.下面贴上各层的代码

  以下是

  再是及

  

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1