网站业务架构演变过程

回复 收藏
有一天,我突发奇想创建了一个站点,基于LNMP架构,起初只有我自己访问,后来因为我点儿正,访问量越来越大,所以最终导致下面的架构演变。
1. 单台机器因为只是一个小站,访问量一天也没有多少uv(100以内),所以用一台1核1g的机器足够了。机器上安装的是CentOS系统,然后搭建了nginx+php-fpm+mysql的环境。


2. 一台变两台
jg2.jpg

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


3. 增加memcached
jg3.jpg


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


4. 增加WEB,并做MySQL主从
访问量又扩大了,uv到了5w,数据库服务器因为一开始配置就挺高,所以没有压力,但是WEB服务器负载有点高了,在高峰期可以感觉到网站访问变慢。所以,这时候不得不考虑要加一台WEB服务器。另外,数据库是单点,如果磁盘损坏,可能会带来意想不到的后果,所以我们有必要加一台从DB服务器,作为数据的备份。
jg4.jpg


在这里,两台WEB服务器我们并没有做负载均衡,因为为了节省资源,暂时先不去购买服务器做负载均衡,我们使用DNS轮询的方法来把用户的请求发到两台机器上,但这种该架构有个问题,一旦一台WEB机器宕机,将会有一半的用户访问不到业务。还有一个问题,我们也需要考虑到,如何保证WEB服务器上的数据一致,比如用户可能会上传图片到WEB服务器上,假如他上传到了WEB1上,那WEB2是不存在这个图片的。所以我们需要做一个共享存储让WEB1和WEB2同时可以访问,所以在这里我把WEB1的一个目录使用NFS共享出来,让WEB2去挂载。还有一个问题就是memcached服务如何分配,在这里,我是把memcaced服务分别安装到两台WEB上的,自己用自己的memcached服务。
5. mysql读写分离
访问量持续上升,uv已经到了数十万。网站在高峰期总是会卡顿那么一段时间。经排查,发现在MySQL服务器上有很多慢查询,经过各种调优依然没有太明显效果,最后决定做读写分离。

做读写分离有两种方案,第一可以借助程序来实现,把所有的写操作指向到主mysql,所有的读操作指向到从mysql。对于这种方案,机器数量和环境不用做任何调整,唯一要做的是程序代码要改一下。第二可以借助mysql-proxy来实现,不用修改代码,节省开发成本,但需要增加一个角色。架构是这样的。
jg5.jpg



6. 避免单点引入负载均衡
两台WEB服务器因为有一台比较老,所以在高峰期时,终究是没有能扛住而挂掉。结果影响了一半的用户访问不到网站了。经过此次事故,我不得不修改架构,尽量避免单点,于是在WEB前端设置了负载均衡器,并且做了高可用。
jg6.jpg



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

7. 继续扩充
uv上升到100w,两台WEB服务器明显不够用了,而瓶颈并不在mysql上。所以,只增加WEB,同时把NFS服务器单独摘出来,并做一个备用NFS服务器。

jg7.jpg



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

jg8.jpg



9. mysql架构演变  
http://www.apelearn.com/bbs/thread-8025-1-1.html

2015-09-01 17:24 举报
已邀请:
0

iwannachange

赞同来自:

补充知识了
0

定海偶然

赞同来自:

nice
0

模范棒棒糖

赞同来自:

升级了 有图片直观显示。
0

___浮生微凉

赞同来自:

{:4_98:}
0

gjc159357

赞同来自:

升级了
0

magic2018

赞同来自:

大赞!
0

s_jxiaobo

赞同来自:

good
0

kids14128

赞同来自:

犀利~
0

aa181637000

赞同来自:

学习了,这就是我心目中的架构升级图,一步一步。
0

zch

赞同来自:

      我们公司现在用的是    4     两台web 两台db,也是主从,不过是为了 预防主 宕掉 做的备用机,db上做了备份软件  web是tomcat   db是oracle
0

zch

赞同来自:

4   是不是在现在的 中小企业里比较常见??
0

whlt20090509

赞同来自:

涨姿势了
0

大喵喵66

赞同来自:

涨姿势了 原来服务器集群 是这个么搞出来的 从简单的复杂 从低级到高级 哈哈进化论啊
0

渐行渐远

赞同来自:

太好了
0

scshfei

赞同来自:

很直观,对系统认知很有帮助
0

lyhabc

赞同来自:

非常直观,LVS太高大上,还是这种架构简单
0

howiewang

赞同来自:

大爱铭哥,最近几天正在苦于不知道这几个的关系呢!
0

爱疯熊猫

赞同来自:

很清晰很直观的就表达出来,学习了。转了!
0

wudi61

赞同来自:

对所学知识有了一个宏观的概念 赞
0

Shawn

赞同来自:

这真算是实战知识了
0

小许

赞同来自:

学习了,有空试验一下。
0

君君

赞同来自:

好强大
0

hzsnone

赞同来自:

长姿势了
0

阳光

赞同来自:

有一段时间没来了,多了好多东西,又学习了
0

学习求生存 - openstack运维工程师

赞同来自:

学习了
0

五弊三缺

赞同来自:

引入NoSQL后优化力度更大了
0

xufanyunwei

赞同来自:

0

迷城

赞同来自:

非常详细。 good
0

m.chang

赞同来自:

我们任重而道远。
0

weifeng1463

赞同来自:

看下
0

435664265

赞同来自:

帅气
0

snake

赞同来自:

学习
0

gl0321

赞同来自:

这个知识非常有用,懂了这个过程,可以更好的和别人交流了。
0

北辰星

赞同来自:

好东西,我也搭个这样的业务架构
0

521

赞同来自:

0

casparcc

赞同来自:

pv uv
0

wangzai

赞同来自:

xuexi
0

tkk

赞同来自:

学习了,配图很直观~
0

zmh0415

赞同来自:

好!学完课程回头看这个网络服务演变过程,收货甚多!
0

opensky

赞同来自:

铭哥, 这架构图是用哪个软件画的呢。
0

lijiya

赞同来自:


补充知识了
0

pwq18627318744

赞同来自:

学习了,mysql架构演变,随uv量的量级递增,架构上的变化!经验好贴,收藏!
0

那片天空

赞同来自:

学习了
0

huang

赞同来自:

请问,假如网站架构演变扩充服务器时,旧服务器是32位的,新增的是64位的,最优的搭建方案是什么呢?
1、lanmp等服务独立搭在了不同的服务器时,是否需要统一为32位?
2、那些服务对性能要求比较高,挪到新服务器上合适,那些可以装在性能比较弱的服务器上?
3、实际工作中有这种情况吗?机子32位还是64位这算个问题吗?
0

gulay1688

赞同来自:

好文章,收藏。
0

fisher

赞同来自:

学习
0

i.kin.kin

赞同来自:

精华,关于网站架构基于业务持续增加的演变路程。 Mark下,全部学通勒,再回味下。
0

阿辉

赞同来自:

好贴

0

u46306306

赞同来自:

涨知识了 这个可以跟面试官吹了

0

windysai

赞同来自:

谢谢阿铭老师,看完很大收获呢~

0

xingzhihai

赞同来自:

加油!

0

原人

赞同来自:

收藏了,收藏了

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: