网站架构的伸缩性设计

网站的伸缩性设计可分为两类,一类是根据功能进行物理分离实现伸缩,一类是单一功能通过集群实现伸缩。前者是不同的服务器部署不同的服务,提供不同的功能;后者是集群内的多台服务器部署相同的服务,提供相同的功能。

不同功能进行物理分离实现伸缩

纵向分离:将业务处理流程上的不同部分分离部署,实现系统伸缩性。
横向分离:将不同的业务模块分离部署,实现系统伸缩性。

单一功能通过集群规模实现伸缩

应用服务器集群的伸缩性设计

HTTP重定向负载均衡

HTTP重定向服务器是一台普通的应用服务器,其唯一的功能就是根据用户的HTTP请求计算一台真实的Web服务器地址,并将该Web服务器地址写入HTTP重定向响应中(响应状态码为302)返回给用户浏览器。缺点是浏览器需要两次请求服务器才能完成一次访问,性能较差;重定向服务器自身的处理能力有可能成为瓶颈,整个集群的伸缩性规模有限;使用HTTP 302响应码重定向,有可能使搜索引擎判定为SEO作弊,降低搜索排名。

DNS域名解析负载均衡

每次域名解析请求都会根据负载均衡算法计算一个不同的IP地址返回。DNS域名解析负载均衡的优点是将负载均衡的工作转交给DNS,省掉了网站管理维护负载均衡服务器的麻烦,同时许多DNS还支持基于地理位置的域名解析,即会将域名解析成距离用户地理最近的一个服务器地址,这样可以加快用户访问速度,改善性能。但是DNS域名解析负载均衡也有缺点,就是目前的DNS是多级解析,每一级DNS都可能缓存A记录,当下线某台服务器后,即使修改了DNS的A记录,要使其生效也需要较长时间。这段时间,DNS依然会将域名解析到已经下线的服务器,导致用户访问失败;而且DNS负载均衡的控制权在域名服务商那里,网站无法对其做更多改善和更强大的管理。

事实上,大型网站总是部分使用DNS域名解析,利用域名解析作为第一级负载均衡手段,即域名解析得到的一组服务器并不是实际提供Web服务的物理服务器,而是同样提供负载均衡服务的内部服务器,这组内部负载均衡服务器再进行负载均衡,将请求分发到真实的Web服务器上。

反向代理负载均衡

由于反向代理服务器转发请求在HTTP协议层,因此也叫应用层负载均衡。其优点是和反向代理服务器功能集成在一起,部署简单。缺点是反向服务器是所有请求和响应的中转站,其性能可能会成为瓶颈。

IP负载均衡

在网络层通过修改请求目标地址进行负载均衡。这里的关键在于真实物理Web服务器响应数据包如何返回给负载均衡服务器。一种方案是负载均衡服务器在修改目的IP地址的同时修改源地址,将数据包源地址设为自身IP,即源地址转换SNAT,这样Web服务器的响应会再回到负载均衡服务器;另一种方案是将负载均衡服务器同时作为真实物理服务器集群的网关服务器,这样所有响应数据都会到达负载均衡服务器。IP负载均衡在内核进程完成数据分发,较反向代理负载均衡(在应用程序中分发数据)有更好的处理性能。但是由于所有请求响应都需要负载均衡服务器,集群的最大响应数据吞吐量不得不受制于负载均衡服务器网卡带宽。对于提供下载服务或视频服务等需要传输大量数据的网站而言,难以满足需求。能不能让负载均衡服务器只分发请求,而使响应数据从真实物理服务器直接返回给用户呢?

数据链接层负载均衡

数据链路层负载均衡是指在通信协议的数据链路层修改mac地址进行负载均衡。这种数据传输方式又称作三角传输模式,负载均衡数据分发过程中不修改IP地址,只修改目的mac地址,通过配置真实物理服务器集群所有机器虚拟IP和负载均衡服务器IP地址一致,从而达到不修改数据包的源地址和目的地址就可以数据分发的目的,由于实际处理请求的真实物理服务器IP和数据请求目的IP一致,不需要通过负载均衡服务器进行地址转换,可将响应数据发送到网关服务器,网关服务器将数据包转发给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈。这种负载均衡方式又称作直接路由方式(DR)。

负载均衡算法

