loading
锁魂Fu2Ⅳ_×
赞赏支持
关注

常见的网站服务器架构有哪些?

锁魂Fu2Ⅳ_×

怜惜也许是爱情的开始。我怜惜你,于是我爱上你。而我更怜惜我自己,于是我离开你。

51, 51, 51; text-indent: 2em;">[只是大框架介绍实际使用中的不容易注意的细节太多了需要经验的积累才能运用娴熟]

以下的架构都是在假设已经优化过linux内核的情况下进行

初级篇(单机模式)

假设配置(Dual core 2.0GHz,4GB ram,SSD)

基础框架apachePHP + Mysql  /  IIS + MSSQL
(最基础框架处理一般访问请求)

进阶1替换Apache为Nginx并在数据库前加上cache层【数据库的速度是最大的瓶颈】
           NginxPHP + Memcache + Mysql
(此时已经具备处理小型访问量的能力)

进阶2随着访问量的上涨最先面临的问题就来了CGI无法匹配上Nginx的高IO性能这时候可以通过写扩展来替代脚本程序来提升性能C扩展是个好办法但是大家更喜欢用简单的脚本语言完成任务Taobao团队开源了一个Nginx_lua模块可以用lua写Nginx扩展这时候可处理的并发已经超越进阶1 一个档次了
         Nginxnginx_lua or C + Memcache + Mysql
 (此时处理个同时在线三四千人没有问题了)

进阶3随着用户的增多Mysql的写入速度成了又一大瓶颈读取有memcache做缓存但写入是直接面对Mysql性能受到了很大阻碍这时候要在Nginx和Mysql中间加入一层写缓存队列系统就出场了,就以RabbitMQ为例所有写入操作全部丢到这只兔子的胃里面然后屁股后面写个接应程序一条条的拉出来再写入mysql而RabbitMQ的写入效率是Mysql的N倍此时架构的处理能力又上一阶层
                                    |----write------>RabbitMQ--------
     Nginx(lua or c)-----                                           |--------->Mysql
                                    |----read------>Memcache--------

此时的并发吞吐能力已经可以处理万人左右在线

中级篇(分而治之)

此时我们在单机优化上已经算是达到极限接下来就要集群来显示作用了

数据库篇 数据库总是在整个环节中是吞吐能力最弱的最常见的方法就是sharding
           sharding可以按多种方法来分没有定式看情况可以按用户ID区段分按读写分等等可用参考软件mysql proxy(工作原理类似lvs)

缓存篇memcache一般采用的是构建memcache pool将缓存分散到多台memcache节点上如何将缓存数据均匀分散在各节点一般采用将各节点顺序编号然后hash取余对应到各个节点上去这样可以做到比较均匀的分散但是有一个致命点就是如果节点数增加或减少将会带来几乎80%的数据迁移解决方案我们在高级篇再提

WEB服务器篇 web服务器集群的建设最常见的就是lvs方式memcache pool同样可以如此组建lvs的核心就是调度节点调度节点负责将流量通过算法分散到各个节点上因调度所耗资源很少所以可以产生很高的吞吐率后台节点数量可以任意增删但此法弊病就是如果调度节点挂了则整个集群都挂了解决方案我们在高级篇提
方法2:参见 HAProxy - The Reliable, High Performance TCP/HTTP Load Balancer

高级篇(高可用性+高可扩展性的集群)

单点调度故障解决
   集群的好处显而易见但是有一个弊端就是单节点进行调度如果节点出现故障则整个集群全部都无法服务对此的解决方案我们使用keepalived来解决Keepalived for Linux
    keepalived是基于VRRP协议(VRRP协议介绍)的请一定先了解VRRP协议后再进行配置
    keepalived可以把多台设备虚拟出一个IP并自动在故障节点与备用节点之间实现failover切换这样我们配置两台货多台lvs调度节点然后配置好keepalived就可以做到lvs调度节点出现故障后自动切换到备用调度节点(同样适用于mysql)

memcache集群扩展解决
memcache因为我们一般采用的都是hash后除以节点数取余然后分配到对应节点上如果节点数出现变化以前的缓存数据将基本都不能命中
  解决方法consistent hashing   简介一致性哈希

consistent hashing大概的思路就是把hash后的值保证在 0 ~ 2^32-1 的数值上然后把这一连串数字对应映射到一个想象的圆上

<img src="https://pic1.zhimg.com/50/c3cd8e6cf787c82d6f7e011e882ce27d_hd.jpg" data-rawwidth="95" data-rawheight="108" class="content_image" width="95"/>


    把要存储的各个值hash后放到圆上如图
<img src="https://pic1.zhimg.com/50/77a5474913b2017a9c64e877940ca625_hd.jpg" data-rawwidth="238" data-rawheight="257" class="content_image" width="238"/>


  然后把cache节点也用同样的hash方法映射到圆上然后每个刚才hash过的value顺时针寻找离自己最近的节点这个节点就是存储它的节点
<img src="https://pic2.zhimg.com/50/cf3a58c791488b89d6bda4f6c8c43d55_hd.jpg" data-rawwidth="287" data-rawheight="257" class="content_image" width="287"/>


为了提高存储的平衡性算法还可以加入虚拟节点的概念即每个实际cache节点会在圆上对应N个虚拟的节点这样可以提高算法的命中率更加平衡

consistent hashing原理Consistent hashing and random trees


2019-09-10
服务器
服务器
服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。
暂无相关品牌
¥26.35
总资产
4896
获点赞
252
关注者
「真诚赞赏,手留余香」
赞赏支持
还没有人赞赏,支持一下吧
发布讨论

网友评论

还没有用户评论

相关链接

写评论
0
0
0
打赏