1. 概述
什么是LVS?
- LVS(Linux Virtual Server)Linux虚拟服务器,是一个虚拟的服务器集群系统
- 根据请求报文的目标IP和PORT将其转发至后端主机集群中的某一台主机
什么是集群?
- N台服务器集合在一起,提供一种服务,这个集合起来的群体就叫集群
LVS术语:
- CIP(Client IP):客户端IP
- VIP(Virtual IP):虚拟IP
- DR(Director):调度器
- DIP(Director IP):调度器IP
- RS(Real Server):真实服务器
- RIP(Real Server IP):服务器的真实IP
LVS有哪些工作模式?
- LVS-NAT:通过网络地址转换实现的虚拟服务器,大并发访问时,调度器的性能成为瓶颈
- LVS-DR:LVS的默认模式,通过修改请求报文的目标MAC地址进行转发
- LVS-TUN:不修改请求报文的ip首部,而是通过在原有的ip首部(CIP<–>VIP)之外再封装一个ip首部(DIP<–>RIP)
- LVS-FULLNAT:DR通过同时修改请求报文的目标地址和源地址进行转发
2. LVS-NAT模式
工作流程:
- 客户端通过CIP向VIP发送请求包,这个时候的请求包,源IP为CIP,目的IP为VIP
- DR收到请求后会拆包查看,发现目的IP为VIP,则会通过负载均衡的一种算法,选择集群中的一个RS真实服务器,这个时候的请求包,源IP为CIP,目的IP为RIP,将这个请求包发送给RS
- RS收到请求包后会处理请求,并将处理后的结果重新封装成一个响应包,由于RS上默认网关配置为DIP,这个时候的响应包源IP为RIP,目的IP为CIP,所以RS会将这个响应包发送给DR
- DR收到这个响应包后拆包查看,根据路由查找,发现目的 IP 不是本机 IP,且DR开启了转发模式因为目的IP为CIP,所以DR会做NAT地址转换,将源IP改为VIP,目的IP为CIP的格式封装成响应包,发送给客户端
LVS-NAT的特点:
- RS和DIP应该使用私网地址,且RS的网关要指向DIP
- 支持端口映射
- RS可以使用任意OS
- RS的RIP和Director的DIP必须在同一IP网络
LVS-NAT的缺点:
- 请求和响应报文都要经由DR转发,所以配置时需要将DR的转发功能开启,极高负载的场景中,DR可能会成为系统性能瓶颈
使用场景:
- 如果你是 windows 系统,使用lvs的话,则必须选择 NAT 模式了
配置步骤
环境:
环境 | 主机名 | IP |
---|---|---|
DR | node1 | 192.168.207.129 |
RS1 | node2 | 192.168.207.130 |
RS2 | node3 | 192.168.207.131 |
1. 在DR上配置DIP和VIP
//我这里已经配置了DIP
[root@node1 ~]# ip a s ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:97:c3:66 brd ff:ff:ff:ff:ff:ff
inet 192.168.207.129/24 brd 192.168.207.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe97:c366/64 scope link
valid_lft forever preferred_lft forever
//配置VIP
[root@node1 ~]# vi /etc/rc.d/rc.local
ip addr add 192.168.207.250 dev lo //添加此行
[root@node1 ~]# chmod +x /etc/rc.d/rc.local
2. 在RS上配置RIP,并将网关指向DIP
[root@node2 ~]# ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:2d:e0:d6 brd ff:ff:ff:ff:ff:ff
inet 192.168.207.130/24 brd 192.168.207.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe2d:e0d6/64 scope link
valid_lft forever preferred_lft forever
[root@node3 ~]# ip a s ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:f8:68:04 brd ff:ff:ff:ff:ff:ff
inet 192.168.207.131/24 brd 192.168.207.255 scope global ens33
valid_lft forever preferred_lft forever
[root@node2 ~]# route add -net 192.168.207.0 netmask 255.255.255.0 gw 192.168.207.129
[root@node3 ~]# route add -net 192.168.207.0 netmask 255.255.255.0 gw 192.168.207.129
3. 开启DR的IP转发功能
[root@node1 ~]# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1 //添加此行
[root@node1 ~]# sysctl -p
net.ipv4.ip_forward = 1
4. 在DR上添加并保存规则
[root@node1 ~]# ipvsadm -A -t 192.168.207.250:80 -s wrr
[root@node1 ~]# ipvsadm -a -t 192.168.207.250:80 -r 192.168.207.130:80 -m -w 2
[root@node1 ~]# ipvsadm -a -t 192.168.207.250:80 -r 192.168.207.131:80 -m -w 1
[root@node1 ~]# ipvsadm -S > /etc/sysconfig/ipvsadm
[root@node1 ~]# 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.207.250:80 wrr
-> 192.168.207.130:80 Masq 2 0 0
-> 192.168.207.131:80 Masq 1 0 0
5. 查看RS上的内容,并访问验证
[root@node2 ~]# cat /var/www/html/index.html
xixixixixixix
[root@node3 ~]# cat /var/www/html/index.html
hahahahahahaa
//这里随便找一台不是DR和RS的客户端访问就行
[root@192 ~]# for i in $(seq 10);do curl 192.168.207.250:80;done
xixixixixixix
xixixixixixix
hahahahahahaa
xixixixixixix
xixixixixixix
hahahahahahaa
xixixixixixix
xixixixixixix
hahahahahahaa
xixixixixixix
3. LVM-DR模式
工作流程:
- 客户端通过CIP向VIP发送请求包,这个时候的请求包源IP为CIP,目的IP为VIP
- DR收到这个请求包后会拆包查看,发现目的IP为VIP,则会通过负载均衡的一种算法,选择后端集群的一台RS真实服务器来处理这个请求,这个时候的请求包源目IP没有变,源MAC变成了DR上DIP网卡的MAC,目的MAC变成了RS上RIP网卡的MAC
- RS收到这个请求包后拆包查看,发现目的IP为VIP,自己的lo接口的IP就是VIP,所以会处理请求,并将处理后的结果封装成响应包,这个时候的响应包源IP为VIP,目的IP为CIP,然后RS会将这个响应包直接发送给客户端
LVS-DR的特点:
- 各RIP必须与DIP在同一个网络中(相同的广播域)
- RS的RIP可以使用私有地址,也可以使用公网地址
- 不支持支持端口映射
- RS可以使用必须为uninx操作系统(OS),且RS需要仰制arp,需要在loopback上配置vip
- DR仅负责处理入站请求,响应报文由RS直接发往客户端
- RS不能将网关指向DIP,而直接使用前端网关响应请求报文
保证前端路由器将目标IP为VIP的请求报文发送给director,解决方案有以下三种:
- 静态绑定
- arptables
- 修改RS主机内核的2个参数
- arp_announce:是否接收并记录别人的通告以及是否通告自己的mac地址给别人
- arp_ignore:是否响应arp请求
arp_announce有0,1,2三个可选值
- 0(default,默认值为0):通告自己所拥有的所有地址
- 1:尽量不通告与自己不在同一个网段的地址,尽量避免不在该网络接口子网段的本地地址做出arp回应.
- 2:总是不通告与自己不在同一个网段的地址,对查询目标使用最适当的本地地址,在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址
arp_ignore有0-8,9个可选值
- 0(default,默认值为0):回应任何网络接口上对任何本地IP地址的arp查询请求
- 1:请求报文从哪个接口进入的且请求的目标地址就是此接口配置的地址才予以响应,否则不响应只回答目标IP地址是来访网络接口本地地址的ARP查询请求
- 2:只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
- 3:不回应该网络接口的arp请求,而只对设置的唯一和连接地址做出回应
- 4-7:保留未使用
- 8:不回应所有(本地地址)的arp查询RS的RIP可以使用私有地址,也可以使用公网地址
使用场景:
- 如果对性能要求非常高,可以首选 DR 模式,而且可以透传客户端源 IP 地址
配置步骤
环境:
环境 | 主机名 | IP |
---|---|---|
DR | node1 | 192.168.207.129 |
RS1 | node2 | 192.168.207.130 |
RS2 | node3 | 192.168.207.131 |
1. 在DR上配置DIP和VIP
//我这里已经配置了DIP
[root@node1 ~]# ip a s ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:97:c3:66 brd ff:ff:ff:ff:ff:ff
inet 192.168.207.129/24 brd 192.168.207.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
//配置VIP
[root@node1 ~]# vi /etc/rc.d/rc.local
ip addr add 192.168.207.250 dev lo //添加此行
[root@node1 ~]# chmod +x /etc/rc.d/rc.local
2. 在RS上修改网卡内核参数
一定要先设置好内核参数在配置VIP,如果先配置VIP,VIP配置好后会立即通告给所有人,而修改内核参数就是为了不通告
[root@node2 ~]# vim /etc/sysctl.conf
//添加下面两行内容
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@node2 ~]# sysctl -p
[root@node3 ~]# vim /etc/sysctl.conf
//添加下面两行内容
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@node3 ~]# sysctl -p
3. 在RS上配置RIP和VIP
//RIP我这里已经配过了
[root@node2 ~]# ip a s ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:2d:e0:d6 brd ff:ff:ff:ff:ff:ff
inet 192.168.207.130/24 brd 192.168.207.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
[root@node3 ~]# ip a s ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:f8:68:04 brd ff:ff:ff:ff:ff:ff
inet 192.168.207.131/24 brd 192.168.207.255 scope global ens33
valid_lft forever preferred_lft forever
//配置VIP
[root@node2 ~]# ip addr add 192.168.207.250 dev lo
[root@node3 ~]# ip addr add 192.168.207.250 dev lo
4. 配置路由信息
[root@node1 ~]# route add -host 192.168.207.250 dev lo
[root@node2 ~]# route add -host 192.168.207.250 dev lo
[root@node3 ~]# route add -host 192.168.207.250 dev lo
5. 在DR上添加并保存规则
[root@node1 ~]# yum -y install ipvsadm
[root@node1 ~]# ipvsadm -A -t 192.168.207.250:80 -s wrr
[root@node1 ~]# ipvsadm -a -t 192.168.207.250:80 -r 192.168.207.130:80 -g
[root@node1 ~]# ipvsadm -a -t 192.168.207.250:80 -r 192.168.207.131:80 -g
[root@node1 ~]# ipvsadm -S > /etc/sysconfig/ipvsadm
[root@node1 ~]# 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.207.250:80 wrr
-> 192.168.207.130:80 Route 1 0 0
-> 192.168.207.131:80 Route 1 0 0
6. 在DR上配置httpd,并访问验证
[root@node2 ~]# yum -y install httpd
[root@node2 ~]# echo 'xixixixixi' > /var/www/html/index.html
[root@node2 ~]# systemctl start httpd
[root@node3 ~]# yum -y install httpd
[root@node3 ~]# echo 'hahahaha' > /var/www/html/index.html
[root@node3 ~]# systemctl start httpd
[root@192 ~]# for i in $(seq 10);do curl 192.168.207.250:80;done
xixixixixi
hahahaha
xixixixixi
hahahaha
xixixixixi
hahahaha
xixixixixi
hahahaha
xixixixixi
hahahaha
4. LVS-TUN模式
工作流程:
- 客户端通过CIP向VIP发送请求包,这个时候的请求包源IP为CIP,目的IP为VIP
- DR收到这个请求包后,会根据负载均衡算法选择一台后端集群中的一台RS真实服务器,利用ip tunnel技术将请求包 IP 头部前边额外增加了一个 IP 头(以 DIP 为源IP,RIP 为目的IP),将请求包发送给RS
- RS收到DR发过来的请求包后,ipip 模块将 tunnel 头部卸载,正常看到的源 IP 是 CIP,目的 IP 是 VIP,并且该IP包头的目标 IP (VIP)与本地 loopback 口地址匹配,于是处理这个报文。随后重新封装报文,通过自己的网关将响应报文直接发送给客户端
LVS-TUN的特点:
- RIP,DIP,VIP必须是公网地址
- RS的网关不能指向DIP
- 请求报文必须经由DR调度,但响应报文必须不能经由DR
- 不支持端口映射
- 需要在后端服务器安装配置 ipip 模块
- 需要在后端服务器 tunl0 配置 vip
- RS的OS必须支持隧道功能
使用场景:
- 如果对转发性能要求较高,且有跨机房需求,Tunnel 可能是较好的选择
5. LVS-FullNAT模式
工作流程:
- 客户端通过CIP向VIP发送请求包,这个时候的请求包,源IP为CIP,目的IP为VIP
- DR收到请求后会拆包查看,发现目的IP为VIP,则会通过负载均衡的一种算法,选择集群中的一个RS真实服务器,并对请求报文做full nat,源IP改为DIP,目标IP转换RIP,然后发往RS
- 这个时候请求包会经过路由器进行转发,与nat不同的是fullnat的后端集群中可以通过外网进行转发
- RS收到请求包后会处理请求,并将处理后的结果重新封装成一个响应包,发送给路由器,这个时候的响应包源IP为RIP,目的IP为DIP,由路由器转发给DR
- DR收到这个响应包后进行full nat,源地址改为VIP,目标地址改为CIP,发送给客户端
FullNAT的特点:
- VIP是公网地址,RIP和DIP是私网地址,RIP与DIP无须在同一网络中
- RS接收到的请求报文的源地址为DIP,因此要响应给DIP
- 请求报文和响应报文都必须经由Director
- 支持端口映射机制
- RS可以使用任意OS
6. LVS调度器算法
静态方法:仅根据算法本身进行调度
- RR:round robin,轮调
- WRR:weighted rr,加权的rr,根据一定的比例进行轮调,比如每次RS1给2个请求,RS2给1个请求
- SH:source hash,源地址hash,实现session保持的机制,将来自于同一个IP的请求始终调度至同一RS,每个服务单独调度
- DH:destination hash,目标地址hash,将对同一个目标(资源)的请求始终发往同一个RS
动态方法:根据算法及各RS的当前负载状态进行调度
- 根据指定的算法算出overhead(负载),最终挑选出overhead值最小的则为被选中的RS
- LC:Least Connection,最少连接数,算法如下:
overhead = Active * 256 + Inactive - WLC:Weighted LC,加权的LC,算法如下:
overhead=(Active*256+Inactive)/ weight - SED:Shortest Expection Delay,最短期望延迟,算法如下:
overhead = (Active + 1) * 256 / weight - NQ:Nevel Queue,是SED算法的改进,根据SED算法每台主机第一次至少要均分配一次,然后再按SED算法来挑选
- LBLC:Locality-Based LC,基于本地的最少连接数,即为动态的DH算法
- LBLCR:Locality-Based Least-Connection with Replication,带复制功能的LBLC算法
7. ipvsadm命令用法
ipvsadm:用户空间的命令行工具,用于管理集群服务
管理集群服务
语法:ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask]
ipvsadm -D -t|u|f service-address
常见的service-address:
tcp:-t ip:port
udp:-u ip:port
fwm:-f mark
-s scheduler:
默认为wlc
-p [timeout]:定义持久连接,timeout不指定时默认为300秒
管理集群服务中的RS
语法:ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
server-address:
ip[:port]
lvs-type:
-g:gateway,dr模式
-i:ipip,tun模式
-m:masquerade,nat模式
-w:设定权重,可为0到正无穷数值,设为0时不会被调度,默认为1权重值越大则表示性能越好,被调度的资源也会更多
清空和查看
ipvsadm -C 清空
ipvsadm -L|l [options] 查看
options:
-n:numeric,基于数字格式显示地址和端口
-c:connection,显示当前ipvs连接
--stats:统计数据
--rate:输出速率信息
--exact:显示精确值,不做单位换算
保存和重载
ipvsadm -R 重载
ipvsadm -S [-n] 保存
置零计数器
ipvsadm -Z [-t|u|f service-address]