-
WEB
应用中的高并发问题
大型网站,比如门户网站。在面对大量用户访问、高并发请求方面,基本的解决方案集
中在这样几个环节:
使用高性能的服务器、高性能的数据库、
高效率的编程语言、
还有高性
能的
< br>Web
容器。但是除了这几个方面,还没法根本解决大型网站面临的高负载和高并
发问
题。
这些解决思路在一定程度上也意味着更大的投入,
p>
并且这样的解决思路具备瓶颈,
没有
很好的
扩展性,以下从平时的项目经验以及引用一些博客的思路来尝试解决高并发的情况。
0
、首先需要关注数据库
没错
,
首先是数据库
,<
/p>
这是大多数应用所面临的首个
SPOF
(
单点故障)。尤其是
Web2.0
的
应
用,数据库的响应是首先要解决的。
可能最初是一台主机,当
数据增加到
100
万以上,那么,数据库的效能急剧下降。常用
的
优化措施是
M-S
(主
-
从)方式进行同步复制,将查询和操作和分别在不同的服务器上进行
操作。我推荐的是
M-M-Slaves
方式
,
2
个主
Master
,多个
Slaves
,需要注意的是,虽然
有
2
个
Master
p>
,但是同时只有
1
个是
Active
,我们可以在一定时候切换。之所以用
2
p>
个
M
,是保证
M<
/p>
不会又成为系统的
SPOF
。
Slaves
可以进一步负载均衡,
可以结合
LVS,
从而将
select
操作适当的平衡到不同的
slaves
上。
以上架构可以抗衡到一定量的负载,但
是随着用户进一步增加,你的用户表数据超过
1
千
万,
这时那个
M
变成了
p>
SPOF
。
你不能任意扩充
Slaves
,
否则复制同步的开销将直线上升,
p>
怎么办?我的方法是表分区,从业务层面上进行分区。最简单的,
以
用户数据为例。根据一
定的切分方式,比如
id
,切分到不同的数据库集群去。
< br>全局数据库用于
meta
数据的查询。缺点是每次查询,
会增加一次,比如你要查一个用户
nightsailer,
你
首先要到全局数据库群找到
nightsailer
对应的
p>
cluster
id
,然后再到指定的<
/p>
cluster
找到
nightsail
er
的实际数据。
每个
cluster
可以用
m-m
方式,或者
m-m-slaves
方式。这是一个可以扩展
的结构,随着
负载的增加,你可以简单的增加新的
mysql
cluster
进去。
1
、
HTML
静态化
p>
其实大家都知道,效率最高、消耗最小的就是纯静态化的
html<
/p>
页面,所以我们尽可能使我
们的网站上的页面采用静态页面来实现
,
这个最简单的方法其实也是最有效的方法。
但是对
于大量内容并且频繁更新的网站,
我们无法全部手动去挨个实现,
于是出现了我们常见的信
息发布系统
CMS
p>
,像我们常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是
通过信息发布系统来管理和实现的,
信息发布系统可以实现最简单的信息录入自动生
成静态
页面,还能具备频道管理、权限管理、自动抓取等功能,对于一个大型网站来说,
拥有一套
高效、可管理的
CMS
是必不
可少的。
除了门户和信息发布类型
的网站,
对于交互性要求很高的社区类型网站来说,
尽可能的静
态
化也是提高性能的必要手段,
将社区内的帖子、
文章进行实时的静态化,
有更新的时候再重
新静态化
也是大量使用的策略,像
Mop
的大杂烩就是使用了这样的策略
,网易社区等也是
如此。
同时,
html
静态化也是某些缓存策略使用的
手段,对于系统中频繁使用数据库查询但是内
容更新很小的应用,可以考虑使用
html
静态化来实现,比如论坛中论坛的公用设置信息,
这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中,
这些信息
其实大量被前
台程序调用,但是更新频率很小,可以考虑将这部分内容进行后台更新的时
候进行静态化,
这样避免了大量的数据库访问请求。
2
、图片服务器分离
大家知道,对于
Web
服务器来说,不管是
Apache
、
IIS
还是其他容器,图片是最消耗资源
的,
于是我们有必要将图片与页面进行分离,
这是基本上大型网站都会采用的
策略,
他们都
有独立的图片服务器,
甚
至很多台图片服务器。
这样的架构可以降低提供页面访问请求的服
务器系统压力,
并且可以保证系统不会因为图片问题而崩溃,
在应用服务器和图片服务器上,
可以进行不同的配置优化,比如
apache
在配置
ContentType
< br>的时候可以尽量少支持,尽
可能少的
LoadModul
e
,保证更高的系统消耗和执行效率。
3
、数据库集群和库表散列
大型网站都有复杂的应用,
这些应用
必须使用数据库,
那么在面对大量访问的时候,
数据库
的瓶颈很快就能显现出来,
这时一台数据库将很快无法满足应用,
于是我们需要使用数据库
集群或者库表散列。
在数据库集群方面,
很多数据库都有
自己的解决方案,
Oracle
、
Sy
base
等都有很好的方案,
常用的
M
ySQL
提供的
Master/Slave
也是类似的方案,您使用了什么样的
DB
,就参考相
应的解决方案来实施即可。
上面提到的数据库集群由于在架构、
成本、扩张性方面都会受到所采用
DB
类型的限制,于
是我们需要从应用程序的
角度来考虑改善系统架构,
库表散列是常用并且最有效的解决方案。
我们在应用程序中安装业务和应用或者功能模块将数据库进行分离,
不同的模块对应
不同的
数据库或者表,
再按照一定的策略对某个页面或者功能进
行更小的数据库散列,
比如用户表,
按照用户
< br>ID
进行表散列,这样就能够低成本的提升系统的性能并且有很好的扩展性。
p>
soh
u
的论坛就是采用了这样的架构,将
论坛的用户、设置、帖子等信息进行数据库分离,然后
对帖子、用户按照板块和
ID
进行散列数据库和表,最终可以在配置文件中进行简单的配置
便能让系统随时增加一台低成本的数据库进来补充系统性能。
4
、缓存
缓存一词搞技术的都接触过,
很多地方用到缓存。
网站架构和网站开发中的缓存也是非常重
要。这里先讲述最基本的两种缓存。
高级和分布式的缓存在后面讲述。
架构方面的缓存,对
p>
Apache
比较熟悉的人都能知道
Apa
che
提供了自己的缓存模块,也
可以使用外加的
Squid
模块进行缓存,这两种方式均可以有效的提高
Apache
的访问响应
能力。
网站程序开发方面的缓存,
Linux
上提供的
Memory Cache
是常用的缓存接口,
可以在
web
开发中使用,
< br>比如用
Java
开发的时候就可以调用
< br>MemoryCache
对一些数据进行缓存和通
讯共享
,一些大型社区使用了这样的架构。另外,在使用
web
语言开
发的时候,各种语言
基本都有自己的缓存模块和方法,
PHP<
/p>
有
Pear
的
C
ache
模块,
Java
就更多了,<
/p>
.net
不是
很熟悉,相信也肯定有。<
/p>
5
、
ngin
x
分流
-
-
-
-
-
-
-
-
-
上一篇:我爱看电视作文20篇
下一篇:电脑怎么投屏到家里电视?具体方法?