LVS
LVS简介
- Linux Virtual Server
- LVS(ipvs)已被集成到Linux内核中
- 负载均衡调度器,基于四层的负载均衡,基于IP+端口号
- 由章文嵩博士主导的开源的负载均衡项目
什么是LVS?
Lvs是一个高伸缩性和高可用的服务,是真实的服务器集群,带有负载均衡器,跑在Linux操作系统上。只能在linux操作系统上去运行,对于用户来讲整个集群是透明的,对于用户访问的时候,它是一个高性能的整体。
lvs是一个负载均衡调度器,可以通过自己算法可以把请求发送到后端的某一个真实的web服务器(RS)。
通过使用这种负载均衡的集群,可以扩展服务器的性能,带宽,提高吞吐量,提高网络数据的处理能力,增强服务的灵活性以及可用性。
为什么使用LVS + Nginx
- LVS基于四层,工作效率高,基于四层性能会更高,它接受到的请求是可以直接去转发的,对于nginx来讲接受到请求后,还要对请求进行处理,相应的nginx就会有一定的性能损耗,lvs的负载要远远高于Nginx
- 单个nginx承受不了压力,需要集群,是需要多个nginx共同请求用户的请求,
- LVS充当nginx集群的调度者,LVS不会处理请求和报文的,所以它的负载能力会更高,
- nginx接受请求来回,LVS可以只接受不响应
lvs原理:通过ipvs模块来实现的,ipvs可以虚拟出来一个IP地址,用户是通过虚拟IP来进行访问的,访问的请求首先会经过VIP,然后到达负载均衡的调度器(lvs),然后由负载均衡的调度器根据自己的算法,在从RS中挑选出一个节点来响应用户的请求。
LVS的三种模式
LVS模式之NAT
基于网络地址的转换,在这个模式中,lvs充当用户的请求与响应,类似于nginx做负载均衡,如果有并发的场景下,使用NAT是不行的。LVS是处于公网的,用户可用请求、访问,RS处于内部的局域网。
LVS模式之TUN
IP隧道模式,有一个硬性的要求,每一个节点都要有一个计算机网卡,这个网卡用于建立隧道,计算机彼此的通信都会经过隧道,通过建立隧道以后,才能够达到通讯,用户所有的响应不会经过lvs,RS处理完请求之后,会把请求报文直接返回给用户,这个时候,lvs的压力就大大的降低了。通过这种方式,可以大大提升了并发和吞吐量,但是每一个节点都要配置一个网卡,这个RS集群是暴露在公网的。
LVS模式之DR
直接路由模式,RS接受响应的时候,会统一的经过一个路由,通过路由中转以后,在返回给用户,相应的RS集群就不会处于公网了,处于企业的私网。
用户通过虚拟IP来请求LVS,返回的时候也构建一个虚拟IP,当构建一个虚拟IP以后,响应就会经过虚拟IP,在返回给用户。
搭建LVS-DR模式
配置LVS节点与ipvsadm
- 服务器与IP约定
LVS:
DIP:内网IP
VIP:虚拟IP
Nginx:作为真实服务器
RIP:内网IP
VIP:虚拟IP 用户处理完数据,通过这个IP返回回去,这个IP和LVS VIP保持一致就可以了
- LVS -台
vip : 172.16.139.150
dip : 172.16.139.134
- Nginx -2台(RS)
vip : 172.16.139.150
dip : 172.16.139.135 172.16.139.136
-
所有计算机节点关闭网络配置管理器,因为有可能会和网络接口冲突:
systemctl stop NetworkManager
systemctl disable NetworkManager
-
构建虚拟IP,和网卡有关系
进入到网卡配置目录,找到咱们的ens33:
cd /etc/sysconfig/network-scripts/
拷贝并且创建子接口:
cp ifcfg-ens33 ifcfg-ens33:1
vi ifcfg-ens33:1BOOTPROTO=static DEVICE=ens33:1 ONBOOT=yes IPADDR=172.16.139.150 NETMASK=255.255.255.0
172.16.139.150就是vip,是提供给外部用户访问的IP地址,道理和nginx+keepalived的vip是一样的。
-
重启网络服务,
service network restart
查看IP ip addr
虚拟IP150就构建好了 -
安装集群管理工具ipvsadm
yum install ipvsadm
ipvsadm -Ln
集群还没有配置,所以列表为空,配置好之后,会有相应的展示
-
注:
如果是云服务器:
虚拟IP建立在网卡上面的,需要成本的,要去付费的
1.阿里云不支持虚拟IP,需要购买他的负载均衡服务
2.腾讯云支持虚拟IP,但是需要额外购买,一台节点最大支持10个虚拟IP
为两台RS配置虚拟IP
-
构建虚拟IP,用于返回用户数据报文
进入到网卡配置目录,找到lo(本地环回接口,用户构建虚拟网络子接口),拷贝一份新的随后进行修改:
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:1 -
编辑子接口内容
vi ifcfg-lo:1DEVICE=lo:1 IPADDR=172.16.139.150 NETMASK=255.255.255.255 NETWORK=127.0.0.0 # If you're having problems with gated making 127.0.0.0/8 a martian, # you can change this to something else (255.255.255.255, for example) BROADCAST=127.255.255.255 ONBOOT=yes NAME=loopback ``` :wq 保存退出
-
重启后通过ip addr 查看如下
ifup lo 或者service network restart 重启网络
ip addr -
另外一台RS也做相同的操作
为两台RS配置arp --设置网卡的行为
arp目的是更加精准的响应用户的请求,处理用户的请求,如何去处理用过的request,方式。网卡的行为要做设置
- arp-ignore:ARP响应级别(处理请求)
- 0 : 只有本机配置了ip,就能响应请求
- 1:请求的目标地址到达对应的网络接口,才会响应请求
- arp-announce:ARP通告行为(返回响应)
- 0:本机上任何网络接口都向外通告,所有的网卡都能接受到通知
- 1:尽可能避免本网卡与不匹配的目标进行通告
- 2:只在本网卡通告
配置ARP
-
打开sysctl.conf:
vim /etc/sysctl.conf# configration for lvs net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.default.arp_ignore = 1 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.default.arp_announce = 2 net.ipv4.conf.lo.arp_announce= 2
-
配置所有网卡、默认网卡以及虚拟网卡的arp响应级别和通告行为,分别对应:all,default,lo:
-
刷新配置文件:
sysctl -p -
增加一个网关,用于接收数据报文,当有请求到本机后,会交给lo去处理:
route add -host 172.16.139.150 dev lo:1
route -n 查看 -
防止重启失效,做如下处理,用户开启自启动:
echo “route add -host 172.16.139.150 dev lo:1” >> /etc/rc.local
使用ipvsadm配置集群规则
(以上150的虚拟IP 在下文中都换成了140)
在lvs节点上:
-
创建LVS节点,用户访问的集群调度者
ipvsadm -A -t 172.16.139.140:80 -s rr-A:添加集群
-t:tcp协议
ip地址: 设定集群的访问ip,也就是LVS的虚拟ip
-s:设置负载均衡的算法,rr表示轮询 -
创建2台RS真实的服务器
ipvsadm -a -t 172.16.139.140:80 -r 172.16.139.135:80 -g
ipvsadm -a -t 172.16.139.140:80 -r 172.16.139.136:80 -g-a :添加真实服务器
-t :tcp协议
-r :真实服务器的ip地址
-g:设定DR模式 -
保存到规则库,否则重启失效
ipvsadm -S -
检查集群
ipvsadm -Ln 查看集群列表
ipvsadm -Ln --stats 查看集群状态
LVS持久化
经过多次的刷新,只访问同一个节点,明明设置的是轮询规则,因为lvs有持久化连接的配置
man ipvsadm 可以查看手册
-
重新配置持久化时间:
ipvsadm -E -t 172.16.139.140:80 -s rr -p 5-p :当一个用户发起多次的请求的话,它会转发到同一个RS根据第一次请求,默认为300s,所以不管怎么刷新,访问的都是134,只有时间过了以后,再次进行访问 轮询才会起作用。
-
再次查看集群列表,发现多了持久化时间
-
再次刷新,发现还是没有用,还会有另外一个超时时间
#设置tcp tcpfin udp的过期时间(一般保存默认) --set tcp tcpfin udp
ipvsadm --set 1 1 1
#查看过期时间
ipvsadm -Ln --timeout
如果没有发生轮询就表示已经持久化了,平时使用保存默认设置就可以了
搭建Keepalived + Lvs + Nginx高可用负载均衡
目前的架构一旦Lvs发生故障之后,所有的用户请求都不能向用户提供服务了,所以要搭建双主热备,通过主备切换实现高可用,并且当使用Keepalived之后,还能对RS进行健康检查,如果RS宕机了,就会将宕机的RS踢出集群,如果恢复了之后,会自动加入。
1.主备LVS安装Keepalived
2.配置
keepalived.conf
#全局配置
global_defs {
#路由id:当前安装keepalived的节点主机标识符,保证全局唯一
router_id keep_133
}
#基于vrrp的一个实例 就是一个服务器节点
vrrp_instance VI_1 {
#表示的状态 当前133nginx的主节点 master|backup
state MASTER
#当前实例绑定的网卡
interface ens33
#虚拟路由ip 保证主备节点一致即可
virtual_router_id 41
#权重 谁的优先级高,在master挂掉之后,就成为master
priority 100
#主备之间同步检查时间间隔 s
advert_int 1
#认证授权密码,防止非法节点进入
authentication {
auth_type PASS
auth_pass 1111
}
#vip
virtual_ipaddress {
172.16.139.140
}
}
#配置集群地址 访问的IP+端口
virtual_server 172.16.139.140 80 {
#健康检查的时间 单位:s
delay_loop 6
#配置负载均衡的算法,默认是轮询
lb_algo rr
#设置LVS的模式 NAT|TUN|DR
lb_kind DR
#设置会话持久化的时间
persistence_timeout 5
#协议 -t
protocol TCP
real_server 172.16.139.135 80 {
#轮询的默认权重配比设置为1
weight 1
#设置健康健康
TCP_CHECK {
#检查的80端口
connect_port 80
#超时时间
connect_timeout 2
#重试次数
nb_get_retry 2
#间隔时间
delay_before_retry 3
}
}
real_server 172.16.139.136 80 {
weight 1
#设置健康健康
TCP_CHECK {
#检查的80端口
connect_port 80
#超时时间
connect_timeout 2
#重试次数
nb_get_retry 2
#间隔时间
delay_before_retry 3
}
}
}
3.清除集群现有的规则,重启Keepalived
ipvsadm -C
systemctl restart keepalived.service
查看集群配置规则
4. 配置备用节点
#全局配置
global_defs {
#路由id:当前安装keepalived的节点主机标识符,保证全局唯一
router_id LVS_137
}
#基于vrrp的一个实例 就是一个服务器节点
vrrp_instance VI_1 {
#表示的状态 当前133nginx的主节点 master|backup
state BACKUP
#当前实例绑定的网卡
interface ens33
#虚拟路由ip 保证主备节点一致即可
virtual_router_id 41
#权重 谁的优先级高,在master挂掉之后,就成为master
priority 50
#主备之间同步检查时间间隔 s
advert_int 1
#认证授权密码,防止非法节点进入
authentication {
auth_type PASS
auth_pass 1111
}
#vip
virtual_ipaddress {
172.16.139.140
}
}
#配置集群地址 访问的IP+端口
virtual_server 172.16.139.140 80 {
#健康检查的时间 单位:s
delay_loop 6
#配置负载均衡的算法,默认是轮询
lb_algo rr
#设置LVS的模式 NAT|TUN|DR
lb_kind DR
#设置会话持久化的时间
persistence_timeout 5
#协议 -t
protocol TCP
real_server 172.16.139.135 80 {
#轮询的默认权重配比设置为1
weight 1
#设置健康健康
TCP_CHECK {
#检查的80端口
connect_port 80
#超时时间
connect_timeout 2
#重试次数
nb_get_retry 2
#间隔时间
delay_before_retry 3
}
}
real_server 172.16.139.136 80 {
weight 1
#设置健康健康
TCP_CHECK {
#检查的80端口
connect_port 80
#超时时间
connect_timeout 2
#重试次数
nb_get_retry 2
#间隔时间
delay_before_retry 3
}
}
}
5. 测试
停止主节点的keepalived,查看备用节点的ip addr,发现虚拟IP绑定到备用节点上,又称为IP飘逸技术