LVS是Linux Virtual Server的简写,意思是Linux虚拟服务器,它工作在input链上,当客户端发送的请求到达input链上以后,通过LVS的验证若是关于lvs的请求就会在此链上直接修改目标地址,而后通过postrouting链传送给其定义的服务器,LVS和iptables不能同时使用。
一、LVS的原理
1、NET的基本原理
把从客户端发来的IP包的IP头目的地址在DR上换成其中一台RS(real server)的IP地址并发至此RS,而RS则在处理完成后把数据经过DR主机发回给客户端,DR在这个时候再把数据包的源IP地址转换为DR接口上的IP地址即可,期间,无论是进来的数据还是出去的数据都必须经过DR。如下图所示:
LVS/NET 模型
NAT模式的特点:
- LB会修改数据包的地址
对于请求包,会进行DNAT;对于响应包,会进行SNAT。
- LB会透传客户端IP到RS(DR模式也会透传)
虽然LB在转发过程中做了NAT转换,但是因为只是做了部分地址转发,所以RS收到的请求包里是能看到客户端IP的。
- 需要将RS的默认网关地址配置为LB的浮动IP地址
因为RS收到的请求包源IP是客户端的IP,为了保证响应包在返回时能走到LB上面,所以需要将RS的默认网关地址配置为LB的虚拟服务IP地址。当然,如果客户端的IP是固定的,也可以在RS上添加明细路由指向LB的虚拟服务IP,不用改默认网关。
- LB和RS须位于同一个子网,并且客户端不能和LB/RS位于同一子网
因为需要将RS的默认网关配置为LB的虚拟服务IP地址,所以需要保证LB和RS位于同一子网。
又因为需要保证RS的响应包能走回到LB上,则客户端不能和RS位于同一子网。否则RS直接就能获取到客户端的MAC,响应包就直接回给客户端了,不会走网关,也就走不到LB上面了。这时候由于没有LB做SNAT,客户端收到的响应包源IP是RS的IP,而客户端的请求包目的IP是LB的虚拟服务IP,这时候客户端无法识别响应包,会直接丢弃。
2、DR的基本原理:
1)LVS调度器收到目标地址为VIP的请求包后,将MAC地址改成RS的MAC地址,并通过交换机(链路层)发给RS
2)RS的链路层收到请求后,往上传给IP层。IP层需要验证请求的目标IP地址。所以RS需要配置一个VIP的loopback(以下简称为lo,意为环回接口)device。这样RS的IP层收到报文后,会往上递交给传输层,之所以配置成lo,是因为lo对外不可见,不会跟LVS的VIP起冲突。
3)RS处理完成后,将应答包直接返回给客户端。若是公网服务器,则RS需要连接在互联网(公网IP或网关)才能将应答包返回。如下图所示:
LVS/DR 模型
DR模式的特点:
- 数据包在LB转发过程中,源/目的IP端口都不会变化
LB只是将数据包的MAC地址改写为RS的MAC地址,然后转发给相应的RS。
- 每台RS上都必须在环回网卡上绑定LB的虚拟服务IP
因为LB转发时并不会改写数据包的目的IP,所以RS收到的数据包的目的IP仍是LB的虚拟服务IP。为了保证RS能够正确处理该数据包,而不是丢弃,必须在RS的环回网卡上绑定LB的虚拟服务IP。这样RS会认为这个虚拟服务IP是自己的IP,自己是能够处理这个数据包的。否则RS会直接丢弃该数据包!
- RS上的业务进程必须监听在环回网卡的虚拟服务IP上,且端口必须和LB上的虚拟服务端口一致
因为LB不会改写数据包的目的端口,所以RS服务的监听端口必须和虚拟服务端口一致,否则RS会直接拒绝该数据包。
- RS处理完请求后,响应直接回给客户端,不再经过LB
因为RS收到的请求数据包的源IP是客户端的IP,所以理所当然RS的响应会直接回给客户端,而不会再经过LB。这时候要求RS和客户端之间的网络是可达的。
- LB和RS须位于同一个子网
因为LB在转发过程中需要改写数据包的MAC为RS的MAC地址,所以要能够查询到RS的MAC。而要获取到RS的MAC,则需要保证二者位于一个子网,否则LB只能获取到RS网关的MAC地址。
3、TUN的基本原理
TUN模式使用网络分层的原理,把从客户端发来的数据包基础上,封装一个新的IP头标记(不完整的IP头,只有目的IP部)发给RS,RS收到后先把DR发过来的数据包头给解开,还原其数据包原样,处理后,直接返回给客户端,而不需要再经过DR。需要注意的是由于RS需要对DR发过来的数据包进行还原,也就是说必须支持IP TUNNEL协议,所以在RS的内核中,必须编译支持IP TUNNEL这个选项。
4. FULLNAT模式
FULLNAT模式下,LB会对请求包和响应包都做SNAT+DNAT。
FULLNAT模式的特点:
- LB完全作为一个代理服务器
- LB和RS对于组网结构没有要求
二、LVS的类型有哪些?它们各有什么特点?
1)NAT:地址转换(类似DNAT)
集群节点跟director必须在同一个网络IP
RIP通常是私有地址,仅用于各集群节点间的通信
director位于client和realserver之间,并负责处理进出的所有通信
realserver必须将网关指向DIP
支持端口映射
realserver可以使用任意OS
较大规模应用场景中,director易成为系统瓶颈
2)DR:直接路由(只处理请求报文)
集群节点跟director必须在同一个物理网络中
RIP可以使用公网地址,实现便捷的远程管理和监控
director仅负责处理入站请求,响应报文则由realserver直接发往客户端;
realserver不能将网关指向DIR
不支持端口映射;
3)TUN:(隧道)
集群节点可以跨越互联网(Internet);
RIP必须是公网地址;
director仅负责入站请求,响应报文则由realserver直接发往客户端;
只有支持隧道功能的OS才能用于realserver;
不支持端口映射;
三、LVS调度算法
1、固定调度
四种静态的调度方法
rr:Round Robin,轮叫,轮询
wrr:Weight Round Robin,加权,考虑服务器本身权重的意义
sh:source hash,源地址hash,只要是来自于同一个客户
dh(Destination Hashing):目标地址散列,将相同的的请求发送给同一个IP
2、动态调度
六种动态调度方法:
1)lc:Least Connections,最少连接
active*256+inactive (谁的小,挑谁)
2)wlc:Weighted Least Connections,加权最少连接
(active*256+inactive)/weight
3)sed:最短期望延迟
(active+1)*256/weight
4)nq:never queue 永不排队
5)lblc:Locality-Based Least Connections,基于本地的最少连接
6(lblcr:Locality-Based Least Connections with Replication,基于本地的带复制功能的最少连接
默认方法(最理想的方法):wlc
四、管理集群服务的命令行工具ipvsadm
1、ipvsadm的几个重要功能:
1)管理集群服务
添加:-A -t|u|f service-address [-s scheduler]
-t:TCP协议的集群
-u:UDP协议的集群
service-address: IP:PORT
-f:FWM,防火墙标记
service-address: Mark Number
修改:-E
删除:-D -t|u|f service-address
eg:#ipvsadm -A -t 172.16.66.1:80 -s rr
2)管理集群服务中的RS
添加:-a -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-t|u|f service-address:事先定义好的某集群服务
-r server-address:某RS的地址,在NAT模型中,可使用IP:PORT实现端口映射
[-g|i|m]:LVS类型(若不指定则默认为DR)
-g:DR 表示DR模型
-i:TUN 能够跨越互联网的
-m:NAT 地址伪装
[-w weight]:定义服务器权重
修改:-e
删除:-d -t|u|f service-address -r server-address 指定从哪个集群服务中删除那个用户
eg:# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 -m
eg:# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.9 -m
3)查看
-L|l
-n: 数字格式显示主机地址和端口
--stats: 统计数据
--rate: 速率
--timeout: 显示tcp、tcpfin和udp的会话超时时长
--sort: 对查看的内容进行排序,默认是升序
--daemon:
-c: 显示当前的ipvs连接状况
4)删除所有集群服务
-C:清空ipvs规则
5)保存规则
-S
#ipvsadm -s > /path/to/somefile
6)载入此前的规则
-R
#ipvsadm -R < /path/form/somefile
五、LVS-NET的实现过程
1、首先规划好IP
Director Server(以下简称DR)DIP:192.168.66.1 VIP:172.16.66.2
Real Server 1 (以下简称RS1) DIP:192.168.66.2
Real Server 2 (以下简称RS2) DIP:192.168.66.3
2、配置RS1、RS2服务器
1)RS1服务器的配置过程:
RS1的IP配置为:192.168.66.2 网关是:192.168.66.1
wget ftp://172.16.0.1/pub/gls/server.repo -O /etc/yum.repos.d/server.repo
yum install httpd –y 安装web服务
提供相应的网页页面并启动web服务:
RS1的IP配置为:192.168.66.3 网关是:192.168.66.1
wget ftp://172.16.0.1/pub/gls/server.repo -O /etc/yum.repos.d/server.repo
yum install httpd –y 安装web服务
提供相应的网页页面并启动web服务:
3、配置Director服务器
1)在Director服务器上再要添加一块网卡eth1,其IP为DIP:192.168.66.1 则eth0为VIP,其IP为172.16.66.2(提醒:eth1网卡的连接方式是Host-only,RS1、RS2的网卡连接方式也是Host-only)
wget ftp://172.16.0.1/pub/gls/server.repo -O /etc/yum.repos.d/server.repo
2)同步时间
3)安装、启动ipvsadm并测试web服务是否能访问
yum install ipvsadm –y 安装ipvsadm
service ipvsadm start 启动ipvsadm
4)添加集群服务
(-m以nat模式运作)
5)ipvsadm –L –n ipvsadm规则查看
在物理主机上 访问172.16.66.2 刷新几次再执行ipvsadm –L –n命令就会发现InActConn比例接近1:1
六、LVS-DR的实现过程
1、首先划分好IP
Director:eth0,DIP:172.16.66.2 eth0:0,VIP:172.16.66.1
RS1: Eth0,RIP:172.16.66.7 lo:0,VIP:172.16.66.1
RS2: Eth0,RIP:172.16.66.8 lo:0,VIP:172.16.66.1
2、Director的IP、网卡配置过程
ifdown eth1 down Director的eth1断开连接
vim /etc/sysconfig/network-scrips/ifcfg-eth1 编辑文件内容修改如下:
service network restart 重启网络服务器
ifconfig eth0:0 172.16.66.1/16 为eth0配置一个别名
ifconfig 查看别名是否设置成功
把网卡的连接方式改为桥接,以下RS1、RS2的网卡也改成桥接,因为服务器间要在同一台交换机上
3、RS1、RS2的配置过程
1)RS1服务器的IP配置
vim /etc/sysconfig/network-scripts/ifcfg-eth0 设置IP和网关
service network restart 重启网络服务器
2)RS2服务器的IP配置
vim /etc/sysconfig/network-scripts/ifcfg-eth0 设置IP和网关
service network restart 重启网络服务器
测试能否ping通RS1和Director服务器
3)RS1服务的配置
cd /proc/sys/net/ipv4/conf/
(小知识补充:还可以用另外一种命令实现上述命令的执行过程
sysctl -w net.ipv4.conf.eth0.arp_announce=2
sysctl -w net.ipv4.conf.all.arp_announce=2 )
ifconfig lo:0 172.16.66.1/16 配置VIP
在物理主机上ping 172.16.66.1看看是否能ping通
Ping通后 可执行 arp -a 命令查看哪一个IP响应了
ifconfig lo:0 down 关闭VIP
ifconfig lo:0 172.16.66.1 broadcast 172.16.66.1 netmask 255.255.255.255 up (broadcast为广播地址,255.255.255.255意味着只跟自己在同一个网段内,全是网络地址)
route add -host 172.16.66.1 dev lo:0 添加路由
4)RS2服务的配置
配置RS2的VIP并启用
在物理主机上ping172.16.66.1 查看是否能ping通, 然后执行arp –a查看响应状态
ifconfig lo:0 down 关闭VIP
ifconfig lo:0 172.16.66.1 netmask 255.255.255.255 broadcast 172.16.66.1 up
(broadcast为广播地址,255.255.255.255意味着只跟自己在同一个网段内,全是网络地址)
ifconfig
route add -host 172.16.66.1 dev lo:0 添加路由
4、Directory服务的配置过程
1)添加路由并访问web服务
2)设置ipvsadm
3)打开浏览器访问一下 172.16.66.1 刷新出现两次RS1,一次RS2
ipvsadm -L -n (刷新查看一下权重比例为1:2)
这就是DR模型的LVS
小知识点:
arp_ignore:定义接收到ARP请求时的响应级别;
0:只要本地配置有相应的地址,就给予响应
1:仅在请求的目标地址配置请求到达的接口上的时候,才给予响应
arp_announce:定义将自己地址向外通告时的通告级别
0:将本地任何接口上的任何地址向外通告
1:试图仅向目标网络通告与其网络匹配的地址;
2:仅向与本地接口上的地址匹配的网络进行通告
本文出自 “show_only” 博客,请务必保留此出处http://10240214.blog.51cto.com/6634068/1202622