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

部署方案介绍:

通过KeepAlived提供VIP由客户端接入, 主备两台保障高可用;

LVS作为四层负载, 实现对Nginx的负载均衡调用, 建议主备两台, 保障LVS的高可用;

Nginx原生并不支持集群, 但通过LVS可以实现负载, 支持水平扩充。

Nginx keepalived VIP可以无法访问 网关网络设置_IP

二、部署规划

主机名

服务

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
  1. 关闭防火墙
    在两台节点上执行:
    临时关闭
systemctl stop firewalld

永久关闭:

systemctl disable firewalld

四、安装KeepAlived

  1. 在VIP1与VIP2两台节点中执行:
yum -y install keepalived
  1. 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         #连接端口, 和上面保持一致
       }
    }

}
  1. 注意: 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         #连接端口, 和上面保持一致
       }
    }

}
  1. 2号节点的配置,只要修改vrrp_instance部分:
vrrp_instance VI_1 {
	state BACKUP 
	virtual_router_id 112 
	priority 98 
}
  1. 启动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

自带路由

较高

  1. 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
  1. 添加IP显示(根据不同节点,显示不同IP):
<h2>HOST IP: 10.10.20.111</h2>
  1. 开启不同浏览器访问虚拟IP,确保是不同的会话请求
    http://10.10.20.110/ chrome访问:
    360浏览器访问:
  2. 检查连接情况
[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

十、高可用测试

  1. Keepalived的高可用测试
    当前VIP是挂载在vip1节点上:
[root@vip1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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

访问仍是正常:

Nginx keepalived VIP可以无法访问 网关网络设置_服务器_02

  1. 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号节点

Nginx keepalived VIP可以无法访问 网关网络设置_服务器_03

总结

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