白话网站架构演进

这是白话 IT 系列的文章。白话的意思是,争取用最简单直白的语言描述复杂的 IT 技术。

读写分离,负载均衡,DNS 动态解析,CDN, memcached, Redis, 动态扩容,你是否曾经被这些名词搞得晕头转向,然后发誓要搞清楚这些概念,然后就没有然后了。或许这篇文章可以让你下次和程序员聊天时可以插一两句话。

网站架构的演进不外乎两个原因:

  • 用户越来越多,意味着并发要求越来越高
  • 数据越来越多,意味着存储挑战越来越大

上古时代

实际上,上古时代并遥远,大概在 30 年前吧,甚至更近。那个时候上网的人很少,网站架构简单地一踏糊涂。

上古时代

就一个数据库加一个应用服务器,应用服务器直接开门迎客。有时候,数据库和应用服务器还运行在同一台主机上,简洁得一踏糊涂。如果你认为这种架构只能做简单的事情,那就错了。这种架构也不泛一些大型的应用场景,典型的如银行的信息系统。只是,主机要用 IBM 的大型机,数据库用 Oracle,存储器要用 EMC 。这种架构还有一个特点是贵,死贵。多年之后,一场轰轰烈烈地去 IOE 运行席卷神州大地,前期就是为了解决贵的问题,当然这是后话了。

读写分离

数据库在执行写操作时,需要锁定数据表,这是为了保持数据一致性。想像一下,数据库写了一半,有人读取了数据,它读出来的数据可能是不完整的。

这带来的一个问题,当数据库写得比较频繁,读往往得不到执行,因为数据库老是被锁住。表现在用户层面,网速很快的情况下,一个网页显示得好久都显示不出来,这是因为数据库的读操作得不到执行。

读写分离就是为了解决这个问题的,核心要点是一个 Master 数据库负责数据写入,另外有一到多个 Slave 数据库负责数据读取。Master 和 Slave 之间的数据会自动同步。

读写分离

负载均衡

随着用户量越来越多,应用服务器开始忙不过来了。假设一个应用服务器可以运行 10 个 worker 线程,每个 worker 线程给用户提供服务的时间需要 10 毫秒,那么一个应用服务器只能满足 1000 次/秒的服务请求。超过了这个量级,就需要增加应用服务器,这个时候就引入了负载均衡服务器。

负载均衡服务器负责接收用户发过来的请求,然后看哪个应用服务器比较有空闲,就把请求发送给相应的应用服务器执行。就像部门领导一样,本身自己不做事,只负责把任务分配给空闲的工程师。

负载均衡

动静分离

网站有静态内容和动态内容之分,比如我们上新浪微博网站,网站上的 Logo 就属于静态内容,它是不变的 (这里是指用户无法改变它,实际上微博的开发工程师是可以,也会改变它的),而用户发的微博属于动态内容,它是频繁改变的。用更专业的术语讲,JavaScript,CSS,网站图片属于静态内容。

为了进一步提高性能,可以把静态的内容和动态的内容分离,分别放在不同的服务器上。毕竟,静态的内容不需要读数据库,也不需要经过应用服务器的逻辑运算,可以直接把静态内容发送给用户。这样可以减少中间交互环节,从而提高效率。

动静分离

内容分发网络

当用户进一步增长,一个负载均衡服务器搞不定了。更要命的是,北方的用户访问速度还可以,南方的用户访问起来奇慢无比。这个时候,CDN 闪亮登场了。

CDN 全称是内容分发网络 (Content Delivery Network),它的原理很简单,让一个区域的用户访问那个区域的服务器。比如北方用户从青岛服务器获取数据,华南用户从杭州服务器获取数据,西南用户从广州服务器获取数据。这种分而治之的策略特别适用于静态内容。

内容分发网络

这里有一个问题,怎么样让一部分用户从 负载均衡服务器 1 访问,另外一部分从 负载均衡服务器 2 访问?

这里就涉及到动态 DNS 解析的技术,我们知道普通的 DNS 解析就是从一个域名获得一个或多个对应的 IP 地址信息,这个信息是不变的,即不管是北方用户还是南方用户,获取到的信息是一样的。而动态 DNS 解析,会根据用户的 IP 地址所在的地理位置以及所处的网络运营商的拓扑结构中的位置,返回最靠近的一个 IP 地址给用户。这样就实现了用户的分流,而且实现就近访问原则,从而提高效率。

数据库集群

大家看到上面的架构图,是不是有点头重脚轻的感觉?没错,单纯的读写分享已经无法满足海量数据和海量并发的需求了。这个时候,就需要大容量的分布式数据库登场了。

分布式数据库

分布式数据库的优点是,可以有多个数据中心,在每个数据中心都可以支持读写,后台会自动完成数据同步工作。这个在持续不间断服务领域也是个良好的应用,因为即使一个数据中心损坏了(着火,烧掉了),也可以从另外一个数据中心恢复出数据。

还有一个优点,当数据容量增大,需要扩容时,可以无缝扩容。即应用服务器不受影响。应用服务器只和数据库路由打交道,扩容可以在背后进行。

缓存

从数据库里读数据还是慢,有没有办法把经常读的数据放在缓存里来提高效率呢?这就是 memcached, Redis 干的事情。这样演进后的架构变成了这样:

缓存

总结

看起来很简单,很自然的演进,都是 IT 技术人员数十年努力的结果,绝不简单,绝不容易。如果和研发的开会,你要是说,不是很简单吗,加个分布式数据库不就可以解决问题么?我敢保证程序员们会在内心鄙视你,如果你不是发工资的那个人,鄙视还可能溢于言表。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容