Web站点架构的深入浅出,由表及里(一)

1.1 http反向代理服务器

在web站点前端,我们需要搭建一个反向代理服务器,用于负责接受用户的请求,请求包括动态和静态的内容请求。一般反向代理服务器的部署方案有HAProxy和Nginx,这里将使用HAProxy来描述。

注解:HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。

HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

Web站点架构的深入浅出,由表及里(一)

http反向代理服务器

1.2 http代理服务器高可用

为了提高系统安全及高可用性,我们需要在前端的http反向代理服务器配置高可用,解决方案有HAProxy+Keepalived。

注解:Keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived是自动完成,不需人工干涉。

Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

Web站点架构的深入浅出,由表及里(一)

http代理服务器高可用

1.3 http代理服务器负载均衡

虽然我们有两个节点的HAProxy,但是一般只有有一台HAProxy可为用户提供服务,而另外一台将会空闲,这样会造成资源浪费,为了提高资源最大化,我们需要为HAProxy做负载均衡。操作方法就是在DNS上配置两条A记录,这样就能实现将用户请求通过DNS分发给两个不同的节点,而每个节点都通过相同的方式向后端服务器发起调度。

Web站点架构的深入浅出,由表及里(一)

http代理服务器负载均衡

1.4 动态内容服务器

如果我们打算部署一个动态内容,而且主站也是使用应用程序来实现,那我们需要部署一套动态内容网站(例如LAMP),那么对其我们也需要对其考虑高可用性以及负载均衡以及高可用的问题。那么当用户访问主页,例如index.jsp,index.php等动态网页时,此时就应该由动态服务器基于响应。

Web站点架构的深入浅出,由表及里(一)

动态内容服务器

小知识:用户在访问站点时,只是请求一个资源(主页资源),而这个主页资源包含了很多资源,有大多数都是静态内容,这些内容都是位于当前站点上或者是其他站点上一些静态资源,比如图片,CSS等。而这些信息需要被单独的资源再次请求。所以打开一个站点,访问主页的那一刻,只是第一次请求的入口,后续他会在同一个站点或者是同一个站点的链接所指向的位置发起多次请求。

1.5 数据库节点服务器

对于动态内容来讲,如果其访问的是一个主页,而这个主页又包含一些动态内容,比如包含某些查询,那么此时就需要查询数据库,所以我们还需要部署数据库节点(常见的数据库系统有MySQL、Mariadb、Oracle等)

Web站点架构的深入浅出,由表及里(一)

数据库节点服务器

备注说明:

对于一个站点来讲将,存储有分为以下几类

1、关系型数据,需要存储在类似MySQL这种关系型数据库中.

2、文件数据,存储在文件系统中

3、键值数据,一般存储在缓存服务器中,或者类似NoSQL非关系型数据库中

1.6 MySQL主从架构

如果我们查询的请求比较多,一台MySQL服务器将无法支撑这么庞大的查询请求,那么此时为提高查询能力,我们需要部署主从架构,实现一主多从模型

Web站点架构的深入浅出,由表及里(一)

MySQL主从架构

1.7 缓存服务器

我们了解到MySQL本身具有缓存功能,但由于前端应用服务器不止一台,而MySQL也已部署成为一主多从架构,因为存在多个MySQL从节点,从而导致前端应用程序无法命中MySQL缓存的问题,那么此时就需要增加缓存服务器(例如:Memcache服务器)

如果我们只有一台MySQL读节点,那么只需使用MySQL本地的缓存即可,而无需额外增加缓存服务器。

Web站点架构的深入浅出,由表及里(一)

缓存服务器

使用MySQL主从架构添加缓存时,使用的是缓存模式中的“旁路”缓存模式(下面有介绍缓存的工作模式),而在此处缓存的内容主要是缓存MySQL的查询对象,也就是MySQL对象查询的缓存结果。

1.8 关于缓存工作模式介绍

缓存工作模式有两种

1、基于代理模式的工作

2、基于旁路的工作模式

1.8.1 代理(例如HAProxy,Nginx)

注解:Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

Web站点架构的深入浅出,由表及里(一)

用户向缓存服务器请求资源,如果缓存服务器发现本地并没有对应缓存记录,会由自己向后端服务器请求资源,将请求到的结果先缓存在本地,缓存完成之后再响应给用户。

1.8.2 旁路(例如Memcache)

注解:memcache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著。这是一套开放源代码软件,以BSD license授权发布。

Web站点架构的深入浅出,由表及里(一)

用户首先向缓存服务器请求,如果缓存服务器未有缓存记录会立即响应用户。这时客户端会自行去找后端服务器,那么后端服务器无论有无资源都会响应给客户端。假设此时有对应缓存记录,那么后端服务器会将结果返回给客户端。客户端会根据需要来判定是否这个数据缓存到缓存服务器中。所以数据缓不缓存并不取决于缓存服务器,而取决于请求方(也就是客户端)。

1.9 MySQL主从架构读写分离

由于MySQL已经部署成为主从架构,那么又衍生另一个问题,如果用户请求发送到MySQL服务器,应如何区分读和写的请求,应使用哪个节点去响应客户端请求呢?此时我们需要解决读写分离的问题。这里给出两种方法供大家参考:

1、前端应用程序配置

在前端应用程序做设定来做读写分离,设定写操作发送到主节点,读操作发至各从节点上。但是这样会存在一个问题,如今互联网发展速度之快,我们很有可能为了满足业务扩展需求,会改变架构规划调整,此时就需要在前端应用程序端进行代码修改,而且这样要求前端应用程序开发工程师的技术水平,对于系统的扩展性不高,所以一般也不建议使用这样地方。

2、搭建读写分离服务器(例如:Amoeba服务器)

搭建读写分离服务器,告诉前端应用程序,无论是读请求还是写请求都发至读写分离服务器,由此服务器负责代理区分读写操并做好读写分离,转发至各对应的主从节点上。

Web站点架构的深入浅出,由表及里(一)


分享到:


相關文章: