Nginx | LVS | HAproxy实现负载均衡

负载均衡

介绍

简介

  • 负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台ECS的流量分发控制服务

  • 负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性

  • 负载均衡的主要功能点:

    • 负载均衡服务通过设置虚拟服务地址(IP),将位于同一地域(Region)的多台云服务器(Elastic Compute Service,简称ECS)资源虚拟成一个高性能、高可用的应用服务池;根据应用指定的方式,将来自客户端的网络请求分发到云服务器池中。
    • 负载均衡服务会检查云服务器池中ECS的健康状态,自动隔离异常状态的ECS,从而解决了单台ECS的单点问题,同时提高了应用的整体服务能力。在标准的负载均衡功能之外,负载均衡服务还具备TCP与HTTP抗DDoS攻击的特性,增强了应用服务器的防护能力。
    • 负载均衡服务是ECS面向多机方案的一个配套服务,需要同ECS结合使用
  • 作用:

    • 服务器容灾, 流量分发
    • 隐藏后端真实服务器,提高安全性
    • 七层负载均衡可以屏蔽非法请求
  • 实现方式

    • 硬件实现:性能高,价格高,几万到几十万不等
    • 软件级别:性价比高,可控性强

分类

img

二层负载均衡(mac)

  • 根据OSI模型的二层进行负载,一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后,再分配后端实际的MAC地址响应

三层负载均衡(ip)

  • 一般采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后,再分配后端实际的IP地址响应

四层负载均衡(tcp)

  • 网络运输层面的负载均衡:在三层负载均衡的基础上,用ip+port接收请求,再转发到对应的机器
  • 软件实现:LVS、HAProxy、Nginx(1.9及以上版本)

七层负载均衡(http)

  • 智能型负载均衡:主机接收请求,再转向(反向代理)相应的处理服务器
  • 实现方式:Nginx、HAProxy

四层&七层对比

在这里插入图片描述

四层 七层
基于 基于IP+Port 基于虚拟的URL或主机IP
类似于 路由器 代理服务器
握手次数 1次 2次
复杂度
性能 高:无需解析内容 中:需要算法识别URL ,Cookie和HTTP head等
安全性 低:无法识别DDos攻击 高:可以防御SYN cookie和SYN flood等
额外功能 会话保持,图片压缩,防盗链等

Nginx负载均衡

负载均衡算法

  • Round-Robin(轮询):RR ,默认算法,每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响
  • weight(轮询权值):weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或 者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源
  • ip_hash:每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器, 并且可以有效解决动态网页存在的session共享问题
  • fair:比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。 Nginx本身不支持fair,如果需要这 种调度算法,则必须安装upstream_fair模块
  • url_hash按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装 Nginx的hash软件包

配置

  • 通过server02克隆server04
主机名 ip地址 虚拟机
web1.master 192.168.139.128 server01
web2.backup 192.168.139.129 server02
mysql 192.168.139.130 server03
lb 192.168.139.131 server04
  • 基础环境配置
[root@lb ~]# sed -i 's/web2.backup/lb/' /etc/sysconfig/network
[root@lb ~]# cd /etc/udev/rules.d/
[root@lb ~]# rm -rf 70-persistent-net.rules
[root@lb ~]# reboot

cat >> /etc/hosts <<EOF
	192.168.139.131 lb
	EOF
  • 域名解析到负载均衡服务器上
  • 负载均衡配置
配置
[root@lb html]# vim /usr/local/nginx/conf/nginx.conf

#http段
upstream shop {
   
        server 192.168.139.128;
        server 192.168.139.129;
        }   
#upstream中server的关键字
	backup:其他的没有backup标识的服务器都无响应,才分发到backup
	down:不会被分发到
		#示例:server 192.168.139.127 backup;
	weight:weight的值越大分配到的访问概率越高
		#server 192.168.139.128 weight=5;
		#server 192.168.139.129 weight=3;
		#8次中,128分发5次,129分发3次
#upstream中配置项
	ip_hash;
	#每个请求按访问IP的哈希结果分配


