王二在一所大学混了 4 年,结果毕业后发现找不到好工作,看到签了 BAT 的舍友罗小四,王二默默的留下屈辱的泪水。为了不让自己给母校的求职率抹黑,王二只好去了一个小公司。
小公司只有2个人,老板给王二了一个服务器,于是王二把文件、数据库和程序全部塞到服务器里,然后甩开膀子干活了。
有朋友可能会问,王二为什么把文件、数据库和程序全部装到同一台服务器里?这样很不好找啊,为什么不能像垃圾一样分门别类?
其实我们可以用做产品的思维来看待王二的这个网站架构。比如我们想做个 App,可以先做个微信公众号,此为MVP ,目的是为了快速验证想法是否靠谱。当我们发现用户对公众号的内容非常感兴趣,而公众号已经无法满足用户的互相交流欲望,此时才决定搞 App。
网站架构同理,当一台服务器已经无法满足网站业务的时候,此时再把文件、数据库和程序拎出来,给它们单独找一个服务器。从三室的合租,变成一室的单身公寓,改善一下居住环境,这就是「应用和数据分离」。
这样找东西就方便多了,但并非一劳永逸。
继续上面的例子,在运营 App 的过程中,我们发现用户对某几类文章特别感兴趣,于是在 App 首页弄了个栏目叫「编辑推荐」,把有可能「火」起来的文章,主动呈现给用户,这样用户就不用费心费力的自己去找了。同样,当王二把应用和数据分离后,发现大部分用户都只会访问一部分数据,那么完全可以把这一部分数据丢到缓存里,这样可以给现有的服务器腾出更多的空间。
把数据丢到缓存里,那么缓存是个什么东西呢?
缓存分为本地缓存和远程缓存,它们都需要有个容器来装。本地缓存可以和应用程序一起,放在应用服务器里;而远程缓存则放在专门的分布式缓存服务器里。
如果经过了以上改造,服务器空间还是不够用,怎么办?
一个水池,只有一个排水口,要让水位下降的再快一点,可以多搞几个排水口。网站架构也一样,多搞几个应用服务器,类似并联的电路,完全可以解决交通拥挤堵塞的问题。「不患寡而患不均」,为了让这几个服务器都能认真干活,王二弄了个调度室,去平均分配它们的工作任务,这个调度室,就是复杂均衡调度服务器。
虽然缓存可以分担数据库服务器的压力,但缓存也会过期,所以数据库服务器还是得 24 小时待命,不能出门逛个街约个会什么的。如果很不幸网站数据喜人,那么数据库服务器又要继续以前加班狗的苦逼生活了。前面说应用服务器可以并联好几个,那么数据库服务器也可以玩并联,一个主服务器,专门用来写数据,另一个从服务器,专门用来读数据,这就是「读写分离」。
数据库的从服务器就是主服务器的脑残粉,主服务器留什么发型从服务器留什么发型,它们之间是脑残的 ctrl +c、ctrl+v 的关系。但是应用服务器不知道啊,为了让应用服务器能愉快的和数据服务器交流,一个很有前途的翻译工作岗位诞生了,这就是应用服务器里面的「数据库访问模块」。
准备步行去公交车站,我们肯定会选择离自己近的那一站。到了站牌前,如果有三个站牌,我们肯定先看离自己最近的那个站牌。网站访问也一样,用户的一个访问请求过来了,离用户最近的那个网络提供商的机房抢先接到了请求(CDN),然后把这个请求丢给网站的中心机房。而网站的中心机房也不想动弹离开座位去另一个办公室找缓存服务器,于是它原地翻出离自己手最近的缓存(反向代理),然后把数据返回给用户。
分布式缓存服务器一口气并联了好几个,数据库服务器也从一人单打独斗变成了主从脑残粉,其实这个时候文件服务器相当不爽,三人明明同一天入职,现在应用服务器、数据库服务器都不是一个人在战斗了,文件服务器不并联,天理难容啊!
文件服务器也给自己弄了几个并联服务器,然后改名叫分布式文件服务器。
数据库服务器坐不下去了,它也要搞个分布式缓存服务器,王二如果不给搞它就要离职。于是王二把数据库服务器叫到办公室里,端了一碗心灵鸡汤:年轻人啊,要学会时间管理,来一份邮件就处理一份邮件肯定效率极其低下的,你完全可以每天抽出半小时专门处理邮件,这样效率更高一点啊。
数据库服务器觉得王二说的对,于是它把手头的业务重新分了一下,不同的业务放在不同的物理服务器上,顿时发现空间大了许多。
业务越来越复杂,搜索服务器也加进来了,NoSQL 服务器也加进来了,于是「数据库访问模块」这个翻译的工作量也增加了。
老板发财了,变成了一个土豪,王二也走上了人生巅峰,这个时候来找应用服务器的远方亲戚也越来越多了,什么应用服务器2008,应用服务器2013,应用服务器2017,应用服务器2042……每天应接不暇,连刷朋友圈的时间都没有,于是应用服务器让它们排了一个队,这样接待起来不至于秩序混乱,这个队就是消息队列。和搜索一样,消息队列也有自己的服务器,叫做消息队列服务器。
后来应用服务器发现2008、2013、2017、2042……这几个亲戚和自己一样,都有胆结石,都要吃消炎利胆片,没必要来一个亲戚买一瓶啊,重复劳动太浪费时间了。于是应用服务器索性把消炎利胆片单独抽出来,放在分布式应用服务器里,然后自己和那群数字亲戚,想吃药的时候,直接去里面拿消炎利胆片就行了。
所以,网站架构说到底,本质依然是个时间管理问题——作者,你出来我保证不打你。