大型网站技术架构的演进

  

Screen Shot 2015-03-08 at 8.48.20 PM

 

  这里有一个问题,书没有提到:应该缓存哪些数据?应该有一些原则的吧。

  – 使用服务器集群

  当这台服务器的处理能力达到上限时,它就会成为瓶颈。虽然你是可以通过购买更强大的硬件,但总会有上限。这时,我们就需要服务器的集群。这时,就必须加个新东西:负载均衡调度服务器。

  

Screen Shot 2015-03-08 at 9.08.59 PM

 

  但是,使用服务器集群时,需要考虑一个问题:Session的管理问题。Session的管理有以下几种方式:

  * Session Sticky:打个比方就是如果我们每次吃饭都要保证我们用的是自己的碗筷,而只要我们在一家饭店里存着我们的碗筷,只要我们每次去这家饭店吃饭就好了。

  

Screen Shot 2015-03-08 at 9.12.37 PM

 

  这种方式的问题:

  1. 一台服务器重启,上面的session都没了

  2. 负载均衡器成了有状态的机器,要实现容灾会有麻烦

  * Session复制:就像我们在所有的饭店里都存一份自己的碗筷。不适合做大规模集群,适合机器不多的情况

  

Screen Shot 2015-03-08 at 9.22.34 PM

 

  这种方案的问题:

  1. 应用服务器间带宽问题

  2. 大量用户在线时,占用内存过多

  * 基于Cookie:类似于每次吃饭都把自己的碗筷带上

  

Screen Shot 2015-03-08 at 9.28.16 PM

 

  这种方案的问题:

  1. Cookie的长度限制

  2. 安全性

  3. 数据中心外部带宽的消耗

  4. 性能影响,服务器处理每次的请求的内容又多了

  * Session服务器:同样可以是集群的。这种方式适用于session数量及web服务器数量大的情况

  

Screen Shot 2015-03-08 at 9.35.35 PM

 

  这种方案需要考虑的是:

  1. 保证session服务器的可用性

  2. 我们在写应用时需要做调整,我目前不知道应用服务器能否将这部分逻辑透明化

  – 数据库读写分离

  数据库的一部分读(未缓存、缓存过期)及所有的写操作都还需要经过数据库。当用户量达到一定量,数据库将会成为瓶颈。这边我们使用数据库提供的热备功能,将所有的读操作引入slave服务器。注意:读写分离解决的是读压力大的问题。

  

Screen Shot 2015-03-08 at 9.46.05 PM

 

  因为数据库的读写分离了,所以,我们的应用程序也得做相应的变化。我们实现一个数据访问模块使上层写代码的人不知道读写分离的存在。这里,我很想知道如果我使用ORM模型时,如何实现读写的分离?

  数据库读写分离会遇到如下问题:

  * 数据复制问题: 考虑时延、数据库的支持、复制条件支持。不要忘了,分机房后,这个更是问题。

  * 应用对于数据源的路由问题

  – 使用反向代理和CDN加速网站响应

  使用CDN可以很好的解决不同的地区的访问速度问题,反向代理则在服务器机房中缓存用户资源:

  

Screen Shot 2015-03-08 at 9.51.49 PM

 

  – 使用分布式文件系统

  

Screen Shot 2015-03-08 at 10.18.57 PM

 

  – 数据库专库专用:数据垂直拆分。这样可以解决部分数据写的问题