nginx 简单负载均衡搭建

负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器FTP服务器企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

负载均衡的算法?

1. 随机算法

  • Random随机,按权重设置随机概率。在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

2. 轮询及加权轮询

  • 轮询(Round Robbin)当服务器群中各服务器的处理能力相同时,且每笔业务处理量差异不大时,最适合使用这种算法。 轮循,按公约后的权重设置轮循比率。存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
  • 加权轮询(Weighted Round Robbin)为轮询中的每台服务器附加一定权重的算法。比如服务器1权重1,服务器2权重2,服务器3权重3,则顺序为1-2-2-3-3-3-1-2-2-3-3-3- ......

3. 最小连接及加权最小连接

  • 最少连接(Least Connections)在多个服务器中,与处理连接数(会话数)最少的服务器进行通信的算法。即使在每台服务器处理能力各不相同,每笔业务处理量也不相同的情况下,也能够在一定程度上降低服务器的负载。
  • 加权最少连接(Weighted Least Connection)为最少连接算法中的每台服务器附加权重的算法,该算法事先为每台服务器分配处理连接的数量,并将客户端请求转至连接数最少的服务器上。

4. 哈希算法

  • 普通哈希
  • 一致性哈希一致性Hash,相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

5. IP地址散列

  • 通过管理发送方IP和目的地IP地址的散列,将来自同一发送方的分组(或发送至同一目的地的分组)统一转发到相同服务器的算法。当客户端有一系列业务需要处理而必须和一个服务器反复通信时,该算法能够以流(会话)为单位,保证来自相同客户端的通信能够一直在同一服务器中进行处理。

6.URL散列

  • 通过管理客户端请求URL信息的散列,将发送至相同URL的请求转发至同一服务器的算法。

1. 动静分离的实现思路

动静分离是将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。

一般来说:

静态页面访问路径短,访问速度快,几毫秒

动态页面访问路径长,访问速度相对较慢(数据库的访问,网络传输,业务逻辑计算),几十毫秒甚至几百毫秒,对架构扩展性的要求更高

使用nginx 配置,演示简单例子

使用三个不同的站点表示同一服务被部署到三台服务器上

在nginx中配置,当访问具体网站时,会将请求分发至配置的三个站点中,按照服务器的性能分发的比重是不同的

nginx的config配置,其中weight表示分发的比重

 upstream ahaoboy{ 
        server   111.230.241.93:8081 weight=1; 
        server   111.230.241.93:8082 weight=2; 
        server   111.230.241.93:8083 weight=3; 
    } 
    server {
        listen       80;
        server_name  127.0.0.1;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            # root   html;
            # index  index.html index.htm;
            proxy_pass http://ahaoboy;
            proxy_redirect default;
        }

使用Python验证,每次分发的服务器是随机的,但总的分发比例是符合配置中1:2:3的

import requests
from collections import defaultdict

url = 'http://127.0.0.1'

state = defaultdict(int)

cnt = 36
for i in range(cnt):
    text = requests.get(url).text
    print(text)
    state[text] += 1

print(state)

猜你喜欢

转载自my.oschina.net/ahaoboy/blog/1619349