Lvs+KeepAlived+Nginx高可用与负载均衡方案的配置实现

一、LVS+ KeepAlived+Nginx高可用与负载均衡部署实现方案

部署方案介绍:
通过KeepAlived提供VIP由客户端接入, 主备两台保障高可用;
LVS作为四层负载, 实现对Nginx的负载均衡调用, 建议主备两台, 保障LVS的高可用;
Nginx原生并不支持集群, 但通过LVS可以实现负载, 支持水平扩充。
Lvs+KeepAlived+Nginx高可用与负载均衡方案的配置实现_第1张图片

二、部署规划

主机名 服务 IP 端口
VIP1 keepalived1/lvs1/nginx1 10.10.20.111 keepliaved【10.10.20.110:80】; nginx【80】
VIP2 keepalived2/lvs2/nginx2 10.10.20.112 keepliaved【10.10.20.110:80】; nginx【80】
VIP3 nginx3 10.10.20.113 nginx【80】

三、系统配置

  1. 修改主机名称:
    vip1号节点执行:

    hostnamectl set-hostname vip1
    

    vip2号节点执行:

    hostnamectl set-hostname vip2
    

    vip3号节点执行:

    hostnamectl set-hostname vip3
    
  2. 关闭防火墙
    在两台节点上执行:
    临时关闭

    systemctl stop firewalld
    

    永久关闭:

    systemctl disable firewalld
    

四、安装KeepAlived

  1. 在VIP1与VIP2两台节点中执行:
    yum -y install keepalived
    
  2. Keepalived配置
    1号节点配置:
    global_defs {
       router_id vip1          # 机器标识,一般设为hostname,故障发生时,邮件通知会使用到。
    }
    vrrp_instance VI_1 {            #vrrp实例定义
        state MASTER               #lvs的状态模式,MASTER代表主, BACKUP代表备份节点
        interface ens33               #绑定对外访问的网卡
        virtual_router_id 111        #虚拟路由标示,同一个vrrp实例采用唯一标示
        priority 100               #优先级,100代表最大优先级, 数字越大优先级越高
        advert_int 1              #master与backup节点同步检查的时间间隔,单位是秒
        authentication {           #设置验证信息
            auth_type PASS         #有PASS和AH两种
            auth_pass 6666         #验证密码,BACKUP密码须相同
        }
        virtual_ipaddress {         #KeepAlived虚拟的IP地址
            10.10.20.110
        }
    }
    virtual_server 10.10.20.110 80 {       #配置虚拟服务器IP与访问端口
        delay_loop 6                 #健康检查时间
        lb_algo rr                  #负载均衡调度算法, rr代表轮询
        lb_kind DR                   #负载均衡转发规则
        persistence_timeout 0        #会话保持时间,这里要做测试, 所以设为0, 实际可根据session有效时间配置
        protocol TCP               #转发协议类型,支持TCP和UDP
        real_server 10.10.20.111 80 {    #配置服务器节点VIP1
        weight 1               #设置权重,越大权重越高
        TCP_CHECK {              #r状态监测设置
           connect_timeout 10       #超时配置, 单位秒
           retry 3             #重试次数
           delay_before_retry 3        #重试间隔
           connect_port 80         #连接端口, 和上面保持一致
           }
        }
        real_server 10.10.20.112 80 {    #配置服务器节点VIP2
        weight 1               #设置权重,越大权重越高
        TCP_CHECK {              #r状态监测设置
           connect_timeout 10       #超时配置, 单位秒
           retry 3             #重试次数
           delay_before_retry 3        #重试间隔
           connect_port 80         #连接端口, 和上面保持一致
           }
        }
        real_server 10.10.20.113 80 {    #配置服务器节点VIP3
        weight 1               #设置权重,越大权重越高
        TCP_CHECK {              #r状态监测设置
           connect_timeout 10       #超时配置, 单位秒
           retry 3             #重试次数
           delay_before_retry 3        #重试间隔
           connect_port 80         #连接端口, 和上面保持一致
           }
        }
    
    }
    
    注意: DR模式中, 虚拟机端口和真实主机端口要保持一致。否则会出现连接拒绝问题。
    2号节点配置:
    global_defs {
       router_id vip2          # 机器标识,一般设为hostname,故障发生时,邮件通知会使用到。
    }
    vrrp_instance VI_1 {            #vrrp实例定义
        state BACKUP               #lvs的状态模式,MASTER代表主, BACKUP代表备份节点
        interface ens33               #绑定对外访问的网卡
        virtual_router_id 112        #虚拟路由标示,同一个vrrp实例采用唯一标示
        priority 98               #优先级,100代表最大优先级, 数字越大优先级越高
        advert_int 1              #master与backup节点同步检查的时间间隔,单位是秒
        authentication {           #设置验证信息
            auth_type PASS         #有PASS和AH两种
            auth_pass 6666         #验证密码,BACKUP密码须相同
        }
        virtual_ipaddress {         #KeepAlived虚拟的IP地址
            10.10.20.110
        }
    }
    virtual_server 10.10.20.110 80 {       #配置虚拟服务器IP与访问端口
        delay_loop 6                 #健康检查时间
        lb_algo rr                  #负载均衡调度算法, rr代表轮询
        lb_kind DR                   #负载均衡转发规则
        persistence_timeout 0        #会话保持时间,这里要做测试, 所以设为0, 实际可根据session有效时间配置
        protocol TCP               #转发协议类型,支持TCP和UDP
        real_server 10.10.20.111 80 {    #配置服务器节点VIP1
        weight 1               #设置权重,越大权重越高
        TCP_CHECK {              #r状态监测设置
           connect_timeout 10       #超时配置, 单位秒
           retry 3             #重试次数
           delay_before_retry 3        #重试间隔
           connect_port 80         #连接端口, 和上面保持一致
           }
        }
        real_server 10.10.20.112 80 {    #配置服务器节点VIP2
        weight 1               #设置权重,越大权重越高
        TCP_CHECK {              #r状态监测设置
           connect_timeout 10       #超时配置, 单位秒
           retry 3             #重试次数
           delay_before_retry 3        #重试间隔
           connect_port 80         #连接端口, 和上面保持一致
           }
        }
        real_server 10.10.20.113 80 {    #配置服务器节点VIP3
        weight 1               #设置权重,越大权重越高
        TCP_CHECK {              #r状态监测设置
           connect_timeout 10       #超时配置, 单位秒
           retry 3             #重试次数
           delay_before_retry 3        #重试间隔
           connect_port 80         #连接端口, 和上面保持一致
           }
        }
    
    }
    
    2号节点的配置,只要修改vrrp_instance部分:
    vrrp_instance VI_1 {
    	state BACKUP 
    	virtual_router_id 112 
    	priority 98 
    }
    
  3. 启动Keepalived服务
    启动: 
    service keepalived start
    重启:
    service keepalived restart 
    

