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 模型
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 模型
3、TUN的基本原理
TUN模式使用网络分层的原理,把从客户端发来的数据包基础上,封装一个新的IP头标记(不完整的IP头,只有目的IP部)发给RS,RS收到后先把DR发过来的数据包头给解开,还原其数据包原样,处理后,直接返回给客户端,而不需要再经过DR。需要注意的是由于RS需要对DR发过来的数据包进行还原,也就是说必须支持IP TUNNEL协议,所以在RS的内核中,必须编译支持IP TUNNEL这个选项。
二、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 �Cy 安装web服务
提供相应的网页页面并启动web服务:
2)RS2服务器的配置过程
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 �Cy 安装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 �Cy 安装ipvsadm
service ipvsadm start 启动ipvsadm
4)添加集群服务
(-m以nat模式运作)
5)ipvsadm �CL �Cn ipvsadm规则查看
在物理主机上 访问172.16.66.2 刷新几次再执行ipvsadm �CL �Cn命令就会发现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 �Ca查看响应状态
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:仅向与本地接口上的地址匹配的网络进行通告