大型网站的进化之路-阅读《大型网站技术架构》__作者:姚猫猫的博客&姚生01大型网站或软件有哪些特点?高并发、高流量,微信日活10亿7×24高可用,俗称4个9(99.99%)存储和管理海量数据用户分布全国乃至全球,网络安全环境复杂非常差需求变化频繁,需要快速迭代,最后是增量开发。所有大型网站都是从小型网站发展而来的。好的网站和复杂的架构是不断发展的,而不是从头开始设计的。那一年刚出发的时候,谁也想不到微信能有十亿日活。一开始应该没有几万台服务器集群吧?02第一个也是第一个进化路径:应用和数据分离我们最初的小网站是什么样的?逻辑上,一个应用服务一个数据库;物理上,一台服务器就足够了。用户量增加后,我们开始需要将应用程序与数据库分离。应用程序和数据库所需的服务器配置是否相同?当然不是。应用程序需要处理更多的业务逻辑,因此需要更好的CPU。数据库需要快速检索磁盘并放置数据缓存,因此需要更快的磁盘和更大的内存。当然,一切进化的目的都是为了想得更高、更快、更强。只是有时候不可能面面俱到,需要做出选择。03第二次进化:缓存优化恭喜,网站优化了一次,体验提升了,用户量也开始增加了,但是麻烦又来了。用户的增加给数据库带来了更大的压力。我应该怎么办?在IT行业乃至所有现实模型中都有一个无可辩驳的真理,那就是第28条原理。网站访问也是如此,80%的业务访问总是关注20%的数据。在淘宝上买东西,就翻到第一点,淘宝已经为我们找到了信誉好、交易量大的卖家;如果你点击百度,你可以转到前两三页,甚至一页的前几项(如果没有广告);微博热搜,看看前十名,你会不会一一点开下面的?那么,缓存这20%的数据,可以减轻数据库访问压力,提高网站访问性能吗?是的。那么,如何缓存呢?我们通常使用的缓存方案有两种,一种是应用服务器本地缓存,另一种是独立的分布式缓存。优缺点都有什么?本地缓存速度更快,但受应用程序服务器内存的限制,并可能导致与应用程序的争用。独立的分布式缓存可以使用集群,稍微慢一点,但也很快,基本只消耗网络IO;但缺点就是一个字:贵。因为需要购买独立的缓存服务器。所以在现实中,有时候我们不买独立的缓存服务器,而是放在大内存的应用或者数据库服务器上,设置阈值,共享内存。04第三次进化:应用集群和数据库集群,读写分离哇,用了缓存之后,访问数据这么快。但是用户量又增加了,应用支持不了怎么办?多么幸福的烦恼。单个数据库是否存在宕机风险?唉,簇呗。花钱就完事了。应用集群、数据库集群。这也是我们今天的软件架构中最常见的部署场景。通过负责平衡调度器(nginx、F5等),可以将用户请求通过轮询或指定IP的方式分发到应用服务器集群中的任意一台服务器上,缓解应用压力。对于数据库,以Oracle为例,可以在生产服务器上安装RAC版本,应用程序可以通过访问数据库的VIP(VirtualIP)或者JDBC集群访问来访问数据库。但是在网站的应用开发中,一般选择mysql的比较多。淘宝虽然早期也是用的oracle,后来也改用mysql了。至于为什么?呵呵,一个字,贵。两个字,很贵。三个字,太贵了。集群有两个好处:1.缓解服务压力;2、高可用,其中一个坏了,另一个可以继续使用,给你一个恢复服务的机会。一般的软件演化到这里就结束了。但是在网站上有区别。在许多情况下,它读取更多而写入更少。喜欢和吃瓜的人远远少于在台上评论的人吧?在很多读的情况下,虽然通过缓存配置消化了一部分,但是部分读操作(缓存未命中,缓存过期)和所有的写操作都会访问数据库。所以当你的用户数量快速增长到一定规模时,数据库又成为我们的瓶颈。目前大多数数据库都支持主从热备份功能。主库通过主从复制机制将数据更新同步到从库。此时,我们的应用程序可以构建一个专门的数据库读写访问模块,使数据库的读写分离对应用程序透明。有时我们甚至剥离专用查询模块并将其作为另一个子系统。05不算进化的第四次进化:为什么CDN和反向代理需要CDN?中国移动、中国电信、中国联通……、华东、华南、西南、西北……,网络环境复杂,各地区访问网站速度也不尽相同。CDN和反向代理是一种加速访问的手段,其基本原理是缓存。不同的是,CDN部署在网络厂商的机房,而反向代理部署在网站的机房。CDN和反向的目的是尽快将数据返回给用户。06三国演义第五次进化:分布式进化,业务拆分合并分布式数据库是不得已而为之的,只有在单表数据非常大的情况下才会使用。很多网站和软件根本就不用这一步,分布式数据库会带来更麻烦的复杂性。网站比较常用的方法是业务拆分,拆分不同的业务应用,拆分不同的业务库,部署在不同的物理服务器上。这个动作,在围棋中,叫做分而治之。三国之说,长生必分。以商城网站为例,首页、店铺、订单、卖家、买家可以分为不同的产品线,不同的产品线又可以分为多个应用,由不同的业务团队管理。应用程序可以通过主页上的超链接建立关系,也可以通过消息队列分发数据。当然,大部分应用还是会访问同一个数据存储系统,从而形成一个完整的系统。这称为微服务。随着业务拆分越来越小,应用越来越复杂,出现了一些共享服务。比如用户管理,商品管理,那么这些公共服务可以抽取出来独立部署。用现在流行的话,叫商务中心。在技??术上,大家造了各种各样的轮子,解决的问题其实有很多共同点。如文件、图片处理、数据存储和搜索系统。还有一个技术中心。在数据方面,我们的系统越来越碎片化,因为它们被拆分存储在不同的数据库中,形成了一个又一个的数据孤岛。把这些连成一个数据仓库,分析用户画像不是很好吗?熟悉优惠券推送和大数据。在技??术方面,随着数据越来越多,对数据存储和检索的技术要求也越来越高。所以我们会参考一些非关系型的技术,比如NoSQL、搜索引擎等等。最后,还有一个数据中心。所谓久远必分,新三国初具规模。欢迎关注我的公众号:姚猫猫的博客。下面是我对自己编程生涯的感悟和总结。工作中有Java、Linux、Oracle、mysql相关技术、架构设计实践和阅读理论,还有JVM、Linux。,数据库的性能调优,有...技巧,有情怀,有温度。欢迎关注我:药猫药药生
