Fork me on GitHub

大型网站的自强之路

1、大型网站的自强之路

当年马云筹办阿里巴巴的时候并没有说我要做个大型网站,搞个双11,成交额做到千亿级别;马化腾也没有说以后我要做个通讯工具,让13亿乃至更多用户都成为我们的用户……我们现如今看到的各个大型网站或产品都是一步步踏踏实实走过来的,在各种坑和故障中成长起来的。

1.1、一台电脑就是服务器

做过课程设计或者毕业设计的计算机相关的同学都应该有过搭建项目的经验。画一堆界面,结合js和后台实现数据的展现,当然还要有数据来源——数据库,启动一个容器比如tomcat,那么我们就可以在本机上访问我们的网站了。想必没有比这还简单的网站了吧,自己的电脑就充当了服务器的角色,应用和数据库都部署在了自己的电脑上。

1.2、我们需要丰富网站的功能

随着一个单机网站的不断完善,用户的增长,我们不再也不能只是一个完成缴费或者完成选课的单一功能的网站应用。我们需要从各个维度把这些应用分离开来,比如一个电商网站,我们有用户、商品和交易三个基本模块。
用户

  • 用户注册
  • 用户管理

商品

  • 商品展示
  • 商品管理

交易

  • 订单系统
  • 交易管理

随着应用的分块,数据库中表的划分也会相应变化。大概的结构图如下

1.3、应用数据库分离

不管是2.1中的电脑即服务器,还是2.2中的应用和DB放在同一服务器上,这两种都没有将应用和DB做分离。随着我们应用网站的访问量逐渐增多,对于服务器的压力也增大了,我们需要考虑分离应用和数据库以保证应用更加稳定。
相比2.2,我们只是将应用模块和DB模块部署在两台服务器上,这样各自的服务出现问题不会影响对应的模块,同时也减轻了原来一台服务器的压力。

1.4激增的访问让应用服务器走向集群

当应用服务器承受的压力越来越大时,我们考虑将应用服务器走向集群化。大概结构如下:

注意
因为这里使用了多个应用服务器,Session就不再像单应用服务器那样只有一个可选,这时候对于多个应用服务器,可能会出现这次的请求是被A应用服务处理,但是下一次就会被B应用服务器处理,应用Http是无状态,所以需要借助Session实现有状态,但是显然这里Session无法完成这个“艰巨”的任务。
针对这个问题,解决方法较多。比如可以在请求和服务器之间加一个负载均衡器,让负载均衡器维系请求和服务器之间的对应关系,如果发现是张三发来的请求那就扔到服务器A上处理,如果是李四的就扔到服务器B上处理。
还有一种处理方法是添加一个同步操作,在两个服务器之间完成Session同步,这样不管服务器A还是B都会有全集的Session集合了,那么谁处理就显得不重要了。

1.5、数据库扛不住了,读写分离

这个时候我们不能再把自己的应用网站成为小网站了,我们的数据量和访问量空前的增长以至于数据库有些hold不住了。所以我们需要将数据库进行读写分离了,毕竟我们一般的网站应用读数据库占得比重比较多。大概的结构如下:

从图中可以看出,用于读的数据库可以直接被应用读取,同时它与主库之间需要及时同步,当应用需要向主库写入数据时,则需要将写入的数据通过到DB Read数据库中,保证数据的实时性和准确性。
读写分离还有更多的延伸,包括使用缓存以及数据库的垂直和水平拆分等,后面再说吧。

如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!如果您想持续关注我的文章,请扫描二维码,关注JackieZheng的微信公众号,我会将我的文章推送给您,并和您一起分享我日常阅读过的优质文章。

posted @ 2017-06-14 22:52  JackieZheng  阅读(2548)  评论(4编辑  收藏  举报