五、安装LVS

KeepAlived中已经集成LVS, 无须再单独安装, 这里安装LVS的管理工具ipvsadm:

yum -y install ipvsadm

安装完成后, 执行命令查看转发信息:

[root@vip1 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

Nginx还没安装, 列表为空。

六、LVS配置说明

  1. LVS支持三种负载均衡技术:
    VS/NAT (Virtual Server via Network Address Translation): 网络地址翻译技术实现虚拟服务器。
    VS/TUN (Virtual Server via IP Tunneling): IP隧道技术实现虚拟服务器。
    VS/DR (Virtual Server via Direct Routing): 直接路由技术实现虚拟服务器。

    负载均衡 操作系统 网络 服务器数量 服务器网关 性能
    VS/NAT 任意 私有网络 10~20 负载均衡器 一般
    VS/TUN 支持隧道 局域网/广域网 100 自带路由
    VS/DR 多数(支持Non-arp) 局域网 大于100 自带路由 较高
  2. LVS八种负载调度算法:
    轮询: Round Robin
    加权轮询: Weighted Round Robin
    最少链接:Least Connection
    加权最少链接: Weighted Least Connections
    基于局部性的最少链接: Locality-Based Least Connections
    带复制的基于局部性最少链接: Locality-Based Least Connections with Replication
    目标地址散列: Destination Hashing
    源地址散列: Source Hashing

七、Nginx安装

在三台节点上, 分别安装Nginx服务,具体安装, 参考教程:Nginx教程之安装篇(Centos7&源码方式安装)

八、关闭ARP响应

采用DR模式是直接路由技术实现的转发, 它的报文转发方法有些不一样, 通过改写请求报文的MAC地址, 直接发送到Real Server, 而Real Server将响应直接返回给客户端, 免去IP隧道开销,是性能最好的负载模式, 但是会存在问题, Real Server发现不是MAC地址不对, 会丢弃该包, 因此我们需要修改配置, 关闭ARP响应, 欺骗 Real Server。
在两台vip1和vip2两台节点创建脚本文件, 设置lo回环IP:

[root@vip1 ~]# vi /etc/init.d/vipserver.sh 

vipserver.sh脚本内容:

#!/bin/bash
VVIP=10.10.20.110
case "$1" in
start)
    ifconfig lo:0 $VVIP broadcast $VVIP netmask 255.255.255.255 up
    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    echo "RealServer Start OK"
    ;;
stop)
    ifconfig lo:0 down
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
    echo "RealServer Stoped"
    ;;
*)
    echo "Usage: $0 {start|stop}"
    exit 1
esac
exit 0

添加执行权限:

[root@vip1 ~]# chmod u+x /etc/init.d/vipserver.sh 

在两台节点执行脚本:

[root@vip1 ~]# /etc/init.d/vipserver.sh start
RealServer Start OK

九、负载均衡测试

