热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

网站架构设计【转】

本章思维导图一、网站架构的伸缩性设计1.1不同功能进行物理分离实现伸缩(1)纵向分离:将业务处理流程上得不同部分分离部署,实

本章思维导图

「架构技术专题」90%程序员都收藏的超详细网站伸缩性架构的设计

一、网站架构的伸缩性设计

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

(1)纵向分离:将业务处理流程上得不同部分分离部署,实现系统的伸缩性;

「架构技术专题」90%程序员都收藏的超详细网站伸缩性架构的设计

(2)横向分离:将不同的业务模块分离部署,实现系统的伸缩性;

「架构技术专题」90%程序员都收藏的超详细网站伸缩性架构的设计

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

使用服务器集群,即将相同服务部署在多台服务器上构成一个集群整体对外提供服务。具体来说,集群伸缩性又分为应用服务器集群伸缩性和数据服务器集群伸缩性。这两种集群对于数据状态管理的不同,技术实现也有很大的区别。

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

2.1 应用服务器那点必须知道的事儿

(1)应用服务器应该被设计成无状态的,即应用服务器不存储请求上下文信息;构建集群后,每次用户的请求都可以发到集群中任意一台服务器上处理,任何一台服务器的处理结果都是相同的;

(2)HTTP本身是一个无状态的连接协议,为了支持客户端与服务器之间的交互,我们就需要通过不同的技术为交互存储状态,而这些不同的技术就是COOKIE和Session了。

(3)HTTP请求的分发是应用服务器集群实现伸缩性的核心问题,而负载均衡服务器就是HTTP请求的分发装置,它是网站必不可少的基础手段,也被称为网站的杀手锏之一。

2.2 负载均衡技术—网站必不可少的基础技术手段

负载均衡的实现方式多种多样,从硬件到软件,从商业产品到开源产品,应有尽有。但是,实现负载均衡的基础技术不外乎以下几种:

(1)HTTP重定向负载均衡  评价:★★

「架构技术专题」90%程序员都收藏的超详细网站伸缩性架构的设计

此方案的优点是简单易行,缺点是:

①浏览器需要两次请求才能完成一次访问,性能较差;

②重定向服务器自身的处理能力有可能成为瓶颈,整个集群的伸缩性规模有限;

③使用HTTP 302重定向有可能使搜索引擎判断为SEO作弊,降低搜索排名;

(2)DNS域名解析负载均衡  评价:★★★

「架构技术专题」90%程序员都收藏的超详细网站伸缩性架构的设计

此方案要求在DNS服务器中配置多个A记录,例如:

www.mysite.com IN A114.100.80.1
www.mysite.com IN A114.100.80.2
www.mysite.com IN A114.100.80.3

此方案的优点是将负载均衡的工作转交给了DNS,省掉了网站管理维护负载均衡服务器的麻烦。而缺点是:

①目前的DNS是多级解析,每一级DNS都可能缓存A记录,当某台服务器下线后,即使修改了DNS的A记录,要使其生效仍然需要较长时间。这段期间,会导致用户访问已经下线的服务器造成访问失败。

②DNS负载均衡的控制权在域名服务商那里,网站无法对其做更多改善和管理;

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

(3)反向代理负载均衡  评价:★★★★

「架构技术专题」90%程序员都收藏的超详细网站伸缩性架构的设计

Web服务器不需要使用外部IP地址,而反向代理服务器则需要配置双网卡和内外部两套IP地址。

此方案的优点是和反向代理服务器功能集成在一起,部署简单。缺点是反向代理服务器是所有请求和响应的中转站,其性能可能会成为瓶颈

(4)IP负载均衡  评价:★★★★

「架构技术专题」90%程序员都收藏的超详细网站伸缩性架构的设计

此方案优点在于在内核进程完成数据分发,较反向代理负载均衡(在应用程序中分发数据)有更好的处理性能。缺点是由于所有请求响应都需要经过负载均衡服务器,集群的最大响应数据吞吐量不得不受制于负载均衡服务器网卡带宽

(5)数据链路层负载均衡  评价:★★★★★

「架构技术专题」90%程序员都收藏的超详细网站伸缩性架构的设计

