page contents

负载均衡,你该如何配置?

所谓负载均衡,就是说如果一组计算机节点(或者一组进程)提供相同的(同质的)服务,那么对服务的请求就应该均匀的分摊到这些节点上。

attachments-2020-04-EYlAI7FC5e8540831dac9.jpg


什么是负载均衡


在计算机的世界,这就是大家耳熟能详的负载均衡(load balancing),所谓负载均衡,就是说如果一组计算机节点(或者一组进程)提供相同的(同质的)服务,那么对服务的请求就应该均匀的分摊到这些节点上。

 

这里的服务是广义的,可以是简单的计算,也可能是数据的读取或者存储。负载均衡也不是新事物,这种思想在多核CPU时代就有了,只不过在分布式系统中,负载均衡更是无处不在,这是分布式系统的天然特性决定的,分布式就是利用大量计算机节点完成单个计算机无法完成的计算、存储服务,既然有大量计算机节点,那么均衡的调度就非常重要。

 

负载均衡的意义在于,让所有节点以最小的代价、最好的状态对外提供服务,这样系统吞吐量最大,性能更高,对于用户而言请求的时间也更小。而且,负载均衡增强了系统的可靠性,最大化降低了单个节点过载、甚至crash的概率。


不难想象,如果一个系统绝大部分请求都落在同一个节点上,那么这些请求响应时间都很慢,而且万一节点降级或者崩溃,那么所有请求又会转移到下一个节点,造成雪崩。


attachments-2020-04-3Shdx4mc5e85409261435.jpg


 

如何实现负载均衡


回答可以如下:

在nginx里面配置一个upstream,然后把相关的服务器ip都配置进去。然后采用轮询的方案,然后在nginx里面的配置项里,proxy-pass指向这个upstream,这样就能实现负载均衡。

 

nginx的负载均衡有4种模式:


1)、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

 

2)、weight

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

 

3)、ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

 

4)、fair , url_hash(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

 

负载均衡配置方法


打开nginx.conf文件,在http节点下添加upstream节点:

upstream webname {  
  server 192.168.0.1:8080;  
  server 192.168.0.2:8080;  
}  

其中webname是自己取的名字,最后会通过这个名字在url里访问的,像上面这个例子一样什么都不加就是默认的轮询,第一个请求过来访问第一个server,第二个请求来访问第二个server。依次轮着来。

upstream webname {  
  server 192.168.0.1:8080 weight 2;  
  server 192.168.0.2:8080 weight 1;  
}  

这个weight也很好理解,权重大的被访问的概率就大,上面这个例子的话,访问2次server1,访问一次server2

upstream webname {  
  ip_hash;  
  server 192.168.0.1:8080;  
  server 192.168.0.2:8080;  
}   

ip_hash的配置也很简单,直接加一行就可以了,这样只要是同一个ip过来的都会到同一台server上。然后在server节点下进行配置:

location /name {  
    proxy_pass http://webname/name/;  
    proxy_http_version 1.1;  
    proxy_set_header Upgrade $http_upgrade;  
    proxy_set_header Connection "upgrade";  
}  

proxy_pass里面用上面配的webname代替了原来的ip地址。

这样就基本完成了负载均衡的配置。

 

下面是主备的配置:

还是在upstream里面

upstream webname {  
  server 192.168.0.1:8080;  
  server 192.168.0.2:8080 backup;  
} 

设置某一个节点为backup,那么一般情况下所有请求都访问server1,当server1挂掉或者忙的的时候才会访问server2

upstream webname {  
  server 192.168.0.1:8080;  
  server 192.168.0.2:8080 down;  
}  

设置某个节点为down,那么这个server不参与负载。

 

实现实例


1 测试环境

由于没有服务器,所以本次测试直接host指定域名,然后在VMware里安装了三台CentOS。

 

  • 测试域名 http://a.com

  • A服务器IP :192.168.5.149 (主)

  • B服务器IP :192.168.5.27

  • C服务器IP :192.168.5.126

 

2 部署思路

A服务器做为主服务器,域名直接解析到A服务器(192.168.5.149)上,由A服务器负载均衡到B服务器(192.168.5.27)与C服务器(192.168.5.126)上。

 

3 域名解析

由于不是真实环境,域名就随便使用一个http://a.com用作测试,所以http://a.com的解析只能在hosts文件设置。

打开:C:Windows\System32\drivers\etc\hosts

在末尾添加

192.168.5.149    a.com 

保存退出,然后启动命令模式ping下看看是否已设置成功

 

A、服务器nginx.conf设置

打开nginx.conf,文件位置在nginx安装目录的conf目录下。

http段加入以下代码

upstream a.com { 
      server  192.168.5.126:80; 
      server  192.168.5.27:80; 
} 

server{ 
    listen 80; 
    server_name a.com; 
    location / { 
        proxy_pass        http://a.com; 
        proxy_set_header  Host            $host; 
        proxy_set_header  X-Real-IP        $remote_addr; 
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for; 
    } 
}

保存重启nginx

 

B、C服务器nginx.conf设置

打开nginx.conf,在http段加入以下代码

server{ 
    listen 80; 
    server_name a.com; 
    index index.html; 
    root /data0/htdocs/www; 
}

保存重启nginx

 

测试

当访问a.com的时候,为了区分是转向哪台服务器处理我分别在B、C服务器下写一个不同内容的index.html文件,以作区分。

打开浏览器访问a.com结果,刷新会发现所有的请求,均分别被主服务器(192.168.5.149)分配到B服务器(192.168.5.27)与C服务器192.168.5.126)上,实现了负载均衡效果。


attachments-2020-04-QcZ1kbAh5e85431571c38.jpg



attachments-2020-04-s2Oxo7Zk5e85431ee82f2.jpg

  • 发表于 2020-04-02 09:43
  • 阅读 ( 572 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章