请教banq老师关于高负载网站的设计

08-03-19 sprewell8468
现在的应用是基于struts+spring+hibernate, postgresql, tomcat5.5, apache2.2.

网站是一个social network, 有3个主要的应用,包括论坛,相册等。 程序基本上快出来了,是分成了4个模块交给三个公司外包做的,现在面临整合的问题,但这是次要的。

我想知道如果这个网站如果要承载大并发量的情况下(假设1万人同时在线), 应该在服务器的哪些地方做调整?应该如何做有正对性的集群或者是负载均衡。谢谢。

sprewell8468
2008-03-19 17:22
我点了几个google提供的广告 :)

banq
2008-03-21 10:10
服务器群的几个策略,从简单到高级

1.人为划分服务器 :大多数采取的,包括游戏网站,必须由用户自己选择哪个服务器,这是最低级朴素的。

2.负载平衡 只需要配置tomcat就可以了,程序不用动。

3.集群 需要涉及程序架构

第三种集群策略效率高,精确制导,但是你的程序架构也要有要求的,比如相册上传后放在什么地方,如果放在本地硬盘,那么在集群环境下就会有问题,除非你让几个服务器共享一个大硬盘,这带来昂贵和单点风险。

第三种集群策略有两个方向:

1. 自己动手在现有单机架构中引入分布式缓存机制。

2. 使用基于集群的技术如EJB等。

sprewell8468
2008-03-21 16:54
谢谢banq老师的详细讲解。

那我现在主要的问题还是数据库的集群,应用程序就采用负载均衡。 那么有没有办法让数据库做负载均衡呢?比如说不同的表存在不同的服务器里面, 然后取数据的时候分别区,写数据的时候也分别写,是不是这样就需要重构底层代码了?

关于图片的存储,是否可以单独放在一个文件服务器里面? 以后是打算迁移到amazon的s3里面,也牵涉到代码的修改。

还有一个问题是关于数据库的迁移,如果一个完整的应用程序,基于struts_hibernate_spring,现在是基于mysql的编码,如果要完整迁移到postgresql上面(不包含任何数据),难度大吗?大概需要做什么改到。

prominent
2008-03-22 16:45
我也遇到这种问题,我用两台服务器都装上了tomcat,用apache转发,连接到同一个数据库,当我在负载平衡的时候,老是提示登录过期,有时程序要登录好几次才可以进入,登录进去后有时操作也会提示过期,我本人猜测是负载导致session丢失,当第一次访问tomcat1时,在第二次可能不会把请求都映射到tomcat1而是tomcat2上去了,请banq老师给点建议和提示?

banq
2008-03-24 14:40
>那么有没有办法让数据库做负载均衡呢?写数据的时候也分别写,是不是这样就需要重构底层代码了

可以是可以,使用多个数据源datasource,使用JNDI来访问数据库。代码动得太多不好,特别是JavaEE本来就是屏蔽数据库的软件,你在程序中故意区分容易造成程序移植性不强,过分定制了,

>基于struts_hibernate_spring,现在是基于mysql的编码,如果要完整迁移到postgresql上面(不包含任何数据),难度大吗

难度不大,SSH是屏蔽了数据库的,只要修改一下hibernate配置就可以。

关于前面贴session失效,两种做法:

1. 使用专门的设备使得客户端和服务器粘起来,不要转发到其他tomcat

2. 凡是需要登录的使用一个servletfilter,对cookie进行查找,如果登录过,cookie有存在,让其自动登录

prominent
2008-03-24 16:46
不知道什么设备可以把客户端和服务器粘起来。

我是用apache进行配置的,里面有个配置是可以设置成粘性的,几个人访问的话没什么问题,人一多的话session就乱了

sprewell8468
2008-03-24 17:00
谢谢,那做postgresql的数据库集群,通常在代码上会有什么要求的吗?或者说SSH架构本身就能自适应这种集群环境。

猜你喜欢