轮询(Round Robin,RR):所有请求被依次分发到每台应用服务器上,即每台服务器需要处理的请求数目都相同,适合于所有服务器硬件都相同的场景。
加权轮询(Weighted Round Robin, WRR):根据应用服务器硬件性能的情况,在轮询的基础上,按照配置的权重将请求分发到每个服务器,高性能的服务器能分配更多请求。
随机(Random):请求被随机分配到各个应用服务器,在许多场合下,这种方案都很简单实用,因为好的随机数本身就很均衡。即使应用服务器硬件配置不同,也可以使用加权随机算法。
最少连接(Least Connection):记录每个应用服务器正在处理的连接数(请求数),将新到的请求分发到最少连接的服务器上,应该说,这是最符合负载均衡定义的算法。最少连接算法也可以实现加权最少连接。
源地址散列(Source Hashing):根据请求来源的IP地址进行Hash计算,得到应用服务器,这样来自同一个IP地址的请求总在同一个服务器上处理,该请求的上下文信息可以存储在这台服务器上,在一个会话周期内重复使用,从而实现会话粘滞。

分布式缓存集群的伸缩性设计

分布式缓存的一致性Hash算法:一致性Hash算法通过一个叫做一致性Hash环的数据结构实现KEY到缓存服务器的Hash映射。具体算法过程:先构造一个长度为 2 32 2^{32} 232的整数环(这个环被称作一致性Hash环),根据节点名称的Hash值(其分布范围为[0, 2 32 − 1 2^{32}-1 232−1])将缓存服务器节点放置在这个Hash环上。然后根据需要缓存的数据的KEY值计算得到其Hash值(其分布范围也同样为[0, 2 32 − 1 2^{32}-1 232−1]),然后在Hash环上顺时针查找距离这个KEY的Hash值最近的缓存服务器节点,完成KEY到服务器的Hash映射查找。

具体应用中,这个长度为 2 3 2 2^32 232的一致性Hash环通常使用二叉查找树实现,Hash查找过程实际上是在二叉查找树中查找不小于查找数的最小数值。当然这个二叉树的最右边叶子节点和最左边的叶子节点相连接构成环。

新加入的节点NODE3只影响了原来的节点NODE1,也就是说一部分原来需要访问NODE1的缓存数据现在需要访问NODE3(概率上是50%)。但是原来的节点NODE0和NODE2不受影响,这就意味着NODE0和NODE2缓存数据量和负载压力是NODE1与NODE3的两倍。如果4台机器的性能是一样的,那么这种结果显然不是我们需要的。
将每台物理缓存服务器虚拟为一组虚拟缓存服务器,将虚拟服务器的Hash值放置在Hash环上,KEY在环上先找到虚拟服务器节点,再得到物理服务器的信息。这样新加入物理服务器节点时,是将一组虚拟节点加入环中,如果虚拟节点的数目足够多,这组虚拟节点将会影响同样多数目的已经在环上存在的虚拟节点,这些已经存在的虚拟节点又对应不同的物理节点。最终的结果是:新加入一台缓存服务器,将会较为均匀地影响原来集群中已经存在的所有服务器,也就是说分摊原有缓存服务器集群中所有服务器的一小部分负载。

数据存储服务器集群的伸缩性设计

