一、网站架构的角色

1、基本架构

wKiom1e9YpPhYceCAAAYBMfc94A696.png-wh_50



2、网站架构升级,用户访问速度提高,提高用户体验

CDN 解决南电信北联通网站访问慢问题,通过代理CDN缓存功能

代理实现负载均衡功能

web服务器存放音乐、图片、视频等存储无限扩大

缓存解决数据库读写大、IO高,负载高,服务器慢问题,否则成为网站的瓶颈

wKioL1e9Ysaj20P7AACZR_Fpaqw537.png-wh_50



3、网站的web服务器角色介绍

web (IIS, Apache, Nginx+php-fpm, Tomcat+jdk(jsp), Nginx+uwsgi+python(豆瓣)等)

数据库db (MySQL/MariDB, PostgreSQL, Oracle, 非关系型数据库MongoDB)

缓存 (Memcached, Redis)

代理 (Varnish, Squid, Nginx)

CDN (腾讯云、阿里云、up云)就是带有缓存的代理,智能DNS解析,上海和北京的用户ping 域名解析IP是不同。

参考:http://www.wtoutiao.com/p/1f9wWEw.html

存储 (GFS, FastdFS, HDFS, TFS, GlusterFS等)

参考 http://www.apelearn.com/bbs/thread-7734-1-1.html

集群 (keepalived+lvs, heartbeat+nginx, haproxy, mysql-proxy)


4、阿里CND架构图

wKioL1e9a9eigbtyAAMbNWPze60918.png-wh_50


5、分布式文件系统

防止其中一台机器宕机导致数据丢失


wKiom1e9bQDBrCyYAARmZ3DkvPk313.png-wh_50



6、网站架构角色


wKiom1e-rdHDmuBdAAY36Jm820E030.png-wh_50


wKiom1e-ruHyyEOtAAX5jDB5vOA574.png-wh_50



wKiom1e-r0yS-pdFAAL1S8ZJd6E929.png-wh_50




wKiom1e-rhzRSO6sAAI4Jy7AE6M397.png-wh_50



Mysql-Proxy实现读写分离




二、中大型网站架构演变过程

参考:

http://www.apelearn.com/bbs/thread-8644-1-1.html

http://www.jianshu.com/p/f8e968e57863

http://blog.jobbole.com/87736/

http://blog.jobbole.com/87737/


假设一个网站(discuz)从最开始访问量很小做到日pv千万,我们来推测一下它的mysql服务器架构演变过程。

第一阶段
网站访问量日pv量级在1w以下。单台机器跑web和db,不需要做架构层调优(比如,不需要增加memcached缓存)。此时,数据往往都是每日冷备份的,但有时候如果考虑数据安全性,会搭建一个mysql主从。

wKioL1e-tJSQj3cIAACR8J4m8t4618.png-wh_50



第二阶段

网站访问量日pv达到几万。此时单台机器已经有点负载,需要我们把web和db分开,需要搭建memcached服务作为缓存。也就是说,在这个阶段,我们还可以使用单台机器跑mysql去承担整个网站的数据存储和查询。如果做mysql主从,目的也是为了数据安全性。

wKioL1e-sv3A9PcJAACRZEcjhvc558.png-wh_50


第三阶段

网站访问量日pv达到几十万。单台机器虽然也可以支撑,但是需要的机器配置要比之前的机器好很多。如果经费允许,可以购买配置很高的机器来跑mysql服务,但是并不是说,配置翻倍,性能也翻倍,到了一定阶段配置增加已经不能带来性能的增加。所以,此阶段,我们会想到做mysql服务的集群,也就是说我们可以拿多台机器跑mysql。但,mysql的集群和web集群是不一样的,我们需要考虑数据的一致性,所以不能简单套用做web集群的方式(lvs,nginx代理)。可以做的架构是,mysql主从,一主多从。为了保证架构的健壮和数据完整,主只能是一个,从可以是多个,注意:不允许在从上写,从只能允许读。


还有一个问题,我们需要想到,就是在前端web层,我们的程序里面指定了mysql机器的ip,那么当mysql机器有多台时,程序里面如何去配置?discuz,其实有一个功能,支持mysql读写分离。即,我们可以拿多台机器跑mysql,其中一台写,其他多台是读,我们只需要把读和写的ip分别配置到程序中,程序自动会去区分机器。当然,如果不使用discuz自带的配置,我们还可以引用一个软件叫做 mysql-proxy, 使用他来实现读写分离。它支持一主多从的模式。

wKioL1e-s7WA9bvEAADf-a12WRI828.png-wh_50




第四阶段

用mencached做缓存,mysql数据存在磁盘中,memcache的数据保存在内存中,这样可以加速用户访问的常用的一些数据。

wKioL1e-s_Lxxu4_AAEfVLPgdIg746.png-wh_50


网站访问量日pv到几百万。之前的一主多从模式已经遇到瓶颈,因为当网站访问量变大,读数据库的量也会越来越大,我们需要多加一些从进来,但是从的数量增加到数十台时,由于主需要把bin-log全部分发到所有从上,那么这个过程本身就是一件很繁琐的事情,再加上频繁读取,势必会造成从上同步过来的数据有很大延迟。所以,我们可以做一个优化,把mysql原来的一主多从变为一主一从,然后从作为其他从的主,而前面的主只负责网站业务的写入,而后面的从不负责网站任何业务,只负责给其他从同步bin-log。这样还可以继续多叠加几个从库。


当访问量很大,nfs依赖的网络是瓶颈了,买一个商业的SAN,做共享,或者使用分布式文件存储也可以。

wKiom1e-s_KTU_Q3AAGDOy_9XEs005.png-wh_50




第五阶段

网站访问量日pv到1千万的时候,我们发现,网站的写入量非常大,我们之前架构中只有一个主,这里的主已经成为瓶颈了。所以,需要再近一步做出调整。比如,我们可以把业务分模块,把用户相关的单独分离出来,把权限、积分等也可以分离出来单独跑一个库,然后再做主从,也就是所谓的分库。当然也可以换一个纬度,把访问量或者写入量大的表单独分离出来,跑在一台服务器上,也可以把一个表分成多个小表。这一步操作,涉及到一些程序上的改动,所以需要事先和开发同事做好沟通和设计。总之,这一步要做的就是分库分表

wKioL1e-s_PiiyREAAGkfG-4eoE474.png-wh_50


再往后发展,继续把大表分小表即可。 而国内阿里淘宝网站的数据量是巨量的,他们的数据库全部都是mysql,他们的mysql架构就是遵循分库分表这个原则的,只不过他们划分规则会有很多纬度,比如可以根据地域划分,可以根据买家、卖家划分,可以根据时间划分等等。

wKiom1e-s_TByCFqAAGJv03t4vM578.png-wh_50


缓存的集群

magent实现memcached集群,参考:http://www.cnblogs.com/luotianshuai/p/5088581.html

wKiom1e_82aCP00DAAErQ3wmWys983.png-wh_50


codis实现redis集群,参考:http://www.jianshu.com/p/f8e968e57863

wKiom1e_9QTD3N32AAEjifT79Ps023.png-wh_50