LVS
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。
LVS是个负载均衡设备,它不提供任何服务,用户请求到这里的时候,它是将客户需求转发至后端真正提供服务的服务,所以说后端的服务称作real server。LVS分为两段,前一段称为ipvsadm(管理集群服务的命令行工具),后面一段叫做ipvs(内核模块)【提示:LVS和iptables不能同时使用】。
lvs实现的前提
Ipvs : 已经嵌入到linux的内核
IPVsadm:管理应用程序
负载均衡器
- 硬件:
- F5 BIG-IP
- Citrix NetScaler
- A10
- 软件
-
四层:tcp 之上的第四层协议
LVS:只能操作IP,端口 ,在操作系统内核中。
-
七层:http,ajp,https,(应用层)
- nginx
- haproxy
- httpd
-
调度方法
四种静态:
1. rr(Round Robin):轮询调度,轮叫调度
轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重新开始循环。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。==提示:这里是不考虑每台服务器的处理能力==
2. wrr:weight,加权(以权重之间的比例实现在各主机之间进行调度)
由于每台服务器的配置、安装的业务应用等不同,其处理能力会不一样。所以,我们根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。
3. Dh:Destination hashing:目标地址散列。把同一个IP地址的请求,发送给同一个server
目标地址散列调度算法也是针对目标IP地址的负载均衡,它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
4. sh:source hashing,源地址散列。主要实现会话绑定,能够将此前建立的session信息保留了
源地址散列调度算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的并且没有超负荷,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同。它的算法流程与目标地址散列调度算法的基本相似,除了将请求的目标IP地址换成请求的源IP地址,所以这里不一个一个叙述。
动态调度方法:
1. lc(Least-Connection):最少连接
最少连接调度算法是把新的连接请求分配到当前连接数最小的服务器,最小连接调度是一种动态调度短算法,它通过服务器当前所活跃的连接数来估计服务器的负载均衡,调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1,当连接中止或超时,其连接数减一,在系统实现时,我们也引入当服务器的权值为0时,表示该服务器不可用而不被调度。
简单算法:active*256+inactive(谁的小,挑谁)
2. wlc(Weighted Least-Connection Scheduling):加权最少连接。
加权最小连接调度算法是最小连接调度的超集,各个服务器用相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权限,加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。
简单算法:(active*256+inactive)/weight【(活动的连接数+1)/除以权重】(谁的小,挑谁)
3. sed(Shortest Expected Delay):最短期望延迟
基于wlc算法
简单算法:(active+1)256/weight 【(活动的连接数+1)256/除以权重】
4. nq(never queue):永不排队(改进的sed)
无需队列,如果有台realserver的连接数=0就直接分配过去,不需要在进行sed运算。
5. LBLC(Locality-Based Least Connection):基于局部性的最少连接
基于局部性的最少连接算法是针对请求报文的目标IP地址的负载均衡调度,目前主要用于Cache集群系统,因为Cache集群中客户请求报文的目标IP地址是变化的,这里假设任何后端服务器都可以处理任何请求,算法的设计目标在服务器的负载基本平衡的情况下,将相同的目标IP地址的请求调度到同一个台服务器,来提高个太服务器的访问局部性和主存Cache命中率,从而调整整个集群系统的处理能力。
基于局部性的最少连接调度算法根据请求的目标IP地址找出该目标IP地址最近使用的RealServer,若该Real Server是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。
6. LBLCR(Locality-Based Least Connections withReplication):带复制的基于局部性最少链接
带复制的基于局部性最少链接调度算法也是针对目标IP地址的负载均衡,该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度
IPVS实现负载均衡的方法
NAT:地址转换(类似于DNAT)
- 集群节点跟director必须工作在同一个IP的网络中
- RIP通常是私有地址,仅用于各集群节点间的的通信
- director位于client和real server之间,并负责处理进出的所有通道。
- realserver必须将网关执行DIP
- director支持端口映射
- realserver可以使用任何类型的操作系统(os)
- 较大规模应用场景中,director易成为系统瓶颈
- VIP:虚拟服务器地址
- DIP:转发的网络地址
- RIP:后端真实主机(后端服务器)
- CIP:客户端IP地址
DR:直接路由
- 各集群节点跟director必须在同一个物理网络中;
- RIP可以使用公网地址,实现便携的远程管理和监控;
- director仅负责处理入站请求,响应报文则有realserver直接发往客户端
- realserver不能将网关指向DIP,而是直接指向前端网关;
- director不支持端口映射
- 大多数操作系统能够用在realserver
- director能够处理更多的realserver
TUN:隧道
- 集群节点可以跨越Internet
- RIP必须是公网地址
- director仅负责处理入站请求,响应报文则由realserver直接发往客户端
- realserver网关不能指向director
- 只有咫尺隧道功能的OS才能用于realserver
- 不支持端口映射
==端口映射:端口映射就是将主机的IP地址的一个端口映射到局域网中一台机器,当用户访问这个IP的这个端口时,服务器自动将请求映射到对应局域网分机 (就这么简单)==
ipvsadm命令
管理集群服务
添加:-A -t|u|f service-address [-s scheduler]
-t: TCP协议的集群
-u: UDP协议的集群
service-address: IP:PORT
-f: FWM: 防火墙标记
service-address: Mark Number
-s:所选的调度策略
修改:-E
删除:-D -t|u|f service-address
# ipvsadm -A -t 172.16.100.1:80 -s rr
管理集群服务中的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类型
-g: DR
-i: TUN
-m: NAT
[-w weight]: 定义服务器权重
修改:-e
删除:-d -t|u|f service-address -r server-address
# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 –g
# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.9 -g
查看:
-L|l
-n: 数字格式显示主机地址和端口
--stats:统计数据
--rate: 速率
--timeout: 显示tcp、tcpfin和udp的会话超时时长
-c: 显示当前的ipvs连接状况
删除所有集群服务: -C:清空ipvs规则
保存规则: -S
# ipvsadm -S > /path/to/somefile
载入此前的规则:-R
# ipvsadm -R < /path/form/somefile
DR模式配置前须知
- VIP: 虚拟主机IP
- DIP: Director IP
- kernel parameter:
-
arp_ignore: 定义接收到ARP请求时的响应级别;
- 0:只要本地配置的有相应地址,就给予响应;
- 1:仅在请求的目标(MAC)地址配置请求到达的接口上的时候,才给予响应;
-
arp_announce:定义将自己地址向外通告时的通告级别;
- 0:将本地任何接口上的任何地址向外通告;
- 1:试图仅向目标网络通告与其网络匹配的地址;
- 2:仅向与本地接口上(MAC)地址匹配的网络进行通告;
-
LVS DR模式集群配置步骤
找一台主机作为DR(虚拟服务器),安装ipvsadm
Yum install ipvsadm
-
在DR设置两个IP地址:
- DIP: 192.168.35.134 ,设置静态IP--通过修改/etc/sysconfig/network-scripts/ifcfg-eth0里面的BOOTPROTO=STATIC
- VIP:192.168.35.234
ifconfig eth0:1 192.168.35.234/24
注:通过命令设置ip会在重启后失效
-
找多台机器作为RS( tomcat或者nginx )
- 两台:静态设置192.168.35.137、192.168.35.138
- 修改报文源IP的设置,需要设置内核参数
i. echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
ii. echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
iii. echo 2 > /proc/sys/net/ipv4/lo/eth0/arp_announce
iv. echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
- 在两台机器(RS)上,设置网卡的别名IP:192.168.35.234
- ifconfig lo:0 192.168.35.234 netmask 255.255.255.255 broadcast 192.168.35.234
- 在两台机器(RS)上,添加一个路由
- route add -host 192.168.35.234 dev lo:0
- DR上需要加一个路由设置:route add -host 192.168.35.234 dev eth0:1
- 在RS 检查web服务是否正常
- 在DR上使用ipvsadm添加集群服务
- ipvsadm –C
- ipvsadm -A -t 192.168.35.234:80 -s wlc
- ipvsadm -a -t 192.168.35.234:80 -r 192.168.35.137 -g -w 1
- ipvsadm -a -t 192.168.35.234:80 -r 192.168.35.138 -g -w 1
通过以下脚本可以实现内核参数以及realserverVIP的配置:
#!/bin/bash
#description : start realserver
VIP=125.38.38.64
/etc/rc.d/init.d/functions
case "$1" in
start)
echo " start LVS of REALServer"
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
;;
stop)
/sbin/ifconfig lo:0 down
echo "close LVS Directorserver"
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
编写脚本后给脚本x权限,执行时会出现如下错误
./test.sh: line 4: /etc/rc.d/init.d/functions: Permission denied
给/etc/rc.d/init.d/functions赋予执行权限即可;
chmod u+x /etc/rc.d/init.d/functions
再次执行,错误消失