文档章节

大型网站架构演化

lizo
 lizo
发布于 2017/02/12 14:14
字数 1416
阅读 2927
收藏 205

原创地址:https://my.oschina.net/u/3039671/blog/836750

1. 最初始的网站架构

 

就像我们在自己电脑上搭建了一个论坛的网站,应用程序(例如Apache服务器)、数据库等都部署在我们自己的电脑上的。就可以正常运行了。

2. 应用服务和数据服务分离

我们的论坛越来越受欢迎,用户越来越多,论坛也十分越活。但是面临的问题是数据库中的信息越来越多,存储不够了。这个时候我们又多弄了几台服务器,应用程序(Apache服务器)、数据库和保存用户上传的文件(图片)单独部署在不同的服务器上。

应用服务器处理大量的业务逻辑,所以需要更好的CPU

数据库服务器需要完成数据的快速查询,所以需要更大的硬盘和内存

文件服务器保存用户上传的图片等文件,所以需要更大的硬盘

3. 使用缓存改善网站性能

我们的论坛用户继续快速增涨,我们发现访问速度越来越慢,原因就是很多请求都要访问数据库(例如,读取用户的个人信息,打个不恰当的比喻,每次进入一个话题,该话题中的每一个发言用户的信息都要从数据库中读取)。这个时候如果我们能缓存这些用户信息,每次从缓存中读取,这样对数据库的压力会大大降低,并且读取的性能也提升了很多。

4. 使用应用服务器集群改善网站的并发处理能力。

使用缓存后,又出现问题了,在论坛使用高峰的时候,单一应用服务器处理请求连接有限,这个时候就需要部署应用服务器集群,然后在使用一个负载均衡服务器(例如Nginx,apache Server)。

5. 数据库读写分离

用户继续增加,使用缓存后,虽然大部分读的操作都不会直接访问数据库,但是还是有一些读操作(缓存未命中,缓存过期)和全部的写操作还是必须操作数据库。当用户达到一定规模,数据库又成了系统的性能瓶颈。

在原来单一数据库的模式上,设置一个主数据库和从数据库,写操作的时候写入主数据库,然后从主数据库同步到从数据库中。读操作就在从数据库中读。当然我们需要一个数据访问的模块来处理这些逻辑

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

论坛用户反应,打开你们的论坛速度太慢了,再不改善我就不用了。

原因也很简单,一个访问请求中,也许存在很多静态资源(CSS,图片)等,又或者用户的使用的联通,我们的服务器在电信。适应反向代理和CDN技术可以大大改善用户请求的响应速度

7. 使用分布式数据库和分布式文件系统

虽然数据库进行读写分离以后,但是在我们论坛疯狂增涨下,任何强大的单一服务器的性能都是有限的,只有使用分布式系统,才能在业务不断增涨进行横向扩展。这个是我们最后手段了,使用之前应该先考虑能否根据业务不同来拆分数据库。例如我们论坛的包括了不同主题(汽车、房子、以及你懂的话题),如果按照这些主题来区分数据库,也是好的选择。(注意这个虽然也是要使用多个数据库,但和分布式数据库的概念是有很大区别的)

8. 使用NoSql和搜索引擎

论坛中,要搜索一些帖子,如果每次进行数据库查询,在数据量十分大的情况,显然是不可取的。还有就是对数据存储的要求,需要使用搜索引擎(例如lucene)。

NoSql主要是对一些特殊需求的数据进行存储,例如配置信息可以放redis中(也算是缓存),日志信息可以存储在Hbase上等等。

9. 业务拆分

为了以后以后的发展,我们的业务需要扩展,我们需要增加即时通讯的业务(类似微信),知识问答(类似知乎)。但是这些业务是分开开发的,如果和原有的论坛业务耦合在一起,在代码发布的时候,就会十分麻烦。这个时候,根据不同的业务,分别进行部署和发布。

10. 分布式服务

虽然按照业务进行拆分以后,虽然不同业务之间的管理隔离开来,但是问题又出现了,但我们部署了上万台服务器的时候,每个服务器都保持有与数据库的连接,这样会导致数据集的连接资源不够。而且还有个问题就是对一些基础功能每个业务之间有重复开发的问题。

所以,我们把一些基础业务功能提取出来,做成基础服务独立部署(登录服务、用户信息管理,日志功能等)。这样上层只用关系自己的业务逻辑,调用底层统一的基础服务。

© 著作权归作者所有

共有 人打赏支持
lizo
粉丝 59
博文 39
码字总数 48903
作品 0
杭州
程序员
加载中

评论(14)

manymore13
manymore13
不错!学习了!
伤痛无痕
伤痛无痕
这篇文章来自于《大型网站技术架构》这本书中
JiYF
JiYF
描述了一个网站的从发布到不断的更新的,以及架构的生长更新过程!谢谢分享!
洋洋照我心
洋洋照我心
这篇文章我在知乎上见过 是否是转载?
一路南漂
一路南漂
很清晰,感谢分享~ :smile:
lizo
lizo

引用来自“独孤影”的评论

关于地域加速,正确的做法应该是,分布式服务加DNS负载均衡
是的,如果一开始用户量就比较多,肯定考虑分布式
lizo
lizo

引用来自“独孤影”的评论

关于地域加速,正确的做法应该是,分布式服务加DNS负载均衡
是的,CDN必须和DNS负载一起使用才有意义
天霜万籁
天霜万籁
搜索非结构化数据,技术选型不一定是nosql,也可以考虑全文检索做实现方案
陈大羊
陈大羊
服务总线用得上不?
purple_grape
purple_grape
楼主说的是比较传统的路线,现在进化到分布式起步了。

暂无文章

day96-20180923-英语流利阅读-待学习

英国王子也不看好人工智能,理由却和霍金不同 Daniel 2018-09-23 1.今日导读 2016 年 3 月 9 日至 15 日,世界围棋冠军李世石与谷歌研发的计算机围棋程序 AlphaGo 进行人机大战并以 1 比 4 ...

飞鱼说编程
48分钟前
1
0
今天在码云遇到一个很有意思的人 for Per.js

今天在码云遇到一个很有意思的人,他在我的Per.js项目下面评论了一句,大意为“你试试这句代码,看看速度到底是你快还是Vue快”【当然,这个评论被我手残不小心删掉了...】。 然后我就试了,...

Skyogo
52分钟前
24
0
Java -------- 首字母相关排序总结

Java 字符串数组首字母排序 字符串数组按首字母排序:(区分大小写) String[] strings = new String[]{"ba","aa","CC","Ba","DD","ee","dd"}; Arrays.sort(strings); for (int i ...

切切歆语
54分钟前
2
0
还在用 Git 的 -f 参数强推仓库,你这是在作死!

最近,美国一个程序员因为同事不写注释,代码不规范,最严重的是天天使用 git push -f 参数强行覆盖仓库,该程序员忍无可忍向四名同事开抢,其中一人情况危急!!! 不写注释、代码不规范是一...

红薯
今天
480
0
NPM报错终极大法

所有的错误基本上都跟node的版本相关 直接删除系统中的node 重新安装 sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*} 重新安装 $ n lts$ npm...

lilugirl
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部