一个较为合理的网站架构,通常会对整个架构进行分层设计。这样的好处是分散服务器的压力,不至于由于单台服务器压力过大宕机而停止提供服务。在架构设计中,我觉得有2个黄金准则。一个是“所有的问题,都往前面推”,另一个是“避免单点故障”。这两点实际上也就保证了系统架构的高可用、可扩展性和可靠性。

   下面简单的画一个图,来说明一下,就我的理解,一个网站的架构大概可以分为以下四层:

    从底层开始,分别是共享存储层,服务器层,缓存加速层,负载均衡层等4层。

共享存储层:提供存储空间,由于上面一层多台服务器都连接到共享存储设备这里来,这样就保证了数据的一致性。当然共享存储设备的价格还是相当昂贵的,并不是所有公司,所有业务都承受得起。在没有这种条件的情况下,就只能使用一台有较大硬盘空间的服务器,作为存储设备,并在上层服务器上,通过NFS 挂载该设备。  

    这一层所涉及的技术或工具有:分布式文件系统,NFS,DRBD,RAID阵列等。

相关链接:

DRBD+HeartBeat+NFS 架构 http://pmghong.blog.51cto.com/3221425/1261349

镜像技术DRBD http://pmghong.blog.51cto.com/3221425/1260138

磁盘镜像技术 DRBD 原理简介 http://pmghong.blog.51cto.com/3221425/1259488


服务器层:顾名思义,这一层服务器主要提供相关的业务支持,例如这是一个网站架构,则这里提供的主要是web服务和mysql数据库的服务。多台服务器组成的一个集合叫做“服务器池”,当用户请求分配过来后,系统将从服务器池中挑选出其中一台服务,并由分配到的这台服务器真正的提供服务。当业务扩展,服务器压力过大,可以往该服务器池中添加新的服务器,共同分摊压力,从而减小单台机器的压力,提高效率。

   这一层涉及的软件:apache、nginx、lighthttpd等。其中以nginx的性能为优,它支持高并发,而且资源消耗少,配置简单。

相关链接:

nginx+tomcat 跑jsp http://pmghong.blog.51cto.com/3221425/1218497

apache+nginx 实现动静分离 http://pmghong.blog.51cto.com/3221425/1217151

搭建lemp环境http://pmghong.blog.51cto.com/3221425/1178603


缓存层:这一层实际上并不是必须的,但业务较小的时候,可以先不考虑这一层的设计。缓存层顾名思义,就是通过缓存静态文件,从而达到加速的功能。设置了缓存层之后,当用户第一次请求访问的时候,缓存服务器会到底层走一遍,将用户请求数据拿过来,发送给用户并在本地保存一份数据。但第二次,用户请求相同的内容的时候,缓存服务器还是会到底层跑一遍,但是它只做一个校验,已确保缓存中的数据是否与底层服务器上的数据一致。如果一致,则缓存服务器会将缓存中的数据直接返回给用户,从而提高用户体验。

   这一层涉及的软件:squid,nginx

相关链接:

nginx 实现反向代理  http://pmghong.blog.51cto.com/3221425/1244223


   负载均衡层:这一层的服务器作为先锋(置于最前端,用户请求最先到达),需要相当的处理和负载能力,因为它本身充当的就是一个调度器的作用,需要扛住大量的用户访问所造成的压力。因此这一层的服务器往往要求高CPU,高内存和高带宽等。另外这一层作为整个架构的最前端,相当于整个架构的统帅,一旦这一层停止提供服务,底层服务器将全部停止提供服务(确切的讲,是没办法被分配到任务)所以,应该足够重视这一层服务器的设置,可通过一些机制、技术来确保其可靠性。不至于单台服务器宕机,则造成整个系统的瘫痪。

   这一层涉及的软件和技术:haproxy、keepalived、nginx、lvs等


相关链接:

nginx+keepalived 负载均衡架构  http://pmghong.blog.51cto.com/3221425/1264947

Haproxy+keepalived实现高可用负载均衡 http://pmghong.blog.51cto.com/3221425/1262741

lvs+keepalive 实现高可用集群 http://pmghong.blog.51cto.com/3221425/1201533

LVS_TUN http://pmghong.blog.51cto.com/3221425/1195695

LVS_DR  http://pmghong.blog.51cto.com/3221425/1195686

LVS_NAT  http://pmghong.blog.51cto.com/3221425/1192543


补充一下:

   实际上,在架构的设计中,还有两点需要考虑进去,一个就是数据库的设计。对于一个大型网站来说,数据库的设计尤为重要,它可能对网站的整体响应速度上,起着至关重要的作用。例如,当数据量大的时候,应该如何对数据进行“切割”,如何提高查询速度,这些都是我们需要考虑的。(这里只考虑mysql)

相关技术和要点:

   mysql分表(垂直分表,水平分表)、mysql分区、mysql慢查询、sql语句优化、参数优化、索引、数据库备份等。

主要的架构有:主从复制、mysql集群


另一方面就是监控系统。在事故发生的第一时间赶赴现场并及时处理问题,是我们运维人员义不容辞的。我们不可能7*24 小时对着监控屏幕看服务器是否出现问题,这时我们便需要一个工具来帮我们“看着”我们的服务器,那就是监控系统。


   这里说的监控系统,其实可大可小,具体应该根据业务需求来确定,可以简单的通过shell,python等脚本来实现监控并报警。也可以通过其他开源软件来完成,这里主要推荐以下三款:

nagios、cacti和zabbix,这三者各有优缺点,这里就不展开了,有需要的可以自行去了解。



以上观点,均为个人所见,鉴于本人学识浅薄,可能很多方面都没考虑到,还请大家多多指教。有什么补充的,也欢迎大家提出来,完善一下!谢谢