#server段
server {
   
        listen 80;
        server_name www.server01.com;
        location / {
   
            proxy_pass http://shop;	代理转发到shop段,匹配到上面的upstream
            proxy_set_header Host $host;传输域名给后端服务器,方便匹配对应server虚拟主机
            }
    }
[root@lb html]# service nginx restart

查看(在web1和web2节点上配置)
[root@web1 ~]# vim /usr/local/nginx/html/tp5shop/application/home/controller/Base.php
 26         echo gethostname();在页面上方显示主机名(仅调试用)

在这里插入图片描述

负载均衡后获取客户端ip

模块编译安装(略)
[root@lb html]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.20.1
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) 
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --add-module=/root/soft/ngx-fancyindex-0.4.3/ --add-module=/root/soft/echo-nginx-module-0.61/

负载均衡服务器上配置ip转发(-->web服务器)
[root@lb html]# vim /usr/local/nginx/conf/nginx.conf
server {
   
        listen 80;
        server_name www.server01.com;
        location / {
   
            proxy_pass http://shop;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;发送客户端IP,给后端服务器,用来方便后端服务器识别用户真实IP
            }
    }
[root@lb ~]# service nginx reload
    
web服务器配置ip来源
[root@web1/2 ~]# vim /usr/local/nginx/conf/nginx.conf
	#推荐配置到相应的server段
	set_real_ip_from    192.168.139.131;
[root@web1/2 ~]# service nginx reload

查看日志
[root@web1 ~]# tail -1 /usr/local/nginx/logs/server01.lnmp.com_access.log 
192.168.139.1 - - [13/Oct/2021:00:44:45 +0800] "GET /static/home/img/wx_cz.jpg HTTP/1.0" 304Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36
#获取客户端ip:192.168.139.1

session一致性问题

  • 访问后端页面,登录发现验证码不通过

在这里插入图片描述

  • 原因:请求被分发到web1上,在web1上生成验证码,存储到服务器的session中。但是校验时,请求被轮训分发到web2上,所以验证码校验不通过
[root@lb ~]# cd /tmp/
[root@lb tmp]# ls 
sess_m5nh62mo90nlkl56t876uf4pl9 sess_2ipocqqjnd5lb1a0gfiv1h57b0 sess_odi5t61oskdrak5c8ieoqht9k0 sess_67fh48m2272n5q3be7qh71j1hk sess_okjcaftj5qr45apsenb6t1ht6e sess_7fi8louv43omu913gt82982r3r sess_vpmcf7uv2oevgle1pfrqc6p042 sess_ek3driitk3iq3ct9em1mnh1hes  
sess_ftvk56k6nd9vb3debnau4jhts9 sess_jmftk8tlam2boi7mhbq40ri8ir

负载均衡高可用

  • 所有的请求流量,都要经过负载均衡服务器,负载均衡服务器压力很大,防止它宕机,导致后端服务所有都不可用,需要对负载均衡服务器,做高可用

  • 基于keepalived

  • 克隆lb服务器

主机名 ip地址 虚拟机
lb1.master 192.168.139.131 server04
ld2.backup 192.168.139.132 server05
  • 基础环境配置
配置server04
[root@lb ~]# sed -i 's/lb/lb1.master/' /etc/sysconfig/network
[root@lb ~]# reboot

配置server05
[root@lb ~]# sed -i 's/lb/lb2.backup/' /etc/sysconfig/network
[root@lb ~]# cd /etc/udev/rules.d/
[root@lb ~]# rm -rf 70-persistent-net.rules
[root@lb ~]# reboot

cat >> /etc/hosts <<EOF
	192.168.139.131 lb1.master
	192.168.139.132 lb2.backup
	EOF
  • master的keepalived配置
[root@lb1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
   
    state BACKUP
    interface eth0
    virtual_router_id 52	虚拟路由ID,不要之前的冲突
    priority 100 
    nopreempt
    advert_int 1
    authentication {
   
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
   
        192.168.139.201		 添加新VIP
    }   
     track_script {
   
        check_nginx
    }   
    unicast_src_ip 192.168.139.131	修改单播地址
    unicast_peer 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值