我对web系统架构的一些思考


能力/经验有限,不足之处还请指点 :)

负载均衡

这里把多台 nginx 反向代理服务器顶在最前面,可以通过 DNS 简单轮循或绑定虚拟 IP 的方法来实现分流。之所以用 nginx 是因为它的稳定、强大、高性能、低开销、以及对高并发的支持。也可以换成 LVS,从效率上来说肯定会比 nginx 高,因为工作在 OSI 的第四层(传输层),可以修改目标 IP。甚至可以在第二层(数据链路层)修改 MAC 地址(DR 模式,相当于路由器),让数据包直接到达目标服务器。不过工作在下层虽然效率提高了,但相应的控制能力也少了,比如无法根据 http url 来进行负载均衡,缓存页面执行结果等等。

应用层

这一层是 web 服务器,主要任务是从服务层获取需要的数据,然后渲染到模板,返回给前端服务器。可以理解为 Controller-View,没有 Model,因为 Model 被移到了一下层,用来单独提供服务。这么做的原因是方便分布式部署,单元测试,避免单点故障。所以这层是相对较轻松的。

服务层

这一层的任务是提供模块的接口,供上层调用。如相册模块,需要有创建相册/显示相册图片/删除图片等等功能。至于服务的形式就很灵活了,如 REST/RPC/SOAP 等等。

这一层的任务就比较艰巨了,要保证接口的稳定性,要处理复杂的逻辑,实现算法,与存储层交互等等。

存储层

存储层是整个系统的核心,一旦数据丢失,网站就成了空架子了,所以一定要及时备份。

缓存层

在网站流量不大时,缓存是可选层。随着流量的增大,缓存的重要性也越来越突出,甚至可以把内存当硬盘来用,以保证快速响应。如何提高缓存命中率,设置缓存失效时间等等缓存的处理就变得尤为重要。

数据库层

这个可以讲的就太多了,多数系统的瓶颈也在这。总体说来会经历主从服务器,垂直分区和水平分区这三个过程。

分布式存储

这里会遇到的问题是文件的同步,如何分配给用户最合适的服务器,磁盘 I/O 等等。

其他

队列服务器

这也是大型网站的标配,处理日志/分析用户行为/发送邮件等等都会用到。

监控服务器

这么多的服务器,我们需要知道各个服务器当前的运行状况,如磁盘 I/O,CPU 使用率,内存使用率,负载等等,一旦发现异常可以及时处理。

日志服务器

排查故障就靠它了,比如有骇客入侵,某个页面访问很慢,出现 500 错误,慢查询等等。

备份服务器

这个重要性不言而喻,比如数据库宕机,某张表损坏,数据库磁盘错误等等。没有了它,辛辛苦苦积攒下来的数据就这么一去不复返了。