一、LVS+ KeepAlived+Nginx高可用与负载均衡部署实现方案
部署方案介绍:
通过KeepAlived提供VIP由客户端接入, 主备两台保障高可用;
LVS作为四层负载, 实现对Nginx的负载均衡调用, 建议主备两台, 保障LVS的高可用;
Nginx原生并不支持集群, 但通过LVS可以实现负载, 支持水平扩充。
二、部署规划
主机名 | 服务 | 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】 |
三、系统配置
-
修改主机名称:
vip1号节点执行:hostnamectl set-hostname vip1
vip2号节点执行:
hostnamectl set-hostname vip2
vip3号节点执行:
hostnamectl set-hostname vip3
-
关闭防火墙
在两台节点上执行:
临时关闭systemctl stop firewalld
永久关闭:
systemctl disable firewalld
四、安装KeepAlived
- 在VIP1与VIP2两台节点中执行:
yum -y install keepalived
- Keepalived配置
1号节点配置:
注意: DR模式中, 虚拟机端口和真实主机端口要保持一致。否则会出现连接拒绝问题。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 #连接端口, 和上面保持一致 } } }
2号节点配置:
2号节点的配置,只要修改vrrp_instance部分: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 #连接端口, 和上面保持一致 } } }
vrrp_instance VI_1 { state BACKUP virtual_router_id 112 priority 98 }
- 启动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配置说明
-
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 自带路由 较高 -
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服务都启动
- 修改Nginx默认页面, 增加IP显示, 用以区分:
添加IP显示(根据不同节点,显示不同IP):vi /usr/local/nginx/html/index.html
<h2>HOST IP: 10.10.20.111</h2>
- 开启不同浏览器访问虚拟IP,确保是不同的会话请求
http://10.10.20.110/
chrome访问:
360浏览器访问:
- 检查连接情况
可以看到三台NG节点都能正常连接, 轮询负载正常生效。[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
十、高可用测试
-
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高可用测试
当前网页是转发到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有多种负载模式和调度策略, 根据实际需要选择配置, 通过Lvs+KeepAlived+Nginx实现了服务的高可用以及负载均衡, Nginx可以水平扩充, 能够更好地应对大数据量高并发的应用场景, 在这里只是做了基本的讲解, 生产网络环境可能更为复杂, 还要针对细节再做具体配置与调优, 如果出现VIP不能访问或端口不通的问题, 要检查防火墙以及DR模式中端口配置是否一致。
本文由mirson创作分享,如需进一步交流,请加QQ群:19310171或访问www.softart.cn