网站Web业务架构从小到大演变

有一天,我突发奇想建立了一个站点,基于 LNMP 架构,起初只有我本身访问,后来由于我点儿正,访问量愈来愈大,因此最终致使下面的架构演变。php

一、单台机器

单台机器由于只是一个小站,访问量一天也没有多少uv(100之内),因此用一台1核1g的机器足够了。机器上安装的是 CentOS 系统,而后搭建了 nginx+php-fpm+mysql 的环境。html

二、一台变两台

访问量愈来愈大,日uv突破5000,单台机器不够了,本能够增长机器配置编程4核8G,可是考虑到还要换机器,因此直接添置一台 DB 服务器单独跑 MySQL服务。原来的服务器只须要跑 nginx+php-fpm,新加服务器跑 MySQL 服务。 在这里,每每会遇到一个问题,就是如何在多台机器上编译安装 LAMP 环境,在单台机器上编译都没有问题,PHP 放在最后,由于它依赖 MySQL,但咱们这里须要把 MySQL 放到另外一台机器,因此编译确定会报错。解决这个问题,其实很简单,即便 WEB 上不须要 MySQL,咱们也要安装一下,由于编译 PHP 的时候依赖它。前端

三、增长memcached

访问量持续增长,uv上w了,DB 服务器和 WEB 服务器压力愈来愈大,这时候咱们须要加一个缓存来缓解 DB 服务器的压力。一样是两台机器,只不过 WEB机器配置须要升级了,原来的1核1g不够用了,不只要加 cpu 还要加内存,由于在 WEB 上咱们须要运行 memcached 服务,同时 php 也须要安装memcache 扩展。mysql

四、增长WEB并作MySQL主从

访问量又扩大了,uv到了5w,数据库服务器由于一开始配置就挺高,因此没有压力,可是 WEB 服务器负载有点高了,在高峰期能够感受到网站访问变慢。因此,这时候不得不考虑要加一台 WEB 服务器。另外,数据库是单点,若是磁盘损坏,可能会带来意想不到的后果,因此咱们有必要加一台从 DB 服务器,做为数据的备份。nginx

在这里,两台 WEB 服务器咱们并无作负载均衡,由于为了节省资源,暂时先不去购买服务器作负载均衡,咱们使用 DNS 轮询的方法来把用户的请求发到两台机器上,但这种该架构有个问题,一旦一台 WEB 机器宕机,将会有一半的用户访问不到业务。还有一个问题,咱们也须要考虑到,如何保证 WEB 服务器上的数据一致,好比用户可能会上传图片到 WEB 服务器上,假如他上传到了 WEB1 上,那 WEB2 是不存在这个图片的。因此咱们须要作一个共享存储让 WEB1 和 WEB2 同时能够访问,因此在这里我把 WEB1 的一个目录使用 NFS 共享出来,让 WEB2 去挂载。还有一个问题就是memcached服务如何分配,在这里,我是把 memcaced 服务分别安装到两台 WEB 上的,本身用本身的 memcached 服务。redis

五、MySQL读写分离

访问量持续上升,uv 已经到了数十万。网站在高峰期老是会卡顿那么一段时间。经排查,发如今 MySQL 服务器上有不少慢查询,通过各类调优依然没有太明显效果,最后决定作读写分离。sql

作读写分离有两种方案,第一能够借助程序来实现,把全部的写操做指向到主 MySQL ,全部的读操做指向到从 MySQL。对于这种方案,机器数量和环境不用作任何调整,惟一要作的是程序代码要改一下。第二能够借助 mysql-proxy 来实现,不用修改代码,节省开发成本,但须要增长一个角色。架构是这样的。数据库

六、避免单点引入负载均衡

两台 WEB 服务器由于有一台比较老,因此在高峰期时,终究是没有能扛住而挂掉。结果影响了一半的用户访问不到网站了。通过这次事故,我不得不修改架构,尽可能避免单点,因而在 WEB 前端设置了负载均衡器,而且作了高可用。编程

在这里我拿 nginx 作了负载均衡器,并无使用 lvs,由于我以为 nginx 更容易操做,更好控制。为了节省成本,我并无单独把 mysql-proxy 摘出来做为独立服务器,由于那样的话,也得为它考虑单点问题。在这个架构中,其实还有一个缺陷,就是 NFS 服务端也是有风险的,更加保险的作法是单独搞一台服务器作NFS服务。缓存

七、继续扩充

uv上升到100w,两台 WEB 服务器明显不够用了,而瓶颈并不在 MySQL 上。因此,只增长 WEB,同时把 NFS 服务器单独摘出来,并作一个备用 NFS 服务器。

八、引入NoSQL

uv近1000w,三台 WEB 服务器也早已不够,增长到5台,而 MySQL 服务器压力逐渐变大,针对 MySQL 的慢查询,发现压力主要体如今个别 SQL 语句上,该优化的已经优化到极致,对于这几个查询,实际上是可使用 NoSQL 的。因而,我找懂php开发的朋友帮我修改了程序,把一些访问量大的数据存储到redis,从而减小了对 MySQL 服务器的压力。 而 Redis 为了防止单点也作了主从。

九、MySQL架构演变

http://www.cnblogs.com/liwei0526vip/p/6424605.html

相关文章
相关标签/搜索