LVS :Linux Virtual Server,负载调度器,集成内核
官网:http://www.linuxvirtualserver.org/
角色
VS :Virtual Server,负责调度
RS :Real Server,负责真正提供服务
vs集群类型中的术语:
VS:Virtual Server、Director、Dispatcher(调度器)、Load Balancer
RS:Real Server(lvs)、upstream server(nginx)(业务服务器)、backend、server(haproxy)
CIP:Client IP(客户端)
VIP: Virtual serve IP VS服务器外网的IP
DIP: Director IP VS服务器内网的IP
RIP: Real server IP 业务服务器的IP
访问流程:CIP < -- > VIP == DIP < -- > RIP
工作原理:
LVS工作在OSI7层模型的第四层(传输层),在Linux工作在内核空间中,所以并不受到socket套接字上线的影响,调度能力非常强大。
LVS通过在VS服务器中防火墙的INPUT上设置规则来实现客户端请求的拦截和转发。
VS服务器根据请求报文的目标IP和协议及端口将其调度转发至某RS服务器,根据调度算法来挑选RS服务器
lvs集群的类型:
lvs-nat :修改请求报文的目标IP,多目标IP的DNAT
lvs-dr :操纵封装新的MAC地址
lvs-tun :在原请求IP报文之外新加一个IP首部
lvs-fullnat:修改请求报文的源和目标IP,(现阶段内核不支持)
LVS模式详解
LVS-NAT模式:
本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS服务器的RIP和PORT实现转发
1. RIP和DIP通常在同一个IP网络,推荐使用私网地址;RS的网关要指向DIP。
2. 请求报文和响应报文都必须经由Director(调度器)转发,但响应报文一般较大,所以Director(调度器)易于成为系统瓶颈(转发能力)
3. 支持端口映射,可修改请求报文的目标Port
4. VS服务器必须是Linux系统,RS服务器可以是任意OS系统
优点:集群中的RS服务器可以使用任何支持TCP/IP操作系统,只有VS调度器需要一个公网的IP地址,其他的RS服务器可以使用私有地IP地址。、
缺点:不适用于大型网路环境,由于请求报文和响应报文都必须由调度器转发,当后端RS服务器的数量达到20台以上时,调度器就会成为整个网络的瓶颈。
LVS-DR模式:
LVS-DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变
Director(调度器)和各RS都配置有VIP
-
确保前端路由器将目标IP为VIP的请求报文发往Director ,方法如下:
在前端网关做静态绑定VIP和Director的MAC地址(不推荐) 在RS上使用arptables工具,禁止RS响应arp广播 arptables -A IN -d $VIP -j DROP arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP 在RS上修改内核参数以限制arp通告及应答级别 arp_announce(通告) 0 可以在任意接口向外发送所有IP的免费ARP 1 尽量避免发送所在接口之外IP的免费ARP 2 只向外发送所在接口的IP的免费ARP arp_ignore(忽略) 0 可以响应所有配置的IP的ARP报文 1 只响应从入接口IP的ARP报文 8 不响应任何ARP请求
2.RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director(调度器)
3.RS和Director要在同一个物理网络
4.请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
5.不支持端口映射(端口不能修败)
6.RS可使用大多数OS系统
LVS-TUN模式
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)可以跨网络,可以不走来时的路由
1.DIP、VIP、RIP都应该是公网地址,DIP、RIP也可以是私网IP
2.RS的网关不能,也不可能指向DIP
3.请求报文要经由Director,但响应不能经由Director
4.不支持端口映射
5.RS的OS须支持隧道功能
LVS-FULLNAT模式
lvs-fullnat:通过同时修改请求报文的源IP地址和目标IP地址进行转发
CIP -- > DIP
VIP -- > RIP
1. VIP是公网地址RIP和DIP是私网地址,且通常不在同一IP网络,因此,RIP的网关一般不会指向DIP
2. RS收到的请求报文源地址是DIP,因此只需响应给DIP;但Director还要将其发往Client
3. 请求和响应报文都经由Director
4. 支持端口映射;
注意:此类型kernel默认不支持
LVS工作模式总结
lvs-nat与lvs-fullnat :请求和响应报文都经由 Director
lvs-nat :RIP的网关要指向DIP
lvs-fullnat :RIP和DIP未必在同一IP网络,但要能通信
lvs-dr与lvs- tun :请求报文要经由 Director,但响应报文由 RS直接发往Client
lvs-dr :通过封装新的MAC首部实现,通过MAC网络转发
lvs-tun :通过在原IP报文外封装新IP头实现转发,支持远距离通信
调度算法分为两种:静态方法和动态方法
静态方法:仅根据算法本身进行调度,容易造成处理请求比例的不公平
-
RR :roundrobin 轮询
-
WRR :Weighted RR 加权轮询,根据RS服务器性能来决定各服务器处理请求的比例
-
SH :Source Hashing 实现session sticky 源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
-
DH :Destination Hashing 目标地址哈希,将发往同一个目标地址的请求始终转发至第一次选中的RS服务器,典型使用场景是正向代理缓存场景中的负载均衡服务器。如:宽带运营商
动态方法:主要根据每RS当前的负载状态及调度算法进行调度,Overhead=value 较小的RS将被调度
activeconns:活动连接
inactiveconns:非活动连接
weight:权重
-
LC :least connections 根据服务器处理的请求数,适用于长连接应用
Overhead=activeconns*256+inactiveconns -
WLC :Weighted LC 默认调度方法
Overhead=(activeconns*256+inactiveconns)/weight -
SED :Shortest Expection Delay初始连接高权重优先
Overhead=(activeconns+1)*256/weight -
NQ :Never Queue 第一轮均匀分配,后续SED
-
LBLC :Locality-Based LC 动态的DH算法,针对第一次访问有效。使用场景:根据负载状态实现正向代理
-
LBLCR:LBLC with Replication 带复制功能的LBLC解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS
lvs管理工具: ipvsadm/ipvs
ipvsadm :用户空间的命令行工具,规则管理器,用于管理集群服务及RealServer(RS服务器)
ipvs :工作于内核空间netfilter的INPUT钩子上的框架
ipvs:
grep -i -C 10 "ipvs" /boot/config-VERSIONRELEASE.x86_64 #可以看到内核支持的算法
支持的协议:TCP、UDP、AH、ESP、AH_ESP、SCTP
ipvsadm:
程序包 :ipvsadm
Unit File : ipvsadm.service
主程序 :/usr/sbin/ipvsadm
规则保存工具:/usr/sbin/ipvsadm-save
规则重载工具:/usr/sbin/ipvsadm-restore
配置文件:/etc/sysconfig/ipvsad
ipvsadm命令:
核心功能:
集群服务管理:增、删、改
集群服务的RS管理:增、删、改,小写字母
查看
语法:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
管理集群服务:
ipvsadm -A,--add-service:为ipvs虚拟服务器添加一个虚拟服务,即添加一个需要被负载均衡的虚拟地址。虚拟地址需要是ip地址,端口号,协议的形式。
ipvsadm -E,--edit-service:修改
ipvsadm -D,--delete-service :-t|u|f service-address 删除
ipvsadm -C,--clear :清空
ipvsadm -R,--restore : 重载,从标准输入获取ipvsadm命令。一般结合下边的-S使用
ipvsadm -S,--save:[-n] 保存
增、改、删
增加
ipvsadm -A -t|u|f service-address [-s scheduler] [-p [timeout]]
修改
ipvsadm -E -t|u|f service-address [-s scheduler] [-p [timeout]]
删除:
ipvsadm -D -t|u|f service-address
-t,--tcp-service 指定虚拟服务为tcp服务。
-u,--udp-service 使用udp服务,其他同上。
-f,--fwmark-service integer: 可以通过这个命令实现把不同的虚拟IP、端口整合成一个虚拟服务,
可以让虚拟服务器同时截获处理去往多个不同地址端口的数据包。fwmark可以通过iptables命令指定。
如果用在ipv6需要加上-6
service-address[:port] 指定VIP的地址和端口 ,0表示任意端口。
[-s scheduler]:指定集群的调度算法,默认为wl,rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq
RS服务器
语法:ipvsadm -a|e -t|u|f service-address -r server-address [options] -g|m|i
ipvsadm -a,--add-service 添加一个RS服务器
ipvsadm -e,--edit-server 修改RS服务器
ipvsadm -d,--delete-server 删除RS服务器
ipvsadm -L|l [options] 列出虚拟服务表中的所有虚拟服务,可以指定VIP地址。
ipvsadm -Z [-t|u|f service-address] 清空计数器
--set tcp tcpfin udp 修改协议的超时时间。
--start-daemon state 设置虚拟服务器的备服务器,用来实现主备服务器冗余。注:该功能只支持ipv4
--stop-daemon 停止备服务器。
-r,--real-server 指定集群服务器地址,可以添加端口号。如果没有指定端口号,默认使用虚拟地址的端口号。
-p, --persistent [timeout]:设置持久连接,这个模式可以使来自客户的多个请求被送到同一个真实服务器。timeout 的默认值为360秒
-M, --netmask netmask:指定客户地址的子网掩码。用于将同属一个子网的客户的请求转发到相同服务器
指定RS服务器所使用的模式。需要对每个RS服务器分别指定模式。
-g,--gatewaying :使用直接路由,DR模式,此模式是默认模式。
-i,--ipip :使用ipip隧道模式。tun模式
-m,--masquerading :使用NAT模式。
-w,--weight : 设置权重。权重是0~65535的整数。如果将某个真实服务器的权重设置为0,那么它不会收到新的连接,但是已有连接还会继续维持。
-x, --u-threshold uthreshold:设置一个服务器可以维持的连接上限。0~65535。设置为0表示没有上限
-y, --l-threshold lthreshold:设置一个服务器的连接下限。当服务器的连接数低于此值的时候服务器才可以重新接收连接。如果此值未设置,则当服务器的连接数连续三次低于uthreshold时服务器才可以接收到新的连接。
--mcast-interface interface :指定使用备服务器时候的广播接口。
--syncid syncid :指定syncid 同样用于主备服务器的同步。默认=255
--pe engine 备用持续服务器可能是sip,默认情况下不设置。
以下选项用于查看命令:
-c,--connection 列出当前的连接。
--timeout 列出超时
--daemon 输出守护进程信息
--stats 统计信息
--rate 传输速率
--thresholds 列出阈值
--persistent-conn 持续连接
--sort 把列表排序。
--nosort 不排序
-n,--numeric 不对ip地址进行解析
--exact 显示精确数值
-6 如果fwmark用的是ipv6地址需要指定此选项。
使用 --rate选项是显示速率信息
CPS (current connection rate) 每秒连接数
InPPS (current in packet rate) 每秒的入包个数
OutPPS (current out packet rate) 每秒的出包个数
InBPS (current in byte rate) 每秒入流量(字节)
OutBPS (current out byte rate) 每秒入流量(字节)
使用 --stats选项是统计自该条转发规则生效以来的包
Conns (connections scheduled) 已经转发过的连接数
InPkts (incoming packets) 入包个数
OutPkts (outgoing packets) 出包个数
InBytes (incoming bytes) 入流量(字节)
OutBytes (outgoing bytes) 出流量(字节)
ipvs规则:/proc/net/ip_vs,ipvsadm 设置好的规则临时存放在这个文件中,重启失效。
ipvs连接连接数:/proc/net/ip_vs_conn
保存配置:建议保存至/etc/sysconfig/ipvsadm
ipvsadm-save > /PATH/TO/IPVSADM_FILE
ipvsadm -S > /PATH/TO/IPVSADM_FILE
systemctl stop ipvsadm.service
重载:
ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
ipvsadm -R < /PATH/FROM/IPVSADM_FILE
systemctl restart ipvsadm.service
实验:本次实验只演示NAT模式和DR模式
lvs-nat
环境
VS服务器:CentOS 7.3 1台
RS服务器:CentOS 6.9 2台
CentOS 6.9 RS1
CentOS 6.9-1 RS2
客户端 :CentOS 6.9 1台
CetnOS 6.9-2
VIP:172.16.253.63
DIP:192.168.166.130
RIP1:192.168.166.129
RIP2:192.168.166.132
客户端:172.16.253.36
设计要点:
(1) RIP与DIP在同一IP网络, RIP的网关要指向DIP
(2) 支持端口映射
(3) Director要打开核心转发功能
VS服务器配置,下面的一些参数请看上面的选项介绍。
[root@CentOS7.3 ~]#yum -y install ipvsadm #安装ipvsadm管理工具
[root@CentOS7.3 ~]#ipvsadm -A -t 172.16.253.63:80 -s rr #添加一个集群服务,服务端口tcp的80,采用rr轮询算法。
[root@CentOS7.3 ~]#ipvsadm -Ln #查看本机的lvs服务
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.253.63:80 rr #添加完成
[root@CentOS7.3 ~]#ipvsadm -a -t 172.16.253.63:80 -r 192.168.166.129 -m #添加一台RS服务器,使用NAT模式
[root@CentOS7.3 ~]#ipvsadm -a -t 172.16.253.63:80 -r 192.168.166.131 -m #添加一台RS服务器,使用NAT模式
[root@CentOS7.3 ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.253.63:80 rr
-> 192.168.166.129:80 Masq 1 0 0 #添加完成,添加的两台RS服务器都可以看到
-> 192.168.166.131:80 Masq 1 0 0
打开VS服务器的路由转发功能,使其可以转发数据包。
[root@CentOS7.3 ~]#sysctl -w net.ipv4.ip_forward=1 #临时开启
net.ipv4.ip_forward = 1
[root@CentOS7.3 ~]#vim /etc/sysctl.conf #打开这个文件把 net.ipv4.ip_forward = 1 写在里面永久开启
[root@CentOS7.3 ~]#sysctl -p #执行这条命令从文件中读取参数
net.ipv4.ip_forward = 1
RS1服务器配置
[root@CentOS6.9 ~]#yum -y install httpd #RS1安装httpd服务
[root@CentOS6.9 ~]#service httpd start #启动httpd服务
[root@CentOS6.9 ~]#ss -ntl #查看监听的端口
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 :::80 :::* #80端口已经监听
LISTEN 0 128 :::22 :::*
LISTEN 0 128 *:22 *:*
[root@CentOS6.9 ~]#echo Web1 > /var/www/html/index.html #写一个测试页面
[root@CentOS6.9 ~]#curl 192.168.166.129 #本机访问,测试
Web1
[root@CentOS6.9 ~]#iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT #添加防火墙策略允许访问80端口
RS2服务器配置和RS1基本相同
[root@CentOS6.9-1 ~]#echo Web2 > /var/www/html/index.html
[root@CentOS6.9-1 ~]#curl 192.168.166.131
Web2
客户端测试
[root@CentOS6.9-2 ~]#curl 172.16.253.63
Web1
[root@CentOS6.9-2 ~]#curl 172.16.253.63
web2
查看访问集群服务的统计数据
[root@CentOS7.3 ~]#ipvsadm -L --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP CentOS7.3:http 120 514 402 37357 42204
-> 192.168.166.129:http 60 271 244 21316 25429
-> 192.168.166.131:http 60 243 158 16041 16775
修改算法为wrr(带权重的轮询算法)
[root@CentOS7.3 ~]#ipvsadm -E -t 172.16.253.63:80 -s wrr #修改为wrr算法
[root@CentOS7.3 ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.253.63:80 wrr #修改成功
-> 192.168.166.129:80 Masq 1 0 0
-> 192.168.166.131:80 Masq 1 0 0
为RS服务器设置权重
[root@CentOS7.3 ~]#ipvsadm -e -t 172.16.253.63:80 -r 192.168.166.129 -m -w 2 #修改RS1的权重为2,RS2不修改
[root@CentOS7.3 ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.253.63:80 wrr
-> 192.168.166.129:80 Masq 2 0 0 #RS1的权重已被修改为2
-> 192.168.166.131:80 Masq 1 0 0 #RS2的权重还为默认值1
客户端测试
上图可以看到Web1和Web2的比例2比1。权重已经生效。
DR模式
lvs-dr:
dr模型中,各主机上均需要配置VIP,解决地址冲突的方式有三种:
(1) 在前端网关做静态绑定
(2) 在各RS使用 arptables
(3) 在各RS修改内核参数,来限制arp响应和通告的级别
限制响应级别:arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1: 仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
限制通告级别:arp_announce
0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告
2:必须避免将接口信息向非本网络进行通告
/proc/sys/net/ipv4/conf/ #所有网卡的设置都在这个目录下
ikernel-doc #这些文件由这个软件包生成
实验环境
环境
VS服务器:CentOS 7.3 1台
RS服务器:CentOS 6.9 2台
CentOS 6.9 RS1
CentOS 6.9-1 RS2
网关: CentOS 6.9 一台
CentOS 6.9.-2
客户端:CentOS 7.3 1台
CetnOS 7.3-1
VIP:172.16.253.63
DIP:192.168.166.130
RIP1:192.168.166.129
RIP2:192.168.166.132
网关内网IP:172.168.253.36(VS服务器的网关)、192.168.166.100(RS服务器的网关)
网关外网IP:100.0.0.100
客户端:100.0.0.6,客户机的网关指向 100.0.0.100
网关配置
[root@CentOS6.9-2 ~]#vim /etc/sysctl.conf #把这个文件中的net.ipv4.ip_forward = 1参数设置为1开启转发功能
[root@CentOS6.9-2 ~]#sysctl -p #重读配置文件
[root@CentOS6.9-2 ~]#iptables -F #清除防火墙规则
一块网卡上面配置多个IP地址
[root@CentOS6.9-2 ~]#cd /etc/sysconfig-network-scripts/
[root@CentOS6.9-2 network-scripts]#cp -a ifcfg-eth0 ifcfg-eth0:1 #复制eth0的网卡配置文件,改名的eth0:1
[root@CentOS6.9-2 network-scripts]#vim ifcfg-eth0:1 #配置文件的格式和eth0相同
DEVICE="eth0:1" #这里写配置文件的名字,一定要写对否则无法启动网卡
BOOTPROTO="static"
IPV6INIT="yes"
MTU="1500"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"
IPADDR=192.168.166.100 #这里写IP地址
PREFIX=24 #子网
GATEWAY=192.168.166.100 #网关
DNS=192.168.166.100 #DNS
配置VS服务器,VS可以把VIP和DIP设置在同一块网卡上面,多个IP绑定在一块网卡上请看上面。
[root@CentOS7.3 network-scripts]#ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.166.130 netmask 255.255.255.0 broadcast 192.168.166.255
inet6 fe80::50fe:a3f3:83a0:d38a prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:b9:7d:cb txqueuelen 1000 (Ethernet)
eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.253.63 netmask 255.255.0.0 broadcast 172.16.255.255
ether 00:0c:29:b9:7d:cb txqueuelen 1000 (Ethernet)
配置
[root@CentOS7.3 ~]#ipvsadm -A -t 172.16.253.63:80 -s wrr
[root@CentOS7.3 ~]#ipvsadm -a -t 172.16.253.63:80 -r 192.168.166.129 -g -w 2 #DR模式这里把 -m 换成 -g,其他的和NAT模式一样
[root@CentOS7.3 ~]#ipvsadm -a -t 172.16.253.63:80 -r 192.168.166.131 -g -w 6
[root@CentOS7.3 ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.253.63:80 wrr
-> 192.168.166.129:80 Route 2 0 0
-> 192.168.166.131:80 Route 6 0 0
配置RS1,把DIP的网关设置成路由器内网IP。Web配置和前面相同,
[root@CentOS6.9 ~]#ip a a 172.16.253.63/32 dev lo #在本机回环网卡上面设置一个临时IP地址,如果设置永久IP地址请写配置文件
[root@CentOS6.9 ~]#ip a show lo #查看配置
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet 172.16.253.63/32 scope global lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
[root@CentOS6.9 ~]#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #修改响应等级
[root@CentOS6.9 ~]#echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@CentOS6.9 ~]#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #限制通告
[root@CentOS6.9 ~]#echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
网友评论