LVS
LVS介绍
负载均衡的作用?
解决并发压力,提高应用处理性能,增加吞吐量,加强网络处理能力。
提高故障转移,实现高可用
可以提高添加或减少服务器的数量,提供网站的可扩展性
安全防范,复杂均衡设备上做一些过滤,黑白名单处理
**负载均衡和反向代理区别 **
LVS的负载均衡是仅仅转发用户的请求数据包
nginx反向代理是接收到用户请求后,重定向后端节点发出新的请求。
为什么使用负载均衡?
负载均衡集群提供了一种廉价,有效,透明的方法,来扩展网络设备和服务器的负载,带宽,增加吞吐量,加强网络数据处理能力,提供网络的灵活性和可用性。单台集群无法承受大规模的并发访问或数据流量时,需要搭建负载均衡集群把流量分摊到多台节点设备上分别处理,既减少了用户等待响应的时间,又提升了用户体验。任意一个或多个节点设备宕机,也不会影响整个业务的运行。
负载均衡集群提供了一种廉价,有效,透明的方法,来扩展网络设备和服务器的负载,带宽,增加吞吐量,加强网络数据处理能力,并且提供了网站的可扩展性。还提供了故障转移,防止单点故障,保障了业务的高可用性。
什么时候使用nginx,什么时候使用LVS?
LVS讲解
在实际应用中,LVS常与keepalived的搭配故障,实现该可用,高性能,可伸缩,可管理的服务集群。LVS主要由内核模块,ipvs,KTCPVS与对于的管理程序ipvsadm,tcpvsadm组成。IPVS负责IP负载均衡,即四层网络交换。KTCPVS是基于内存的负载均衡,即七层网络的交换。
IPVS的工作原理:当syn报文到达时,它选择后边的一台服务器,将报文转发过去,在此之后的所有包含相同的IP和tcp报文头地址的数据包都会备转到之前选择的服务器上,这个网络级别的转发效率最高。
LVS无需安装,安装的是管理工具,第一种叫ipvsadm,第二种叫keepalive。
ipvsadm是通过命令行管理,而keeplive读取配置文件管理。
LVS转发方式
IPVS支持三种转发方式:
VS/NAT:通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分发给后端的真实服务器,真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个调度过程。
VS/TUN:调度器包请求报文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户。
VS/DR:通过改下请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。
DR比TUN性能稍好,它没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连在同一物理网段上,且服务器网络设备(或设备别名)不做ARP(地址解析协议)响应。
调度算法
IPVS支持十种负载均衡调度算法:
轮询
加权轮询
最少连接
加权最少连接
最少队列调度
基于局部性的最小连接
带复制的基于局部性的最少连接
目标地址散列
源地址散列
最短期望延迟
部署LVS集群
使用ipvsadm管理集群
ipvsadm 是ipvs的命令行管理工具
概念介绍:
DS 负责负载均衡调度的LVS服务器
RS 负载均衡池中真实工作的服务器
DIP DS的IP地址
RIP RS的IP地址,
CIP 客户端主机的IP地址
VIP 虚拟服务器的IP地址,在DR模式下,DS与RS除了有自己的IP,同时还需要配置相同的VIP。
1.环境准备
主机名 IP地址 软件
lvs-lb01 192.168.178.251 lvs keepalived
lvs-lb02 192.168.178.252 lvs keepalived
lvs-web01 192.168.178.253 nginx(用做web展示)
lvs-web02 192.168.178.12 nginx(用在web展示)
2.改名
hostnamectl set-hostname lvs-lb01
hostnamectl set-hostname lvs-lb02
hostnamectl set-hostname lvs-web01
hostnamectl set-hostname lvs-web02
3.机器环境初始化,防火墙,基础命令,yum源等配置
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
reboot
getenforce
iptables -F
4.确保web01,web02可访问
web01:
yum install nginx -y
echo "web01 page" > /usr/share/nginx/html/index.html
nginx
[root@lvs-web01 ~]# curl 192.168.178.253
web01 page
web02:
yum install nginx -y
echo "web02 page" > /usr/share/nginx/html/index.html
nginx
[root@lvs-web02 ~]# curl 192.168.178.12
web02 page
配置lb01,
6.安装ipvsadm
查看是否支持ip_vs模块,默认是没有开启的
[root@lvs-lb01 ~]# lsmod ip_vs
Usage: lsmod
[root@lvs-lb01 ~]# lsmod |grep ip_vs
7.安装lvs管理工具
yum install ipvsadm -y
8.激活LVS内核
[root@lvs-lb01 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
9.检查系统模块支持
[root@lvs-lb01 ~]# lsmod | grep ip_vs
ip_vs 141432 0
nf_conntrack 133053 1 ip_vs
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
LVS搭建
开始搭建LVS
配置lvs负载均衡,在lb01上操作
1.绑定VIP地址,重启后消失
ip addr add 192.168.178.40 dev ens33
ip addr
2.清除当前所有LVS规则,-C参数,-h查看帮助
ipvsadm -C
3.设置连接超时时间,--set参数
--set tcp tcpfin udp set connection timeout values
ipvsadm --set 30 5 60
4.激活dr转发模式
-A 添加虚拟服务器
-t 指定虚拟服务器的IP端口
-s 指定调度算法
-p 指定超时时间
[root@lvs-lb01 ~]# ipvsadm -A -t 192.168.178.40:80 -s wrr -p 20
查看算法
[root@lvs-lb01 ~]# ipvsadm -h |grep wrr
--scheduler -s scheduler one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
5.将虚拟服务关联到真实服务,-a参数,也就是关联到web01/web02两台机器
ipvsadm -a -t 192.168.178.40:80 -r 192.168.178.253:80 -g -w 1
ipvsadm -a -t 192.168.178.40:80 -r 192.168.178.12:80 -g -w 1
-r 指定真实服务端IP端口
-g lvs的dr模式
-w 指定权重
6.查看lvs配置结果
[root@lvs-lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.178.40:80 wrr persistent 20
-> 192.168.178.12:80 Route 1 0 0
-> 192.168.178.253:80 Route 1 0 0
ipvsadm命令参数
**ipvsadm****参数说明:(**更多参照 man ipvsadm)
参数 | 名称 | 数说明 |
---|---|---|
-A | –add-service | 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。 |
-E | –edit-service | 编辑内核虚拟服务器表中的一条虚拟服务器记录。 |
-D | –delete-service | 删除内核虚拟服务器表中的一条虚拟服务器记录。 |
-C | –clear | 清除内核虚拟服务器表中的所有记录。 |
-R | –restore | 恢复虚拟服务器规则 |
-S | –save | 保存虚拟服务器规则,输出为-R 选项可读的格式 |
-a | –add-server | 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器 |
-e | –edit-server | 编辑一条虚拟服务器记录中的某条真实服务器记录 |
-d | –delete-server | 删除一条虚拟服务器记录中的某条真实服务器记录 |
**-L\ | -l** | –list显示内核虚拟服务器列表 |
-Z | –zero | 虚拟服务表计数器清零(清空当前的连接数量等) |
- | –set tcp tcpfin udp | 设置连接超时值 |
- | –start-daemon | 启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的VRRP 功能。 |
- | –stop-daemon | 停止同步守护进程 |
-h | –help | 显示帮助信息 |
-t | –tcp-service service-address [vip:port] or [real-server-ip:port] | 说明虚拟服务器提供的是tcp 的服务 |
-u | –udp-service service-address [vip:port] or [real-server-ip:port] | 说明虚拟服务器提供的是udp 的服务 |
-f | –fwmark-service fwmark | 说明是经过iptables 标记过的服务类型。 |
-s | –scheduler scheduler | 使用的调度算法,有这样几个选项rr\wrr\lc\wlc\lblc\lblcr\dh\sh\sed\nq默认的调度算法是: wlc |
-p | –persistent [timeout] | 持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300秒。 |
-M | –netmask netmask | persistent granularity mask |
-r | –real-server server-address | 真实的服务器[Real-Server:port] |
-g | –gatewaying | 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式) |
-i | –ipip | 指定LVS 的工作模式为隧道模式 |
-m | –masquerading | 指定LVS 的工作模式为NAT 模式 |
-w | –weight weight | 真实服务器的权值 |
- | –mcast-interface | interface 指定组播的同步接口 |
-c | –connection | 显示LVS 目前的连接 如:ipvsadm -L -c |
- | –timeout | 显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout |
- | –daemon | 显示同步守护进程状态 |
- | –stats | 显示统计信息 |
- | –rate | 显示速率信息 |
- | –sort | 对虚拟服务器和真实服务器排序输出 |
- | –numeric -n | 输出IP 地址和端口的数字形式 |
部署web01/web02(RS)
1.在lo坏换地址上绑定VIP,让rs机器能够接收到VIP的数据包,在lo回环地址上配置VIP可以完成,且只能配置在lo回环地址上,不能在ens33上,否则会造成arp缓存紊乱,导致lvs集群无法工作。
在web01和web02两台机器上操作
ip addr add 192.168.178.40/32 dev lo
2.抑制rs服务器的arp解析,anp安装: yum install net-tools -y
Linux查看arp缓存命令是arp -n
arp协议是地址解析协议,使用arp协议可实现通过IP地址获得对应主机的物理地址(mac地址)
Linux解析ip对应的mac地址
arping -c 1 -I ens33 192.168.178.253
实验环境中,因为客户端与ds,rs在同一个物理网段中,所以会有ARP问题。DS,RS都有相同的vip,当客户端需要访问VIP地址时,rs可能先于ds对arp解析进行抢答,这样客户端就直接于RS交互,DS就起不到负载均衡的作用了,所以要在rs的相应网络接口上禁用arp功能,禁用的命令如下:
arp的作用是根据IP地址获取mac地址:
在web01/web02是操作:
cat >>/etc/sysctl.conf<<EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF
让内核参数生效
sysctl -p
arp刷新
arping -I ens33 -c 1 -U 192.168.178.40 # 后面是VIP地址
测试结果:
[root@lvs-web01 ~]# curl 192.168.178.40
web01 page
[root@lvs-web02 ~]# curl 192.168.178.40
web02 page
lvs 结合 keepalived
lvs结合keepalived方案
之前的lvs虽然配置成功,也实现了负载均衡,但是微妙测试的时候发现,当某台真实的服务器把nginx停掉,director照样会把请求转发过去,这样造成了某些请求不正常。所以需要一种机制来检查真实服务器的状态,这时就可以使用keepalive.
keepalived的作用
keepalived是运行在lvs之上,它的主要功能是实现真实服务器的故障隔离以及director负载均衡间的failover(失败切换,故障转移)。
1.在lb01/lb02机器上安装keeplived
yum install keepalived -y
2.修改配置文件,lb01
养成修改配置文件前先备份的好习惯
cp /etc/keepalived/keepalived.conf{,.bak}
vim /etc/keepalived/keepalived.conf,修改如下:
! Configuration File for keepalived
#全局IP
global_defs {
router_id LVS_01
}
#实例配置
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.178.40/24
}
}
#虚拟服务器配置
virtual_server 192.168.178.40 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
#真实服务器一
real_server 192.168.178.12 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
#真实服务器二
real_server 192.168.178.253 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
修改lb02配置文件如下:
cp /etc/keepalived/keepalived.conf{,.bak}
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_02
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.178.40/24
}
}
virtual_server 192.168.178.40 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.178.12 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.178.253 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
启动keepalived服务,(启动前先关闭先前设置的ipvsadm,重启网络即可)
systemctl restart network
启动两个机器keepalived即可生成vip
systemctl start keepalived
systemctl status keepalived
检查虚拟ip是否生成
ip add |grep "inet 192"
[root@lvs-lb01 ~]# ip add |grep "inet 192"
inet 192.168.178.251/24 brd 192.168.178.255 scope global noprefixroute ens33
inet 192.168.178.40/24 scope global secondary ens33
[root@lvs-lb02 ~]# ip add |grep "inet 192"
inet 192.168.178.252/24 brd 192.168.178.255 scope global noprefixroute ens33
检查漂移,只有正确漂移,才能保证实验的准确。
[root@lvs-lb01 ~]# systemctl stop keepalived
[root@lvs-lb01 ~]#
[root@lvs-lb01 ~]#
[root@lvs-lb01 ~]# ip add |grep "inet 192"
inet 192.168.178.251/24 brd 192.168.178.255 scope global noprefixroute ens33
[root@lvs-lb02 ~]# ip add |grep "inet 192"
inet 192.168.178.252/24 brd 192.168.178.255 scope global noprefixroute ens33
inet 192.168.178.40/24 scope global secondary ens33
#重新启动vip又回到lb01机器
[root@lvs-lb01 ~]# systemctl start keepalived
[root@lvs-lb01 ~]# ip add |grep "inet 192"
inet 192.168.178.251/24 brd 192.168.178.255 scope global noprefixroute ens33
inet 192.168.178.40/24 scope global secondary ens33
配置lb02
yum install ipvsadm -y
检查ipvsadm的状态
[root@lvs-lb01 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP lvs-lb01:http wrr persistent 50
-> 192.168.178.12:http Route 1 0 0
-> 192.168.178.253:http Route 1 0 0
[root@lvs-lb02 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.178.40:http wrr persistent 50
-> 192.168.178.12:http Route 1 0 0
-> 192.168.178.253:http Route 1 0 0
在web01/web02上配置,命令修改只是临时生效,写入配置文件rc.local实现永久生效
抑制客户端arp解析
ip addr add 192.168.178.40/32 dev lo
修改内核参数,抑制arp响应
cat >>/etc/sysctl.conf<<EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF
sysctl -p
验证lvs+keepalived
访问lvs 192.168.178.40
[root@lvs-lb01 ~]# ip a | grep link/ether.*
link/ether 00:0c:29:89:18:cf brd ff:ff:ff:ff:ff:ff
[root@lvs-web01 ~]# arping -c 1 -I ens33 192.168.178.40
ARPING 192.168.178.40 from 192.168.178.253 ens33
Unicast reply from 192.168.178.40 [00:0C:29:89:18:CF] 1.526ms #解析到lb01的mac地址
Sent 1 probes (1 broadcast(s))
Received 1 response(s)
测试:如果lb01宕机,也不影响服务
[root@lvs-lb01 ~]# systemctl stop keepalived
可以解析到的mac地址02
[root@lvs-lb02 ~]# ip a | grep link/ether.*
link/ether 00:0c:29:19:43:23 brd ff:ff:ff:ff:ff:ff
[root@lvs-web01 ~]# arping -c 1 -I ens33 192.168.178.40
ARPING 192.168.178.40 from 192.168.178.253 ens33
Unicast reply from 192.168.178.40 [00:0C:29:19:43:23] 1.778ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)
至此lvs+keepalived搭建完成,即时RS,web/web02机器宕机,以及lb01/lb02宕机也不会出现无法访问的情况。
keepalived参数解释
参数解释
TCP方式
onnect_port 80 # 设置监控检查的端口
bindto <IPADD> # 设置健康检查的 IP 地址
connect_timeout 3 # 设置连接超时时间
nb_get_retry 3 # 设置重连次数
delay_before_retry 2 # 设置重连间隔
Virtual_server虚拟主机配置
关于 keeplived 的虚拟主机配置有三种如下所示
virtual server IP port
virtual server fwmark int
virtual server group string
以常用的第一种为例
virtual_server 192.168.1.2 80
含义: 设置一个 virtual server: VIP:Vport
delay_loop 3
含义: 设置 service polling 的 delay 时间即服务轮询的时间间隔
lb_algo rr|wrr|lc|wlc|lblc|sh|dh
含义: 设置 LVS 调度算法
lb_kind NAT|DR|TUN
含义: 设置 LVS 集群模式
persistence_timeout 120
含义: 设置会话保持时间秒为单位即以用户在 120 秒内被分配到同一个后端 realserver, 超过此时间就重新分配
persistence_granularity
含义: 设置 LVS 会话保持粒度 ipvsadm 中的 - M 参数默认是 0xffffffff 即每个客户端都做会话保持
protocol TCP
含义: 设置健康检查用的是 TCP 还是 UDP
ha_suspend
含义: suspendhealthchecker’s activity
virtualhost
含义: HTTP_GET 做健康检查时检查的 web 服务器的虚拟主机即 host 头
sorry_server
含义: 设置 backupserver 就是当所有后端 realserver 节点都不可用时就用这里设置的也就是临时把所有的请求都发送到这里
real_server
含义: 设置后端真实节点主机的权重等设置主要后端有几台这里就要设置几个
weight 1
含义: 设置给每台的权重 0 表示失效 (不知给他转发请求知道他恢复正常) 默认是 1
inhibit_on_failure
含义: 表示在节点失败后把他权重设置成 0 而不是冲 IPVS 中删除
notify_up |
含义: 设置检查服务器正常 (UP) 后要执行的脚本
notify_down |
含义: 设置检查服务器失败 (down) 后要执行的脚本
注: keepalived 检查机制说明
keepalived 健康检查方式有: HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
CP 还是 UDP
ha_suspend
含义: suspendhealthchecker’s activity
virtualhost
含义: HTTP_GET 做健康检查时检查的 web 服务器的虚拟主机即 host 头
sorry_server
含义: 设置 backupserver 就是当所有后端 realserver 节点都不可用时就用这里设置的也就是临时把所有的请求都发送到这里
real_server
含义: 设置后端真实节点主机的权重等设置主要后端有几台这里就要设置几个
weight 1
含义: 设置给每台的权重 0 表示失效 (不知给他转发请求知道他恢复正常) 默认是 1
inhibit_on_failure
含义: 表示在节点失败后把他权重设置成 0 而不是冲 IPVS 中删除
notify_up |
含义: 设置检查服务器正常 (UP) 后要执行的脚本
notify_down |
含义: 设置检查服务器失败 (down) 后要执行的脚本
注: keepalived 检查机制说明
keepalived 健康检查方式有: HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK