lvs是什么?
lvs即linux virtual server,是LB(load balance)集群调度器的一种实现方法,是一种layer4 router,它能够根据目标地址、端口及调度方法,做出转发至哪一个后端的决策。
通常来讲,lvs由ipvs和ipvsadm两部分组成,ipvs工作于内核中,是lvs的核心组件,ipvsadm用于编、修改、保存规则。
ipvs工作于内核中,查看某redhat系列的系统是否支持此功能的方法是查看内核的编译参数。
如果没有ipvs相关的项目,则需要为内核打补丁,才能使该系统支持ipvs功能。redhat系列的系统上,2.6以上版本的内核,已经把此功能收录进去了。
lvs中常用的术语
Host:
Director:调度器
Real Server: RS,后端提供服务的主机
IP:
Client: CIP
Director Virtual IP: VIP(VIP也即客户端访问服务器时所使用的IP)
Directory IP: DIP
Real Server IP: RIP
调度方法
lvs的调度方法一共有十种。
静态方法:
RR:round-robin,轮询,来自客户端的请求会平均的分配给后端的每一台RS。
WRR:weightedround-robin,加权轮询,每一个RS会被分配一个权重,权重越大,表示承载能力越强,Director会根据权重分配相应比例的请求给RS。
SH:Source iphashing,源地址哈希,来自某一ip的请求会被定向至某一台RS。
某地址第一次访问时,director会把源地址抽取出来,并使用调度算法(RR或WRR)本身挑选RS,并把RS和源地址的对应关系记录下来(保存于director内部的哈希表中),之后客户端的访问会先根据哈希表挑选RS。
会话绑定:session stick,SH是实现会话绑定的一种方案。
DH:Destination iphashing,目标地址哈希。客户端访问某一固定URL时,director会选择某一固定的RS。
动态方法
LC:leastconnection
Overhead,当前RS的负载状态,数值小表示负载低。
overhead=Active*256+inactive
Director会分配请求给Overhead小的RS。
WLC:weightedleastconnection
overhead=(active*256+inactive)/weighted
没有显式指定调度方法时的默认调度方法。
SED:shortedexpection delay
Over=(Active+1)*256/weight
是对WLC的改进。
NQ:Neverqueue
每一个RS先分一个,之后的连接再根据SED算法进行调度
LBLC:local-Baseleast connection
可以理解为动态方式的DH,
尽量保证用户访问同一个地址的时候都定向至同一RS(跟缓存有关),当该RS压力过大时,会调度至其它的RS
LBLCR:replicatedLBLC
带复制的LBLC,当某一RS负载过大,请求被调度至其它RS时,跟Destination 相关的缓存同时也会被复制。
ipvsadm
ipvsadm是ipvs的规则编写工具。管理集群服务,管理集群服务中的RS,查看ipvs规则,
管理集群服务
创建或修改
ipvsadm -A|E -t|u|f service-address [-s scheduler]
-t:对于tcp承载的某协议服务。
-u:承载的应用层协议为基于UDP协议提供服务的协议。
-f:f表示Fire wall之意,承载的应用层协议为基于TCP或UDP协议提供服务的协议,但此类报文会经由iptables/netfilter打标记,即为防火墙标记。主要用于把两个不同端口的服务定义为一个。
-s:指明调度方法。
例如:ipvsadm -A -t 172.16.7.1:80 -s rr ipvsadm -E -t 172.16.7.1:80 -s wlc
删除:
ipvsadm -D -t|u|f service-address
ipvsadm -D -t 172.16.7.1:80
管理集群服务中的RS
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-r:指明RS,server-address格式一般为“IP[:PORT]”;注意,只支持端口映射的lvs类型中才应该显式定义此处端口
[-g|i|m]:指明lvs类型
-g:表示dr类型
-i:表示tun类型
-m:表示nat类型
当此选项省略是表示使用dr类型
-w:指明权重
ipvsadm -a -t 172.16.7.1:80 -r 192.168.7.2 -m -w 3
删除集群服务中的某一主机
ipvsadm -d -t 172.16.7.1:80 -r 192.168.7.2
清空所有集群服务的定义
ipvsadm -C
保存集群服务及RS的相关定义
ipvsadm -S > /etc/sysconfig/ipvsadm
ipvsadm-save > /etc/sysconfig/ipvsadm
service ipvsadm save
ipvsadm的配置文件/etc/sysconfig/ipvsadm.conf中定义了ipvs的规则保存于/etc/sysconfig/ipvsadm中。
恢复规则
ipvsadm -R < /etc/sysconfig/ipvsadm
ipvsadm-restore < /etc/sysconfig/ipvsadm
service ipvsadm start
查看规则
ipvsadm -L|l [options]
-c:列出当前所有connection
ipvsadm -Ln -c
--stats:列出统计数据
--rate: cps每秒钟的连接数,InPPS,入栈的报文数,OutPPS,出栈的报文数
-n:数字格式显示IP及端口
ipvsadm -Z:清空计数器
lvs的类型
lvs-nat
其中Director需要有两块网卡,VIP为公网地址,负责接收客户端发来的请求,DIP应该为私网地址,负责与RS通信,RIP1、RIP2、DIP应该在同一网段,RS1、RS2的网关需要指向DIP。
当client向director的VIP发出请求时,director会根据调度法则将请求报文的目标IP地址修改为后端某一个RS的IP,报文经由director的另外一块网卡(DIP)传送给RS,RS接收并处理后,响应报文的源地址为RIP,目标地址为CIP,因为RS的网关指向DIP,报文会通过DIP传输给director,此时,director会修改报文的报文的源地址为VIP,然后响应给client
连接并配置好主机后,在director这台主机执行
cat /proc/sys/net/ipv4/ip_forward
确认director主机已开启路由转发功能(可以通过编辑/etc/sysctl.conf文件来修改此参数)
ipvsadm -A -t 172.16.7.1:80 -s rr ipvsadm -a -t 172.16.7.1:80 -r 192.168.7.3 -m -w 2 ipvsadm -a -t 172.16.7.1:80 -r 192.168.7.2 -m -w 1