部署方案介绍:
通过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
yum -y install keepalived
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模式中, 虚拟机端口和真实主机端口要保持一致。否则会出现连接拒绝问题。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
}
启动:
service keepalived start
重启:
service keepalived restart
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支持三种负载均衡技术:
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教程之安装篇(Centos7&源码方式安装)
采用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服务都启动
vi /usr/local/nginx/html/index.html
添加IP显示(根据不同节点,显示不同IP):HOST IP: 10.10.20.111
[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节点都能正常连接, 轮询负载正常生效。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
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
LVS+KeepAlived有多种负载模式和调度策略, 根据实际需要选择配置, 通过Lvs+KeepAlived+Nginx实现了服务的高可用以及负载均衡, Nginx可以水平扩充, 能够更好地应对大数据量高并发的应用场景, 在这里只是做了基本的讲解, 生产网络环境可能更为复杂, 还要针对细节再做具体配置与调优, 如果出现VIP不能访问或端口不通的问题, 要检查防火墙以及DR模式中端口配置是否一致。
未经本人同意, 请勿随意转载! 相逢是缘, 希望对大家有所帮助, 谢谢!
如需获取最新技术资讯或交流, 请关注: