LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。
lvs:四层路由,四层交换
根据目标ip和port实现请求转发至后端的多个主机中的一个(根据挑选法则)
借助于netfilter
查看内核是否编译进来lvs命令
grep �Ci “ipvs” /boot/config-version,否则重新编译内核
lvs:
ipvsadm:用户空间用于转发规则的程序
ipvs:工作于内核空间的INPUT链根据规则完成请求调度的程序
支持的协议:TCP UDP SCTP AH ESP AH_ESP
lvs中常用术语
Director:主要作用类似于一个路由器,它含有完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给Server Array层的应用服务器(Real Server)上。同时,在Director Server上还要安装对Real Server服务的监控模块Ldirectord,此模块用于监测各个Real Server服务的健康状况
Real Server:Real Server可以是WEB服务器、MAIL服务器、FTP服务器、DNS服务器、视频服务器等
client ip:CIP
director ip:DIP
director virtual ip:VIP
real server ip:RIP
lvs类型
lvs-nat:
1、RS应用使用私有地址;RS的网关必须指向DIP;
2、请求和响应都要经过Director;高负载场景中,Director易成为性能瓶颈;
3、支持端口映射;
4、RS可以使用任意
5、RIP和DIP要在同一网段
lvs-dr:修改目标MAC,直接送给网卡驱动,目标MAC是基于调度方法选出某RS的网络接口的MAC地址
1、保证前端路由将目标地址为VIP的报文统统发往Directory,而不能是RS;
解决方案:
(1) 静态地址绑定:在前端路由器上操作
问题:未必有路由操作权限
(2) aprtables
(3) 修改RS上内核参数,将RS上的VIP配置在lo接口的别名上,并限制其不能响应对VIP地址解析请求;
2、RS可以使用私有地址;但也可以使用公网地址,此时可通过互联网通过RIP对其直接发起管理访问;
3、RS跟Directory必须在同一物理网络中;
4、请求报文经由Director,但响应报文必须不能经过Director;
5、不支持端口映射;
6、RS可以是大多数常见的OS;
7、RS的网关绝不允许指向DIP;
lvs-tun:不修改请求报文IP首部,通过隧道机制在IP首部外部再封装一个IP首部(sip:DIP,dip:RIP),进过网络发往服务器
1、RIP、VIP、DIP全部是公网地址;
2、RS的网关不会也不可能指向DIP;
3、请求报文经由Director,但响应报文必须不能经过Director;
4、不支持端口映射;
5、RS的OS必须支持隧道功能;
lvs-fullnat:
lvs scheduler:WLC默认调度算法
# grep -i 'VS' /boot/config-VERSION
静态方法:仅根据调度算法本身进行调度
rr: round robin,轮流,轮询,轮叫
wrr: weighted round robin, 加权轮询
sh: source hashing,源地址hash,表示来源于同一个CIP的请求将始终被定向至同一个RS;SESSION保持;
dh: destination hashing, 目标地址hash,
动态方法:根据算法及各RS当前的负载状况进行调度
lc: least connection,最少连接
Overhead=Active*256+Inactive
wlc: weighted lc
Overhead=(Active*256+Inactive)/weight
sed: shortest expection delay
Overhead=(Active+1)*256/weight
LVS调度基于定义的集群服务进行的。
定义集群服务
为集群添加各RS
ipvsadm用法:
管理集群服务:
ipvsadm -A|E -t|u|f service-address [-s scheduler]
ipvsadm -D -t|u|f service-address
-A:添加
-E:修改
-D:删除
-t:tcp协议
-u:udp协议
-f:FWM,防火墙标记,标记用数字表示,将多个端口绑定在一起定义成一个集群服务时使用
service-address:
-t|u: VIP:Port
-f: #
向一个已经存在集群服务添加一个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
-a:添加RS
-e:修改RS
-d:删除RS
-r server-address:RS的地址 ip[:port]port省略默认使用相同端口
-g:GATEWAY
-i:ipip
-m:MASQUERADE
-w:权重
查看已经定义的集群服务及RS:
ipvsadm -L -n
-c: 查看各连接
--stats: 统计数据
--rate: 速率
--exact: 精确值
清空所有的集群服务:
ipvsadm -C
保存集群服务定义:
ipvsadm -S > /path/to/some_rule_file
ipvsadm-save > /path/to/some_rule_file
让规则文件中的规则生效:
ipvsadm -R < /path/from/some_rule_file
ipvsadm-restore < /path/from/some_rule_file
RS: 配置内核参数
arp_ignore: 如何响应接收ARP地址请求;默认0;1表示仅在请求的地址配置在请求报文的接口进行响应;
arp_announce: 如何通告本地地址;默认0;2表示仅通过网络直连的接口的地址;
RS:首先配置内核参数
配置VIP时使用:
ifconfig lo:0 VIP netmask 255.255.255.255 broadcast VIP up
route add -host VIP dev lo:0
keepalived:
结合netfilter来实现一种集群服务定义机制;
(1) 在mangle表的PREROUTING链定义规则,实现指定防火墙标记;
# iptables -t mangle -A PREROUTING -d VIP -p {tcp|udp} --dport PORT -j MARK --set-mark #
(2) 基于此前的标记定义集群服务;
# ipvsadm -A -f # [-s METHOD]
# ipvsadm -a -f # -r RS [options]
功能:将同属于同一组应用的多个不同端口的服务定义成一个集群服务,统一调度;
lvs持久连接功能:
无论使用什么调度方法,持久连接功能都能保证在指定的一段时间内,来自同一个用户的请求始终被定向至同个RS;其调度基准为集群服务;
持久连接的类型:
PCC:
在基于tcp或udp定义集群服务时,其端口为0,格式为VIP:0,表示将来自于用户请求的任何一种请求(无论请求指定协议的哪个端口)统统转给后端的RS;基于持久连接时,来自于同一个Client的所有请求统统被转发至同一个RS;
ipvsadm �CA �Ct ip:0 �Cs rr �Cp 300
ipvsadm �Ca �Ct ip:0 �Cr rip �Cg -w
PPC:每端口持久
持久机制;单服务调度;各集群服务分开调度
PFM:单服务调度;可以通过防火墙标记将多个协议定义为同一个服务;
ipvs:对RS的健康状态检查可以借助于keepalived实现
检查思路:
1.IP:ICMP
2.传输层:端口开放状态
3.应用层:请求关键性资源
RS的健康状态检测:
1、自动上下线各RS;
如果状态发生了改变:
online --> fail
探测三次及以上;
offline --> ok
一次即可;
2、所有RS均故障时,应该提供一个back server;
如何检测RS的健康状态:
利用集群服务依赖的协议进行检测
利用端口扫描或探测类工具对指定协议的端口进行探测
在网络层探测