此种方式又称作三角传输模式,负载均衡数据分发过程中不修改IP地址,只修改mac地址,由于实际处理请求的真实物理IP地址和数据请求目的IP地址一致,所以不需要通过负载均衡服务器进行地址转换,可将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈。这种负载均衡方式又称作直接路由方式(DR)

使用三角传输模式的链路层负载均衡是目前大型网站使用最广泛的一种负载均衡手段。在Linux平台上最好的链路层负载均衡开源产品是LVS(Linux Virutal Server)。

2.3 负载均衡算法—负载均衡技术赖以生存的核心

前面的方法解决了负载均衡通过何种方式实现,而更为重要的则是如何从Web服务器列表中计算得到一台Web服务器的地址,而这正是负载均衡的核心—算法。这里简单介绍一下通常的集中负载均衡计算的算法,如果需要深入了解请自行百度。

(1)轮询

所有请求被以此分发到每台应用服务器上,即每台服务器需要处理的请求数目都相同,适合于所有服务器硬件都相同的场景。

(2)加权轮询

根据应用服务器的配置性能的情况,在轮询的基础上,按照配置的权重将请求分发到每个服务器,高性能的服务器能分配更多的请求。

(3)随机

此算法比较简单实用,请求被随机分配到各个应用服务器,因为好的随机数本身就很均衡。

(4)最少连接

记录每个应用服务器正在处理的连接数(请求数),将新到的请求分发到最少连接的服务器上,应该说,这是最符合负载均衡定义的算法。

(5)源地址散列

根据请求来源的IP地址进行Hash计算得到应用服务器,这样来自同一个IP地址的请求总在同一个服务器上处理,该请求的上下文信息可以存储在这台服务器上,在一个会话周期内重复使用,从而实现会话粘滞。

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

不同于应用服务器集群的伸缩性设计,分布式缓存集群的伸缩性不能使用简单的负载均衡手段来实现。因为:分布式缓存服务器集群中缓存的数据各不相同,缓存访问请求不可以在缓存服务器集群中的任意一台处理,必须先找到缓存有需要的数据的服务器,然后才能访问

分布式缓存集群伸缩性设计的目标:让新上线的缓存服务器对整个分布式缓存集群影响最小,也就是说新加入缓存服务器后应使整个缓存服务器集群中已经缓存的数据尽可能还被访问到。

  (1)以Memcached为代表的分布式缓存集群的访问模型

「架构技术专题」90%程序员都收藏的超详细网站伸缩性架构的设计

以上图片展示了一个典型的缓存写操作&#xff0c;应用程序需要写缓存数据<&#39;CHENGDU&#39;,DATA>&#xff0c;API将KEY&#xff08;&#39;CHENGDU&#39;&#xff09;输入路由算法模块&#xff0c;路由算法根据KEY和Memcached服务器集群列表计算得到一台服务器编号&#xff08;如Node1&#xff09;&#xff0c;进而得到该机器的IP地址和端口&#xff08;10.0.0.1:91000&#xff09;。然后&#xff0c;API调用通信模块和编号为Node1的Memcached服务器进行通信&#xff0c;将数据<&#39;CHENGDU&#39;,DATA>写入该服务器&#xff0c;至此便完成了一次分布式缓存的写操作。

而读操作和写操作一样&#xff0c;使用同样的路由算法和服务器列表&#xff0c;只要提供相同的KEY&#xff08;如上面提到的&#39;CHENGDU&#39;&#xff09;&#xff0c;Memcached客户端总是访问相通的服务器&#xff08;如上面计算得到的Node1&#xff09;去读取数据。

&#xff08;2&#xff09;以Memcached为代表的分布式缓存集群的伸缩性挑战

简单的路由算法&#xff08;通过使用余数Hash&#xff09;无法满足业务发展时服务器扩容的需要&#xff1a;缓存命中率下降。例如&#xff1a;当3台服务器扩容至4台时&#xff0c;采用普通的余数Hash算法会导致大约75%&#xff08;3/4&#xff09;被缓存了的数据无法正确命中&#xff0c;随着服务器集群规模的增大&#xff0c;这个比例会线性地上升。那么&#xff0c;可以想象&#xff0c;当100台服务器的急群众加入一台服务器&#xff0c;不能命中的概率大概是99%&#xff08;N/N&#43;1&#xff09;&#xff0c;这个结果显然是无法接受的。

