首先,了解下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 -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 生效