确保两台节点的KeepAlived服务启动, 三个节点的Nginx服务都启动

  1. 修改Nginx默认页面, 增加IP显示, 用以区分:
    vi /usr/local/nginx/html/index.html 
    
    添加IP显示(根据不同节点,显示不同IP):

    HOST IP: 10.10.20.111

  2. 开启不同浏览器访问虚拟IP,确保是不同的会话请求
    http://10.10.20.110/
    chrome访问:Lvs+KeepAlived+Nginx高可用与负载均衡方案的配置实现_第2张图片
    360浏览器访问:
    Lvs+KeepAlived+Nginx高可用与负载均衡方案的配置实现_第3张图片
  3. 检查连接情况
    [root@vip1 ~]# ipvsadm -ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  10.10.20.110:80 rr
      -> 10.10.20.111:80              Route   1      0          1         
      -> 10.10.20.112:80              Route   1      1          3         
      -> 10.10.20.113:80              Route   1      0          2     
    
    可以看到三台NG节点都能正常连接, 轮询负载正常生效。

十、高可用测试

  1. Keepalived的高可用测试
    当前VIP是挂载在vip1节点上:

    [root@vip1 ~]# ip a
    1: lo:  mtu 65536 qdisc noqueue state UNKNOWN qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet 10.10.20.110/32 brd 10.10.20.110 scope global lo:0
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens33:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:ae:11:cd brd ff:ff:ff:ff:ff:ff
        inet 10.10.20.111/24 brd 10.10.20.255 scope global ens33
           valid_lft forever preferred_lft forever
        inet 10.10.20.110/32 scope global ens33
           valid_lft forever preferred_lft forever
        inet6 fe80::2234:9658:a4a2:f462/64 scope link 
           valid_lft forever preferred_lft forever
        inet6 fe80::2b96:fe11:f595:e397/64 scope link tentative dadfailed 
           valid_lft forever preferred_lft forever
    

    停用vip1的KeepAlived服务:

    [root@vip1 ~]# service keepalived stop
    Redirecting to /bin/systemctl stop keepalived.service
    [root@vip1 ~]# ip a
    1: lo:  mtu 65536 qdisc noqueue state UNKNOWN qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet 10.10.20.110/32 brd 10.10.20.110 scope global lo:0
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens33:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:ae:11:cd brd ff:ff:ff:ff:ff:ff
        inet 10.10.20.111/24 brd 10.10.20.255 scope global ens33
           valid_lft forever preferred_lft forever
        inet6 fe80::2234:9658:a4a2:f462/64 scope link 
           valid_lft forever preferred_lft forever
        inet6 fe80::2b96:fe11:f595:e397/64 scope link tentative dadfailed 
           valid_lft forever preferred_lft forever
    

    虚拟IP, 10.10.20.110已经从vip1节点消失并自动转移到vip2节点中, 查看:

    [root@vip1 ~]# ip a 
    1: lo:  mtu 65536 qdisc noqueue state UNKNOWN qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet 10.10.20.110/32 brd 10.10.20.110 scope global lo:0
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens33:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:ae:11:cd brd ff:ff:ff:ff:ff:ff
        inet 10.10.20.111/24 brd 10.10.20.255 scope global ens33
           valid_lft forever preferred_lft forever
        inet6 fe80::2234:9658:a4a2:f462/64 scope link 
           valid_lft forever preferred_lft forever
        inet6 fe80::2b96:fe11:f595:e397/64 scope link tentative dadfailed 
           valid_lft forever preferred_lft forever
    

    访问仍是正常:
    Lvs+KeepAlived+Nginx高可用与负载均衡方案的配置实现_第4张图片

  2. Nginx高可用测试
    当前网页是转发到vip1节点, 我们停用vip1节点的Nginx服务

    [root@vip1 ~]# nginx -s stop
    [root@vip1 ~]# ps -ef| grep nginx 
    root       7031   1810  0 05:10 pts/2    00:00:00 grep --color=auto nginx
    

    在vip2号节点查看负载信息, vip1节点已经移除:

    [root@vip2 ~]# ipvsadm -ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  10.10.20.110:80 rr
      -> 10.10.20.112:80              Route   1      2          0         
      -> 10.10.20.113:80              Route   1      1          0        
    

    再次访问网页, 自动转发至vip3号节点
    Lvs+KeepAlived+Nginx高可用与负载均衡方案的配置实现_第5张图片

总结

LVS+KeepAlived有多种负载模式和调度策略, 根据实际需要选择配置, 通过Lvs+KeepAlived+Nginx实现了服务的高可用以及负载均衡, Nginx可以水平扩充, 能够更好地应对大数据量高并发的应用场景, 在这里只是做了基本的讲解, 生产网络环境可能更为复杂, 还要针对细节再做具体配置与调优, 如果出现VIP不能访问或端口不通的问题, 要检查防火墙以及DR模式中端口配置是否一致。

未经本人同意, 请勿随意转载! 相逢是缘, 希望对大家有所帮助, 谢谢!

如需获取最新技术资讯或交流, 请关注:
在这里插入图片描述

你可能感兴趣的:(Nginx)