首先,了解下LVS的工做原理,LVS有三种工做模式,分别是NAT, TUN和DR,调度算法上LVS有十种调度算法,分别是rr, wrr, lc, wlc, lblc, lblcr, dh, sh, sed, nq,工做模式和调度算法能够根据本身需求进行设置。
LVS三种工做模式:算法
- NAT 地址转换
原理:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发至此RS来处理,RS处理完成后把数据交给通过负载均衡器,负载均衡器再把数据包的原IP地址改成本身的IP,将目的地址改成客户端IP地址便可。期间,不管是进来的流量,仍是出去的流量,都必须通过负载均衡器。优势:集群中的物理服务器可使用任何支持TCP/IP操做系统,只有负载均衡器须要一个合法的IP地址。
缺点:扩展性有限。当服务器节点(普通PC服务器)增加过多时,负载均衡器将成为整个系统的瓶颈,由于全部一的请求包和应答包的流向都通过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢。
- TUN 隧道
原理:隧道模式就是,把客户端发来的数据包,封装一个新的IP头标记(仅目的IP)发给RS,RS收到后,先把数据包的头解开,还原数据包,处理后接返回给客户端,不须要再通过负载均衡器。注意,因为RS须要对负载均衡器发过来的数据包进行还原,因此说必须支持IP Tunneling协议。因此,在RS的内核中,必须编译支持IPTUNNEL这个选项。
优势:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。因此,减小了负载均衡器的大量数据流动,负载均衡器再也不是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器可以为不少RS进行分发。并且跑在公网上就能进行不一样地域的分发。
缺点:隧道模式的RS节点须要合法IP,这种方式须要全部的服务器支持IP Tunneling(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。
- DR 直接路由
原理:负载均衡器和RS都使用同一个IP对外服务。但只有DR对ARP请求(根据IP获取Mac地址请求)进行响应,全部RS对自己这个IP的ARP请求保持静默。也就是说,网关会把对这个服务IP的请求所有定向给DR,而DR收到数据包后根据调度算法,找出对应的RS,把目的MAC地址改成RS的MAC(由于IP一致)并将请求分发给这台RS。这时RS收到这个数据包,处理完成以后,因为IP一致,能够直接将数据返给客户,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。因为负载均衡器要对二层包头进行改换,因此负载均衡器和RS之间必须在一个广播域,也能够简单的理解为在同一台交换机上。
优势:和TUN(隧道模式)同样,负载均衡器也只是分发请求,应答包经过单独的路由方法返回给客户端。与TUN相比,DR这种实现方式不须要隧道结构,所以可使用大多数操做系统作为物理服务器。
缺点:要求负载均衡器的网卡必须与物理网卡在一个物理段上。
三种工做模式中,NAT限制最小,同时效率也是最低的,TUN和DR两种效率比较高,DR效率最高,不过DR要求在局域网中,通常推荐使用DR模式。
LVS提供和十种调度算法:后端
- rr 轮询(Round Robin)
调度器经过“轮询”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而无论服务器上实际的链接数和系统负载。
- wrr 加权轮询(Weighted Round Robin)
调度器经过“ 加权轮询”调度算法根据真实服务器的不一样处理能力来调度访问请求。这样能够保证处理能力强的服务器处理更多的访问流量。调度器能够自动问询真实服务器的负载状况,并动态地调整其权值。
- lc 最少连接(Least Connections)
调度器经过“最少链接”调度算法动态地将网络请求调度到已创建的连接数最少的服务器上。若是集群系统的真实服务器具备相近的系统性能,采用"最小链接"调度算法能够较好地均衡负载。
- wlc 加权最少连接(Weighted Least Connections)
在集群系统中的服务器性能差别较大的状况下,调度器采用“加权最少连接”调度算法优化负载均衡性能,具备较高权值的服务器将承受较大比例的活动链接负载。调度器能够自动问询真实服务器的负载状况,并动态地调整其权值。
- lblc 于局部性的最少连接(Locality-Based Least Connections)
“基于局部性的最少连接” 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工做负载,则用"最少连接"的原则选出一个可用的服务器,将请求发送到该服务器。
- lblcr 带复制的基于局部性最少连接(Locality-Based Least Connections with Replication)
“带复制的基于局部性最少连接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不一样之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按"最小链接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小链接"原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以下降复制的程度。
- dh 目标地址散列(Destination Hashing)
“目标地址散列”调度算法根据请求的目标IP地址,做为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,不然返回空。
- sh 源地址散列(Source Hashing)
“源地址散列”调度算法根据请求的源IP地址,做为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,不然返回空。
- sed 最短时间望延迟 (Shortest Expected Delay)
sed算法基于wlc算法,只是在wlc上作了微调,(活动链接数 + 1)x 256 / 权重。
- nq 永不排队(never queue)
无需队列,若是有台realserver的链接数=0就直接分配过去,不须要在进行sed运算。
管理集群服务:服务器
- 添加或者修改配置
-A|E -t|u|f service-address [-s scheduler]
-t:tcp协议的集群服务 -u:udp协议的集群 -f:FWM:防火墙标记
-s: rrr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq
ipvsadm -A t 192.168.1.100:80 –s rr
ipvsadm -E t 192.168.1.100:80 –s rr
- 删除配置
-D -t|u|f service-address
ipvsadm -D -t 192.168.100:80
- 清除配置
ipvsadm -C
- 保存配置
ipvsadm -S > file
- 载入配置
ipvsadm -R < file
- 查看配置
ipvsadm -L
管理集群服务中的RS:网络
- 添加或者修改RS
-a|e virtual-service -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower]
-g: DR -i: TUN -m: NAT
ipvsadm -a -t 192.168.1.100 -r 192.168.1.101 -g
ipvsadm -a -t 192.168.1.100 -r 192.168.1.102 -g
- 删除RS
-d -t|u|f service-address -r server-address
ipvsadm -d -t 192.168.1.100 -r 192.168.1.101
搭建过程:并发
首先,咱们选择DR工做模式和rr调度算法。Linux内核从2.6.x起已经支持LVS,因此只须要安装ipvsadm管理便可,具体步骤以下:负载均衡
- 安装配置ipvsadm
apt-get install ipvsadm
dpkg–reconfigure ipvsadm
- 建立vip进行广播
vip = 192.168.100 (用于广播)
dip = 192.168.101 (用于实现HA)
rip = 192.168.1.102
ifconfig eth0:0 192.168.1.100 netmask 255.255.255.0
// 配置虚拟外网网卡,并设置vip和netmask,正常对外工做
- 建立集群
ipvsadm -A -t 192.168.1.100:80 –s rr
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.102:80 -g
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.103:80 -g
ipvsadm -S
- 修改sysctl.conf
net.ipv4.ip_forward=0
net.ipv4.conf.all.send_redirects=1
net.ipv4.conf.default.send_redirects=1
net.ipv4.conf.eth0.send_redirects=1
sysctl -p 生效
- RS配置 sudo ifconfig lo:0 192.168.1.100 netmask 255.255.255.255 // 配置虚拟网卡,网卡必须是lo,netmask必须为255.255.255.255,不然会响应客户端的arp 修改/etc/sysctl.conf // DR的原理就是限制RS ARP响应,ARP用到就是广播 net.ipv4.conf.all.arp_ignore=1 // 只对本身网卡地址作ARP响应 net.ipv4.conf.all.arp_announce=2 // 只携带外网网卡地址做为原地址发送ARP请求 sysctl –p 生效