读了《大型网站系统与Java中间件实践》,根据自己的学习和一些以往的经验进行总结,让自己对大型网站构建有更深入的理解。
一、分布式系统
我们最开始建立的网站一般都是在单机上的,当单机服务器支撑不住的时候,就需要多台服务器一起来完成工作,这时就需要分布式系统,来提升系统的处理能力。
一般情况,处理能力关注的是CPU、内存、磁盘和网络。当这些指标超过我们预估的阈值时,表示我们服务器可能快要达到瓶颈了。
分布式系统能带来什么好处呢:
- 购买单颗处理器,处理器性能越高,要付出的成本就越高,性价比越低。
- 单颗处理器总是有自己的瓶颈的,处理能力并不是无限大的。
- 分布式系统带来的稳定性、可用性的提升,以及容灾备份。
当我们的服务器从单机变成多台服务器的时候,那如何来处理请求呢。在分布式系统中,将多个服务器集成起来处理请求,有3种常见的请求分发方式。
1.代理分发的方式
一般称为透明代理,用户的请求先到代理,再由代理进行分发到具体服务器。这种方式非常方便、直观,负载均衡都由代理负责分发,最常见的就是使用nginx作为透明代理,分发请求到不同的服务器上。可以参考另一篇单独讲负载均衡的文章。《负载均衡的方案》
但是这种方式也有缺点:
- 增加网络耗时
- 代理重要性太大,如果出问题影响很大。
2.名称服务的直连方式
SOA服务框架都是使用这种连接方式,client和server进行直连,有一个”名称服务”的角色,或者叫软负载中心,收集server端的地址信息,提供给client端,client端根据从名称服务得到的地址列表,自己完成负载均衡的工作。即原来的透明代理的工作被拆分到名称服务和client端了。
这样即使名称服务挂了,但是客户端和服务端是使用直连的方式,所以不会影响正在运行中的服务的可用性。这部分会在下面的服务化架构中进行详细说明。
3.规则路由的直连方式
这种方式和名称服务的方式很像,也是client端和server端进行直连,区别在于客户端选择服务端的地址是通过规则服务的规则进行判断的。规则服务不对服务端进行管理,两者之间没有交互,这种方式如果某台server挂了,规则服务是感知不到的,没办法动态地调整server地址。
二、大型网站的构成
每个大型网站都是从一个小网站发展而来的,一个网站最开始一般只部署在单台服务器上的,后来才逐步发展成多服务器集群的部署。最常见的模块可以分为下面几层:
- web应用部署 web应用部署是必须的,Java常用http服务容器有tomcat、jetty等,php使用nginx、apache来处理http协议报文。nginx和apache也可以用来作透明代理,将请求分发给web容器。
- DB存储 网站的数据需要持久化,这时我们就需要DB层存储了,如mysql、oracle、sqlserver等关系型数据库,mongoDB等NoSQL数据库。
- 缓存 要加速DB数据的访问速度,就会使用到缓存,缓存有本地缓存和远程分布式缓存,常见的分布式缓存系统有redis和memcache。
- SOA服务化 网站逻辑变得复杂的时候,底层系统就需要向服务化发展了,这时就需要使用SOA框架将底层的功能模块化,各个业务隔离开自行维护。常用的SOA框架有阿里的dubbo、Facebook的thrift等,大公司基本都是自己定制自己的SOA框架。
- 消息中间件 服务之间需要异步化和解耦,这时需要消息中间件来完成,常见的消息中间件有kafka。
一个大型网站系统会涉及到的模块有很多,除了上面说的常见模块,还有如网站入口DNS服务器的部署,静态资源CDN,集群session,分布式文件系统等等,每一点展开都是一套体系,下面将依次展开细说。
本文探讨了大型网站从单机到分布式的发展过程,介绍了分布式系统的优势与挑战,并概述了常见模块如web应用、DB存储、缓存、SOA服务化及消息中间件等关键组成部分。

2163

被折叠的 条评论
为什么被折叠?



