keepalived+nginx+lvs配置与详解
参考文档:http://www.178linux.com/89580
https://blog.csdn.net/lupengfei1009/article/details/86514445
https://blog.csdn.net/weixin_40470303/article/details/80541639
Keepalived
三种模块
core模块:为keepalived的核心组件,负责主进程的启动、维护以及全局配置文件的加载和解析
check模块:负责健康检查,包括常见的各种检查方式
VRRP模块:实现VRRP协议的
VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议
1)VRRP是用来实现路由器冗余的协议。
2)VRRP协议是为了消除在静态缺省路由环境下路由器单点故障引起的网络失效而设计的主备模式的协议,使得发生故障而进行设计设备功能切换时可以不影响内外数据通信,不需要再修改内部网络的网络参数。
3)VRRP协议需要具有IP备份,优先路由选择,减少不必要的路由器通信等功能。
4)VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个)。然而,在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话,就是master,或者是通过算法选举产生的,MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等,其他设备不具有该IP,状态是BACKUP。除了接收MASTER的VRRP状态通告信息外,不执行对外的网络功能,当主级失效时,BACKUP将接管原先MASTER的网络功能。
5)VRRP协议配置时,需要配置每个路由器的虚拟路由ID(VRID)和优先权值,使用VRID将路由器进行分组,具有相同VRID值的路由器为同一个组,VRID是一个0-255的整整数,;同一个组中的路由器通过使用优先权值来选举MASTER。,优先权大者为MASTER,优先权也是一个0-255的正整数
Keepalived工作原理:
keepalived可提供vrrp以及health-check(健康检查)功能,可以只用它提供双机浮动的vip(vrrp虚拟路由功能),这样可以简单实现一个双机热备高可用功能;keepalived是以VRRP虚拟路由冗余协议为基础实现高可用的,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到VRRP包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master
Keepalived总结:
就是对realserver(主机)的健康状态检查以及loadbalance(负载均衡)主机和backup(主机)之间failover(故障转移)的实现
就是说有web主机故障就会被keepalived检测到并剔除,当web主机正常的时候再加进来,不需要人工干涉,人工只需要修复故障web主机
LVS
LVS负载均衡常用的工作模式有NAT、DR、和TUN三种,其中DR模式性能最为优越,使用最为广泛
Lvs相关术语:
DS:Director Server,前端负载均衡器节点
RS:Real Server,后端真实的工作服务器
VIP:向外部直接面向用户请求,作为用户请求的目标ip地址
DIP:Director Server IP,主要用于和内部主机通讯的ip地址
RIP:Real Server IP,后端服务器的ip地址
CIP:Client IP,访问客户端的ip地址
三种工作模式:
NAT:即网络地址转换(外网和内网地址映射),其作用是通过数据报头的修改,使得位于企业内部的私有IP地址可以访问外网,以及外部用用户可以访问位于公司内部的私有IP主机。LVS负载调度器可以使用两块网卡配置不同的IP地址,eth0设置为私钥IP与内部网络通过交换设备相互连接,eth1设备为外网IP与外部网络联通。
NAT部署:
- 在后端每台服务器上将网关设置为LVS服务器地址
route add default gw 192.168.20.13
- 在LVS服务器上开启网络转发
echo net.ipv4.ip_forward =1 > /etc/sysctl.conf
sysctl -p
- 使用iptables转发
iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -o ens33 -j MASQUERADE
- NAT模式下无需配置ARP抑制
1) ifconfig ens33:1 192.168.20.100 netmask 255.255.255.0 up
2) ipvsadm -A -t 192.168.20.100 -s rr
3) ipvsadm -a -t 192.168.20.100 -r 192.168.20.21 -m
4) ipvsadm -a -t 192.168.20.100 -r 192.168.20.22 -m
TUN:在LVS(NAT)模式的集群环境中,由于所有的数据请求及响应的数据包都需要经过LVS调度器转发,如果后端服务器的数量大于10台,则调度器就会成为整个集群环境的瓶颈。我们知道,数据请求包往往远小于响应数据包的大小。因为响应数据包中包含有客户需要的具体数据,所以LVS(TUN)的思路就是将请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器响应数据包直接返回给客户端。IP隧道(IP tunning)是一种数据包封装技术,它可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的VIP地址的数据包封装,通过隧道转发给后端的真实服务器(Real Server),通过将客户端发往调度器的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务器的IP地址及对应端口),LVS(TUN)模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后直接给客户端主机响应数据。
DR:在LVS(TUN)模式下,由于需要在LVS调度器与真实服务器之间创建隧道连接,这同样会增加服务器的负担。与LVS(TUN)类似,DR模式也叫直接路由模式,该模式中LVS依然仅承担数据的入站请求以及根据算法选出合理的真实服务器,最终由后端真实服务器负责将响应数据包发送返回给客户端。与隧道模式不同的是,直接路由模式(DR模式)要求调度器与后端服务器必须在同一个局域网内,VIP地址需要在调度器与后端所有的服务器间共享,因为最终的真实服务器给客户端回应数据包时需要设置源IP为VIP地址,目标IP为客户端IP,这样客户端访问的是调度器的VIP地址,回应的源地址也依然是该VIP地址(真实服务器上的VIP),客户端是感觉不到后端服务器存在的。由于多台计算机都设置了同样一个VIP地址,所以在直接路由模式中要求调度器的VIP地址是对外可见的,客户端需要将请求数据包发送到调度器主机,而所有的真实服务器的VIP地址必须配置在Non-ARP的网络设备上,也就是该网络设备并不会向外广播自己的MAC及对应的IP地址,真实服务器的VIP对外界是不可见的,但真实服务器却可以接受目标地址VIP的网络请求,并在回应数据包时将源地址设置为该VIP地址。调度器根据算法在选出真实服务器后,在不修改数据报文的情况下,将数据帧的MAC地址修改为选出的真实服务器的MAC地址,通过交换机将该数据帧发给真实服务器。整个过程中,真实服务器的VIP不需要对外界可见。
DR部署:
#添加VIP,广播地址和VIP一样
ifconfig eth0:1 192.168.20.100 broadcast 192.168.20.100 netmask 255.255.255.255 up
#添加路由条目
route add -host 192.168.20.100 dev eth0:1
#使用ipvsadm工具配置Director和Real Server信息
ipvsadm -A -t 192.168.20.100:80 -s rr #指定LVS调度器的地址以及算法,-t代表tcp协议
ipvsadm -a -t 192.168.20.100:80 -r 192.168.20.21:80 -g #指定Real Server的地址以及工作模式,-g代表DR模式
ipvsadm -a -t 192.168.20.100:80 -r 192.168.20.22:80 -g
LVS十种调度算法
参考文档:https://www.cnblogs.com/mithrandirw/p/8927366.html
Keepalived+nginx+lvs部署
作用:lvs是一个在四层上实现后端realserver(主机)的负载均衡的集群,lvs遗留下两个问题,一个是lvs的单点故障;第二个是lvs不能检测后端realserver(主机)的健康状态检查。
解决lvs的单点故障就用到了高可用集群:
①、可以是heartbeat+ldirectord这种重量级的;
②、可以是keepalived+lvs这种轻量级的解决方案。
解决lvs不能检测后端realserver的健康状态也后很多种方法:
①、可以在lvs上写脚本ping后端realserver的ip地址,ping几次发现ip地址ping不通则在ipvs规则里面删除,当后端服务器可以ping了,则把后端realserver添加到ipvs规则里面。
②、可以在lvs上写脚本请求后端realserver的测试几次网页文件,查看状态码是否为200,不是则在ipvs规则里面清楚,当测试网页返回的状态吗是200之后,则把后端realserver添加到ipvs规则里面
③、以上两种方法都是依赖于脚本,keepalived的出现解决了不依赖于脚本,也可以对后端realserver的健康状态检查,keepalived的配置文件里面可以自行生成ipvs的规则,并且自行检测后端realserver的状态,当后端realserver不能提供服务了,keepalived会自行将其在ipvs规则里面删除,当后端realserver可以提供服务了,又自行的在ipvs规则里面添加。
准备:
192.168.20.12 主keepalived
192.168.20.13 从keepalived
192.168.20.21 nginx
192.168.20.22 nginx
192.168.20.100 VIP
开始配置部署:
在192.168.20.12和192.168.20.13中
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
vim /etc/keepalived/keepalived.conf
主keepalived配置文件:
global_defs {
notification_email {
edisonchou@hotmail.com
}
router_id LVS_DEVEL # 设置lvs的id,在一个网络内应该是唯一的
}
vrrp_instance VI_1 {
state MASTER #指定keepalived的角色,MASTER为主,BACKUP为备 (大写)
interface ens33 #网卡id 不同的电脑网卡id会有差别(ip a或者ifconfig)来查看
virtual_router_id 51 #虚拟路由编号,主备一致
priority 100 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
advert_int 1 #检查间隔,默认为1秒
authentication { #这里配置的密码最多8位,主备一致,否则无法正常通讯
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #定义虚拟IP(VIP)为192.168.20.100,可以多设,每行一个
192.168.20.100
}
}
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.20.100 80 {
delay_loop 6 #设置健康检查时间,单位是秒
lb_algo rr #设置负载调度的算法为wlc
lb_kind DR #设置LVS实现负载的机制,有NAT,TUN,DR三种模式
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 192.168.20.21 80 { #指定real server1的IP地址
weight 3 #配置节点权重值,数字越大权重越高
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.20.22 80 { #指定real server2的IP地址
weight 3 #配置节点权重值,数字越大权重越高
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
从keepalived配置文件:
global_defs {
notification_email {
edisonchou@hotmail.com
}
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.20.100
}
}
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.20.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 192.168.20.21 80 {
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.20.22 80 {
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
配置nginx服务器
在192.168.20.21和192.168.20.22主机上配置
1.启动nginx 确保在运行
ps -ef | grep nginx
- 编辑realserver脚本文件(两台)
进入/etc/rc.d/init.d
vim realserver
SNS_VIP=192.168.20.100
/etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
/sbin/route add -host $SNS_VIP dev lo:0
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
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $SNS_VIP >/dev/null 2>&1
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
保存并添加权限
chmod 755 /etc/rc.d/init.d/realserver
chmod 755 /etc/rc.d/init.d/functions #因为realserver脚本中用到functions
执行脚本
service realserver start
查看效果
ip a
配置结束之后开启keepalived
然后查看两台主机的情况
注意:备服务器的网卡下没有出现192.168.1.200(VIP)的ip,说明备服务正常
注:如果这里也出现了VIP,那么说明裂脑了,需要检查防火墙是否配置正确;是否允许了vrrp的多播通讯
在keepalived主机中(两台)
Lvs管理工具ipvsadm
安装
yum -y install ipvsadm
查看统计:
查看当前配置的虚拟服务和各个RS权重
ipvsadm -Ln
查看当前ipvs模块中记录的连接(可用于观察转发情况)
ipvsadm -lnc
查看ipvs模块的转发情况统计
ipvsadm -Ln --stats | --rate
Lvs超时配置
查看lvs的超时时间
ipvsadm -L --timeout
优化连接超时时间
ipvsadm --set 1 10 300
查看轮询结果
1.用curl访问
2.在浏览器上访问
然后刷新一下
测试:
停掉主keeplived
systemctl stop keepalived.service
systemctl status keepalived.service
从keepalived会自动添加VIP 192.168.20.100
现在访问依然没问题
现在启动主keeplived
VIP又回到主keepalived配置上面
而从keepalived就没有VIP了
访问也没有受到影响
现在将nginx停掉一台
现在只剩下一台web服务器
访问只有一台nginx
然后将nginx启动
LVS自动监控又将nginx21加入到里面
再次访问 两台web又可以访问