那么&#xff0c;能否通过改进路由算法&#xff0c;使得新加入的服务器不影响大部分缓存数据的正确性呢&#xff1f;请看下面的一致性Hash算法。

&#xff08;3&#xff09;分布式缓存的一致性Hash算法

说明&#xff1a;一致性Hash算法是分布式缓存的核心理论&#xff0c;这里只是简单介绍一下&#xff0c;后续有空我会单独写一篇文章来详细介绍一致性Hash算法&#xff0c;以及用C#实现一致性Hash算法。

一致性Hash算法通过一个叫做一致性Hash还的数据结构实现KEY到缓存服务器的Hash映射&#xff0c;如下图所示&#xff1a;

「架构技术专题」90%程序员都收藏的超详细网站伸缩性架构的设计

具体算法过程是&#xff1a;

①先构造一个长度为0~2^32&#xff08;2的32次幂&#xff09;个的整数环&#xff08;又称&#xff1a;一致性Hash环&#xff09;&#xff0c;根据节点名称的Hash值将缓存服务器节点防置在这个Hash环中&#xff0c;如上图中的node1&#xff0c;node2等&#xff1b;

②根据需要缓存的数据的KEY值计算得到其Hash值&#xff0c;如上图中右半部分的“键”&#xff0c;计算其Hash值后离node2很近&#xff1b;

③在Hash环上顺时针查找距离这个KEY的Hash值最近的缓存服务器节点&#xff0c;完成KEY到服务器的Hash映射查找&#xff0c;如上图中离右边这个键的Hash值最近的顺时针方向的服务器节点是node2&#xff0c;因此这个KEY会到node2中读取数据&#xff1b;

当缓存服务器集群需要扩容的时候&#xff0c;只需要将新加入的节点名称&#xff08;如node5&#xff09;的Hash值放入一致性Hash环中&#xff0c;由于KEY总是顺时针查找距离其最近的节点&#xff0c;因此新加入的节点只影响整个环中的一部分。如下图中所示&#xff0c;添加node5后&#xff0c;只影响右边逆时针方向的三个Key/Value对数据&#xff0c;只占整个Hash环中的一小部分。

「架构技术专题」90%程序员都收藏的超详细网站伸缩性架构的设计

因此&#xff0c;我们可以与之前的普通余数Hash作对比&#xff1a;采用一直性Hash算法时&#xff0c;当3台服务器扩容到4台时&#xff0c;可以继续命中原有缓存数据的概率为75%&#xff0c;远高于普通余数Hash的25%&#xff0c;而且随着集群规模越大&#xff0c;继续命中原有缓存数据的概率也会随之增大。当100台服务器增加1台时&#xff0c;继续命中的概率是99%。虽然&#xff0c;仍有小部分数据缓存在服务器中无法被读取到&#xff0c;但是这个比例足够小&#xff0c;通过访问数据库也不会对数据库造成致命的负载压力

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

首先&#xff0c;数据存储服务器必须保证数据的可靠存储&#xff0c;任何情况下都必须保证数据的可用性和正确性。因此&#xff0c;缓存服务器集群的伸缩性架构方案不能直接适用于数据库等存储服务器。

&#xff08;1&#xff09;关系数据库集群的伸缩性设计

①市场上主要的关系数据库都支持数据复制功能&#xff0c;使用这个功能可以对数据库进行简单伸缩。下图显示了使用数据复制的MySQL集群伸缩性方案&#xff1a;多台MySQL的角色有主从之分&#xff0c;写操作都在主服务器上&#xff0c;由主服务器将数据同步到集群中其他从服务器。而读操作及数据分析等离线操作都会在从服务器上完成。

「架构技术专题」90%程序员都收藏的超详细网站伸缩性架构的设计

②前面提到的业务分割模式也可以用在数据库&#xff0c;不同业务数据表部署在不同的数据库集群上&#xff0c;这就是所谓的“数据分库”&#xff1b;但是其有一个制约条件&#xff1a;跨库的表无法进行Join操作&#xff1b;

「架构技术专题」90%程序员都收藏的超详细网站伸缩性架构的设计