大型网站技术架构:核心原理与案例分析——伸缩性相关推荐

  1. 读书笔记:大型网站技术架构-核心原理与案例分析

    李智慧<大型网站技术架构-核心原理与案例分析> 性能 可用性 伸缩性 扩展性 安全性 总结 这本书组织的很不错,语言精练,篇幅也不长,对网站架构的要点讲的狠清楚透彻,思路清晰.主要围绕架构 ...

  2. 读书笔记之 大型网站技术架构(核心原理与案例分析)

    前言 坚持看了十几天的书,终于完成了毕业后第一次静下心来,利用业务时间看书并做笔记的成就了.废话不多说,这回看的是一直很膜拜的李智慧大神写的大型网站技术架构-核心原理与案例分析. 简短的读后感 极其推 ...

  3. 大型网站技术架构:核心原理与案例分析 mobi_阿里面试官:你会高并发技术吗?...

    前言 据有关数据统计,无论是游戏行业还是互联网行业,无论是软件开发公司还是大型网站,都对高并发技术人才有着巨大的需求.因此,无论为了是面试还是为了工作,学习高并发技术刻不容缓. 当然,高并发相关岗位的 ...

  4. 大型网站架构模式【大型网站技术架构.核心原理与案例分析】(阅读分享)

    这本书分几个章节,其中有一个值得和大家分享的技术知识. 大型网站架构模式中引入了模式概念:每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心.这样,你就能一次又一次地使用该方案而不 ...

  5. 读《大型网站技术架构 核心原理与案例分析+李智慧-高清》有感

    其实作为一个刚入职场的小白(今年才毕业),对于java的领域一开始我是特别喜欢.从一开始的学习ssm框架培训,到现在真正的去公司参加项目.目前为止我进公司快一个月了,先从写测试类开始,用的是testn ...

  6. 把书读薄:大型网站技术架构-核心原理与案例分析(第四篇 架构师)

    14 架构师领导艺术 职能:架构设计,软件开发,管理职能(规划产品,估算人力资源,估算时间资源,安排人员职责分工,确定计划里程碑,指导工程师工作,过程风险评估与控制). 是工程师的榜样,要做好表率. ...

  7. 大型网站技术架构:核心原理与案例分析 mobi_大数据技术经典学习路线

    如果你看完有信心能坚持学习的话,那就当下开始行动吧! 点击链接加入群聊[大数据学习交流群]:想要在大数据这个领域汲取养分,让自己壮大成长.分享方向,行动以前先分享下一个大数据交流分享资源,欢迎想学习, ...

  8. 【撸码师读书笔记】 大型网站技术架构——核心原理与案例分析

    2019独角兽企业重金招聘Python工程师标准>>> 合理的预估系统的瓶颈及制定有效伸缩性架构预案: 架构设计应从性能,可用性,伸缩性,扩展性及安全这五个要素方面出发: 与传统企业 ...

  9. 大型网站技术架构·核心原理与案例分析 第八章·固若金汤:网站的安全架构思维导图

    固若金汤:网站的安全架构思维导图

  10. 大型网站技术架构核心原理与案例分析学习笔记(理论篇)

    大型网站软件系统的特点 高并发.大流量 高可用 海量数据 用户分布广泛,网络情况复杂 安全环境恶劣 需求快速变更,发布频繁 渐进式发展 大型网站架构演化发展历程 所有资源在一台服务器上,使用免费开源的 ...

最新文章

  1. JDK环境下利用记事本对java文件进行运行编译
  2. 在python中构造时间戳参数的方法
  3. Linux上压缩目录以及目录下的所有文件
  4. 编写第一个HADOOP应用程序
  5. Redis数据库(三)——(主从复制、哨兵模式、集群)
  6. min里所有的参数都不存在_高中生物所有的考点难点,其实都在你不仔细看的课本里,必修1-3超强记忆手册!...
  7. 阿里上线了一款新的电商app
  8. AI取代人类?这4种工作仍将是从业者的“铁饭碗” | 未来
  9. 洛谷 题解 P1135 【奇怪的电梯】
  10. 阿里天池_优秀策略答辩PPT和相关博客
  11. vue组件制作专题 - (mpvue专用)在mpvue中纯自己写css实现简单左右轮播
  12. Hive启动的三种方式
  13. 气象要素空间插值分析
  14. wpf textblock可以复制_C# WPF:这次把文件拖出去!
  15. python数据库查询系统_基于Python和MySQL实现的学生信息管理系统
  16. 文件存储-CephFS
  17. 华为机试:九宫格按键输入法
  18. android ndk 怎样调用第三方的so库文件。
  19. 一种基于波状扩散特征分析的光斑检测方法
  20. PHP之父Rasmus Lerdorf演讲:激情下的PHP 百作坊

热门文章

  1. 师生相逢,潇潇洒洒出品
  2. java毕业设计读书笔记共享平台(附源码、数据库)
  3. three.js实现3d球体树状结构布局——添加入场、出场、点击放大等动画
  4. NineData x 华为云正式上线
  5. arduino无源蜂鸣器歌曲编码_基于Arduino使用低电平触发无源蜂鸣器模块
  6. 谈C#中的Delegate
  7. redis哨兵代码测试异常之:Can connect to sentinel, but myMaster seems to be not monitored...
  8. python 百度地图api热力图_用百度地图API做热力图
  9. Python基础——第八章:Python文件操作
  10. openGauss数据库的使用