• 网站业务架构演变过程


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


    2. 一台变两台



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


    3. 增加memcached




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


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




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


    5. mysql读写分离
    访问量持续上升,uv已经到了数十万。网站在高峰期总是会卡顿那么一段时间。经排查,发现在MySQL服务器上有很多慢查询,经过各种调优依然没有太明显效果,最后决定做读写分离。

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





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





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

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





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





    9. mysql架构演变 

  • 相关阅读:
    论球迷和程序员
    山哥,你是怎么提高设计能力的?
    一个想休息的线程:JVM到底是怎么处理锁的?怎么不让我阻塞呢?
    由“面经”引发的思考
    99%的创业公司都不值得加入
    大牛是怎么炼成的?
    RMQ问题 与众不同 尚未攻克
    YbtOj例题:二叉堆3 龙珠游戏
    离散化模板
    YbtOJ练习:广搜 3 追捕小狗
  • 原文地址:https://www.cnblogs.com/linuxde/p/8729078.html
Copyright © 2020-2023  润新知