lvs是linux virtual server的简称,也就是linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在lvs已经是 linux标准内核的一部分,在linux2.4内核以前,使用lvs时必须要重新编译内核以支持lvs功能模块,但是从linux2.4内核以后,已经完全内置了lvs的各个功能模块,无需给内核打任何补丁,可以直接使用lvs提供的各种功能。
lvs:四层路由,四层交换
根据目标ip和port实现请求转发至后端的多个主机中的一个(根据挑选法则)
借助于netfilter
查看内核是否编译进来lvs命令
grep –i “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 –a –t ip:0 –s rr –p 300
ipvsadm –a –t ip:0 –r rip –g -w
ppc:每端口持久
持久机制;单服务调度;各集群服务分开调度
pfm:单服务调度;可以通过防火墙标记将多个协议定义为同一个服务;
ipvs:对rs的健康状态检查可以借助于keepalived实现
检查思路:
1.ip:icmp
2.传输层:端口开放状态
3.应用层:请求关键性资源
rs的健康状态检测:
1、自动上下线各rs;
如果状态发生了改变:
online --> fail
探测三次及以上;
offline --> ok
一次即可;
2、所有rs均故障时,应该提供一个back server;
如何检测rs的健康状态:
利用集群服务依赖的协议进行检测
利用端口扫描或探测类工具对指定协议的端口进行探测
在网络层探测