③在实际运维中&#xff0c;对一些单表数据仍然很大的表&#xff0c;例如Facebook的用户数据库、淘宝的商品数据库等&#xff0c;还需要进行分片&#xff0c;将一张表拆分开分别存储在多个数据库中&#xff0c;这就是所谓的“数据分片”&#xff1b;

「架构技术专题」90%程序员都收藏的超详细网站伸缩性架构的设计

&#xff08;2&#xff09;NoSQL数据库的伸缩性设计

首先&#xff0c;NoSQL主要指非关系的、分布式的数据库设计模式。也有许多专家将NoSQL解读为Not Only SQL&#xff0c;表示NoSQL是关系数据库的补充&#xff0c;而不是替代方案。一般而言&#xff0c;NoSQL数据库产品都放弃了关系数据库的两大重要基础&#xff1a;①以关系代数为基础的结构化查询语言&#xff08;SQL&#xff09;②事务的一致性保证&#xff08;ACID&#xff09;&#xff1b;与之对应的是强化一些大型网站更关注的特性&#xff1a;高可用性和可伸缩性&#xff1b;

开源社区的NoSQL产品不尽其数&#xff0c;其支持的数据结构和伸缩性特性也各不相同。目前看来&#xff0c;应用最广泛的是Apache HBase。HBase的伸缩性主要依赖于其可分裂的HRegion可伸缩的分布式文件系统HDFS&#xff08;如果您不知道HDFS又对HDFS有兴趣&#xff0c;可以阅读我的另一篇博文《不怕故障的海量存储—HDFS基础入门》&#xff09;实现。

「架构技术专题」90%程序员都收藏的超详细网站伸缩性架构的设计

上图是HBase的整体架构图&#xff1a;

①HBase中数据以HRegion为单位进行管理&#xff0c;也就是说应用程序如果想要访问一个数据&#xff0c;必须先找到HRegion&#xff0c;然后将数据读写操作提交给HRegion&#xff0c;由HRegion完成存储层面的数据操作。

②每个HRegion中存储一段Key区间&#xff08;例如&#xff1a;[Key1,Key2)&#xff09;的数据&#xff0c;HRegionServer是物理服务器&#xff0c;每个HRegionServer上可以启动多个HRegion实例。当一个HRegion中写入的数据太多&#xff0c;达到配置的阀值时&#xff0c;HRegion会分裂成两个HRegion&#xff0c;并将HRegion在整个集群中进行迁移&#xff0c;以使HRegionServer的负载均衡。

③所有的HRegion的信息都&#xff08;例如&#xff1a;存储的Key值区间、所在HRegionServer的IP地址和端口号等&#xff09;记录在HMaster服务器上。同时为了保证高可用&#xff0c;HBase启动了多个HMaster&#xff0c;并通过ZooKeeper&#xff08;一个支持分布式一致性的数据管理服务&#xff09;选举出一个主服务器&#xff0c;通过这个主HMaster服务器获得Key值所在的HRegionServer&#xff0c;最后请求该HRegionServer上的HRegion实例&#xff0c;获得需要的数据。其具体的数据寻址访问流程如下图所示&#xff1a;

「架构技术专题」90%程序员都收藏的超详细网站伸缩性架构的设计

五、学习小结

在本章的学习中&#xff0c;我们了解到要实现网站的可伸缩性&#xff0c;关键技术就在于如何构建“良好”的服务器集群。要达到良好的目标&#xff0c;就要求每次扩容和减少服务器时&#xff0c;对整个网站的影响是最小的&#xff0c;甚至无影响的。伸缩性是复杂的&#xff0c;没有通用的、完美的解决方案和产品。一个具有良好伸缩性的网站&#xff0c;其设计总是走在业务发展的前面&#xff0c;在业务需要处理更多访问和处理之前&#xff0c;就已经做好了充分的准备&#xff0c;当业务需要时&#xff0c;只需要增加服务器并简单部署就可以了&#xff0c;技术团队便可轻松应对了。

注&#xff1a;文章转载至网络&#xff0c;因不知原出处&#xff0c;若是原著看到&#xff0c;可联系本人进行标记。

转自

https://www.toutiao.com/i6497091439015494157/



推荐阅读
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
author-avatar
Because_of_you龙
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有