1.单机容量有限,对服务器进行水平扩展

初始状态的系统:
图片说明
前端页面,秒杀系统和数据库服务都在一台服务器上,而单台服务器始终是有性能瓶颈的,这个时候就需要我们对服务器进行水平扩展,简单点说就是增加服务器的数量来增强系统性能,下面是重新设计后的系统流程图
图片说明
前端的请求经过nginx转发,将会打到两台服务器上,而mysql服务单独部署一台服务器,提高数据库的读取效率

  • mysql数据库开放远端连接
  • 服务端水平对称部署
  • 验证访问

2.nginx

2.0 配置文件解析

Nginx 核心配置文件conf/nginx.conf包含三块内容:全局块、events块、http块。

2.0.1 全局块

此处的配置影响nginx服务器整体的运⾏,⽐如worker进程的数量、错误⽇志的位置等
图片说明

2.0.2 event块

影响nginx服务器与⽤户的⽹络连接,⽐如worker_connections 1024,标识每个workderprocess⽀持的最⼤连接数为1024
图片说明

2.0.3 http块

http块是配置最频繁的部分,虚拟主机的配置,监听端⼝的配置,请求转发、反向代理、负载均衡等 ⚠️http下可配置多个server
图片说明
server的配置
图片说明

2.1 反向代理

图片说明

  • ①中的upstream意为:定义一组服务器。 这些服务器可以监听不同的端口。
  • ②在location中定义proxy_pass为http://backendserver;

这样当请求打到nginx服务器上的时候,就会被转发到backendserver中的服务器上(按照相应的负载均衡策略)
有关于upstream详解:upstream模块
有关于location中详细配置的博客:location详解

2.2 负载均衡

单个服务器解决不了,增加服务器的数量,然后将请求分发到各个服务器上,将负载分发到不同的服务器,就是所谓的负载均衡

2.2.1 负载均衡的五种算法

1.轮询(默认)
依次将请求分配到各个后台服务器中
适用于后台机器性能一致的情况。
挂掉的机器可以自动从服务列表中剔除。

2.weight(权重)
根据权重来分发请求到不同的机器中,指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

upstream bakend {  
server 192.168.0.1 weight=10;  
server 192.168.0.2 weight=10;  
}

3.ip_hash
根据请求者ip的hash值将请求发送到后台服务器中,可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。

upstream bakend {  
ip_hash;  
server 192.168.0.14:88;  
server 192.168.0.15:80;  
}

4.url_hash(第三方)
根据请求的url的hash值将请求分到不同的机器中,当后台服务器为缓存的时候效率高。
例如:
在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

upstream backend {  
server squid1:3128;  
server squid2:3128;  
hash $request_uri;  
hash_method crc32;  
}

每个设备的状态设置为:

1.down 表示单前的server暂时不参与负载
2.weight 默认为1.weight越大,负载的权重就越大。
3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
4.fail_timeout:max_fails次失败后,暂停的时间。
5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug
client_body_temp_path 设置记录文件的目录 可以设置最多3层目录
location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡

5.fair(第三方)
根据后台响应时间来分发请求,响应时间短的分发的请求多。

upstream backend {  
server server1;  
server server2;  
fair;  
}

此处参考:nginx的五种负载算法

2.3 动静分离

为了加快网站的解析速度,把动态页面和静态页面由不通的服务器来解析,加快解析速度,降低单个服务器的压力

2.4 nginx高性能的原因

2.4.1 master-worker进程模型

图片说明

  • Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程
  • master 进程接收来自外界的信号,向各worker进程发送信号,每个进程都有可能来处理这个连接
  • master 进程能监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动启动新的 worker 进程

master进程
master进程充当整个进程组与用户的交互接口,同时对进程进行监护。它不需要处理网络事件,不负责业务的执行,只会通过管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。

worder进程
每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接。

2.4.2 多路IO复用(epoll)

Web服务器在面对高并发的情况下,网络的IO一般选择IO复用,像apache选择的Select/poll。Nginx在linux 2.6后选择Epoll做网路IO,提高了WEB服务的并发能力。

2.4.3 协程机制