LVS介绍
LVS是Linux虚拟服务(Linux Virtual Server)的简称,是一个虚拟的服务器集群系统,是国内最早的一批自由软件项目,由章文嵩博士发起。现在LVS项目已经被Linux内核收录,成为Linux表针内核的一个重要组成部分。
随着互联网大潮的不断发展,纵向拓展的高额成本和逐渐降低的性能提升不足以满足用户的正常访问,因此横向拓展便成为主要的发展方向。通过使用LVS提供的负载均衡技术和Linux操作系统进而实现一个高性能,高可用的服务器集群,它具有着良好的可靠性,可拓展性和可操作性,从而能够以较低廉的成本价格来提供更好的性能提升。
LVS项目自从1998年提出开始,随机不断的发展,现在已经成为了一个相当成熟的技术项目。可以利用LVS技术来实现高度的可伸缩性和高可用性的网络服务;有效的可管理性提供了便捷的异地管理主机;价格的有效性实现了整个系统的经济性和成本的可控性。
1、NAT(网络地址转换)模式
NAT(Network Address Translation)是一种外网和内网地址映射的技术。每台Real Server的网关将是LVS服务器的地址,用户请求的数据进出都要经过LVS(所以它容易成为瓶颈)。当LVS服务器收到用户请求时会进行目标地址转换(DNAT),将请求IP修改为后端Real Server的IP,此时客户端IP不变,目标IP是RIP。Real Server响应用户请求时,需要再让LVS做源地址转换(SNAT),将返回的数据包源地址改为VIP。此时目标IP是客户端IP,而源IP是VIP,可以正常响应客户端请求。而对客户端来说仿佛是LVS进行的响应,无法感知到后端Real Server的存在。
NAT(网络地址转换)模式
NAT(Network Address Translation)是一种外网和内网地址映射的技术。每台Real Server的网关将是LVS服务器的地址,用户请求的数据进出都要经过LVS(所以它容易成为瓶颈)。当LVS服务器收到用户请求时会进行目标地址转换(DNAT),将请求IP修改为后端Real Server的IP,此时客户端IP不变,目标IP是RIP。Real Server响应用户请求时,需要再让LVS做源地址转换(SNAT),将返回的数据包源地址改为VIP。此时目标IP是客户端IP,而源IP是VIP,可以正常响应客户端请求。而对客户端来说仿佛是LVS进行的响应,无法感知到后端Real Server的存在。
image.png
NAT模式要注意
(1) RS应该和DIP应该使用私网地址,且RS的网关要指向DIP;
(2) 请求和响应报文都要经由director转发;极高负载的场景中,director可能会成为系统瓶颈;
(3) 支持端口映射;
(4) RS可以使用任意操作系统;
(5) RS的RIP和Director的DIP必须在同一IP网络;
#开启一个基于80端口的虚拟服务,调度方式为rr轮询方式
ipvsadm -A -t 192.168.137.144:80 -s rr
#配置web1服务后端real server 为nat工作方式(-m为nat模式) 权重为1
ipvsadm -a -t 192.168.137.144:80 -r 192.168.137.149 -m -w 1
#配置web1服务后端real server 为nat工作方式 权重为1
ipvsadm -a -t 192.168.137.144:80 -r 192.168.137.146 -m -w 1
#添加转发模式
echo 1 > /proc/sys/net/ipv4/ip_forward
DR(网络地址转换)模式
通过直接路由技术构建,调度和管理与之前两个相同,但是报文的转发方式不同,DR模型通过修改请求报文的MAC地址,将请求发送到real server上,real server在完成请求后直接将响应回应给用户,减少了IP隧道的成本,也不必要求必须支持隧道协议;但是要求调度器和real server都有一块网卡在同一物理网络中。同样DR模型也可以极大地 提高集群系统的伸缩性。
image.png
#!/bin/bash
# chkconfig: 2345 90 10
#LVS script for DR
. /etc/rc.d/init.d/functions
#LVS script for DR
. /etc/rc.d/init.d/functions
#虚拟ip
VIP=192.168.137.144
#服务器真实的ip
DIP=192.168.137.145
#后端处理业务服务
RIP1=192.168.137.147
#端口处理业务服务
RIP2=192.168.137.146
#端口
PORT=80
#!/bin/bash
# chkconfig: 2345 90 10
#LVS script for DR
. /etc/rc.d/init.d/functions
#虚拟ip
VIP=192.168.137.144
#服务器真实的ip
DIP=192.168.137.145
#后端处理业务服务
RIP1=192.168.137.147
#端口处理业务服务
RIP2=192.168.137.146
#端口
PORT=80
#
#description: hhahahah
case "$1" in
start)
#将vip绑定ens33:0上
/sbin/ifconfig ens33:0 $VIP broadcast $VIP netmask 255.255.255.255 up
#为vip绑定路由
/sbin/route add -host $VIP dev ens33:0
#转发
# Since this is the Director we must be able to forward packets
echo 1 > /proc/sys/net/ipv4/ip_forward
# 开启路由转发功能
# Clear all iptables rules.
/sbin/iptables -F
# Reset iptables counters.
/sbin/iptables -Z
# Clear all ipvsadm rules/services.
# 删除lvs的规则
/sbin/ipvsadm -C
# Add an IP virtual service for VIP 192.168.0.219 port 80
# In this recipe, we will use the round-robin scheduling method.
# In production, however, you should use a weighted, dynamic scheduling method.
#配置虚拟ip,调度算法为轮询
/sbin/ipvsadm -A -t $VIP:80 -s rr
# Now direct packets for this VIP to
# the real server IP (RIP) inside the cluster
#配置DR模式 -g DR模式 -w权重
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 1
;;
stop)
# Stop forwarding packets
echo 0 > /proc/sys/net/ipv4/ip_forward
# Reset ipvsadm
/sbin/ipvsadm -C
# Bring down the VIP interface
#/sbin/ifconfig ens33:0 down
# echo "ipvs is stopped..."
;;
*)
echo "Usage: $0 {start|stop}"
;;
esac
后端业务服务器,每个服务器配置都一致
#!/bin/bash
#
# Script to start LVS DR real server.
# chkconfig: - 90 10
# description: LVS DR real server
#
. /etc/rc.d/init.d/functions
VIP=192.168.137.144
host=`/bin/hostname`
case "$1" in
start)
# Start LVS-DR real server on this machine.
# /sbin/ifconfig lo:0 down
#/sbin/ifconfig lo:0 up
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
#只响应目的IP地址为接收网卡上的本地地址的arp请求
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
# 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
#配置所有网卡只响应自己接口上的ip的arp请求,其余的忽略。
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#必须避免将接口信息向非本网络进行通告
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
;;
stop)
# Stop LVS-DR real server loopback device(s).
#/sbin/ifconfig lo:0 down
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
;;
*)
# Invalid entry.
echo "$0: Usage: $0 {start||stop}"
exit 1
;;
esa
1、保证前端路由将目标地址为VIP报文统统发给Director Server(调度服务器),而不是RS
2、RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问
3、RS跟Director Server必须在同一个物理网络中
4、所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
5、不支持地址转换,也不支持端口映射
6、RS可以是大多数常见的操作系统
7、RS的网关绝不允许指向DIP
8、RS上的lo接口配置VIP的IP地址
调度算法(拷贝网上的资料,已经忘了拷贝的网址了,这么多的算法在实际生产中也就用了几个)
静态方法:仅根据算法本身进行调度;
RR:round robin,轮叫
“轮叫”调度也叫作“1:1”调度,调度器通过“轮叫”调度算法将外部用户请求顺序按照顺序1:1的分配到集群中的每个real server上,这种算法平等的对待每一台real server,不考虑不同机器的性能差异与系统当前的负载情况。
WRR:weighted rr, 加权轮叫
加权轮叫算法是根据real server的不同的处理性能来调度访问请求,可以对每台real server设置不同的权重值,对于性能好的机器可以设置较高的去权重值,而对于性能较弱的机器,设置较低的权重值,这样可以保证性能强的机器能够分配到较多的用户请求,性能较差的机器分配较少的用户请求,合理的利用现有的资源,同时,调度器还可以自动查询real server的负载情况,动态的进行权重来进行合理的分配资源。
SH: source hash, 实现session保持的机制;将来自于同一个IP的请求始终调度至同一RS;
“源地址散列“调度算法根据用户请求的来源地址,作为散列键(Hash key)从静态分配的散列表内找出相对应的服务器,若被找出的服务器是可用且未超载,则调度器将请求发送到这台服务器否则返回空。
DH:destination hash, 将对同一个目标的请求始终发往同一个RS;
“目标地址散列”调度算法,调度器根据请求的目标IP地址,作为散列键从静态分配的散列表中找出对应的服务器,若被找出的服务器是可用且未超载,则将请求发送到这台服务器。
动态方法:根据算法及各RS的当前负载状态进行调度;
Overhead=当前负载状态
LC:Least Connection 最少连接数
Overhead=Active256+Inactive
“最少连接数”调度算法动态的将网络请求调度到已经建立的连接数最少服务器上,假设集群中的服务器都具有相近的运算性能,那么使用“最小连接数”调度算法可以很好的去均衡集群的负载。
WLC: Weighted LC 加权最少连接
Overhead=(Active256+Inactive)/weight
“加权最少连接”调度算法是“最少连接”算法的进一步优化,每个处理节点可以设置不同的权重值来表示其不同的处理性能,网络管理人员可以动态调整这些权值。默认值是1.加权最小连接调度算法在调度时候尽可能的去调度服务节点与权重值成正向比例。
SED: Shortest Expection Delay 最短期望延迟
Overhead=(Active+1)*256/weight
NQ:Never Queue 永不排队
“永不排队”调度算法在负载较低时,会将请求直接分配到空闲的服务器之上,不会进行额外的算法调度,当整个集群负载较高时,则会进行轮叫。SED算法的改进;
LBLC:Locality-Based LC,即为动态的DH算法;
正向代理情形下的cache server调度;
“基于局部的最少连接”调度算法,本质上是为了实现基于目标IP地址的负载均衡。这个算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器可用且未超载,那么进行调度;假如服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务 器,将请求发送到该服务器。
LBLCR:Locality-Based Least-Connection with Replication,带复制功能的LBLC算法;
"带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,应用与LBLC相同,不同之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务 器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一 台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
网友评论