负载均衡集群解决方案 (一)LVS-DR

简介:

LVS的工作机制以及其调度算法等一些初步了解在我之前的文章里面已有记录。请看这里

LVS其工作机制类似iptabls,一部分工作在用户空间(ipvsadmin),一部分工作在内核空间;用户空间:用于定义一些负载均衡的对象与策略,例如对TCP协议的80端口进行持久连接的负载,又或者对TCP协议的3306端口的连接进行负载等一些符合个人需求的一些规则定义
内核空间:用于针对用户空间中所定义的规则对符合要求的数据包进行转发
 
在整个负载均衡的架构中,所有的角色都使用了一个额外的IP地址---VIP,当一个客户端向VIP发起请求时,此请求必须直接连接至Directory,而不能是后端的realserver。否则的话此负载均衡的架构就毫无任何意义了。
因此,在客户端发出至VIP的连接请求后,只能由Directory将其MAC地址响应给客户端或网络中的路由设备。而Directory将会根据用户所定义的负载规则将该请求按照所定义的某种调度算法转发至后端的realserver了。
如果客户端在请求建立至VIP的连接时由后端的realserver响应了其请求,那么客户端会在其MAC地址表中建立起一个VIP与响应其请求的realserver的MAC的对应关系,用以以后的通信,而此刻在客户端看来只有一个realserver而无法意识到其他服务器的存在,为了避免这种情况的发生,结合实际情况解决方案有四:

1、禁止RealServer响应对VIP的ARP请求;
2、在RealServer上隐藏VIP,以使得它们无法获知网络上的ARP请求;
3、基于“透明代理(Transparent Proxy)”或者“fwmark (firewall mark)”;
4、禁止ARP请求发往RealServers;

在Linux内核2.4.26以后引入了两个新的调整ARP栈的标志:
arp_announce:当向别人通告自己的MAC时所采取的限制级别
arp_ignore:在响应别人的ARP广播请求时,所使用的不同的模型
 
arp_announce类型:
0--default,使用本地的任何地址,向外通告
1--当本机具有多个IP地址时,试图向同一网段的通告
2--一定使用同一网段的IP进行通告
 
arp_ignore类型:
0--default,无论是本机的IP地址,就会用任意接口进行响应
1--只响应直接请求的网卡的地址是目标地址


初步了解了以上,就可以动手LVS-DR模型的搭建了:
 
环境介绍:
系统:RHEL5
DIP:172.23.136.139
RS1:172.23.136.149
RS2:172.23.136.148
VIP:172.23.136.150



(一)、Directory的配置
1、使用ipvsadm进行负载均衡的实现,早期需要重新编译内核,不过现在版本的redhat默认已经直接做进内核。
##查看内核是否已经支持ipvs
modprobe ip_vs
cat /proc/net/ip_vs
 
2、安装ipvsadm
yum install ipvsadm -y
并启动ipvsadm
service ipvsadm start
第一次启动会报一个No such file or directory的错误,因为lvs和iptables都是可以讲用户所配置的规则保存在一个文件中,当系统重启或者服务重启后都会重读这个规则文件,已达到规则永久有效的目的。由于是第一次启动并未定义规则,所以这个规则文件是不存在的,在服务启动时重读这个文件时就报错了。
 
3、启动ipvs脚本:
service ipvs start
 
     
  1. #!/bin/bash 
  2. # 
  3. # LVS script for VS/DR 
  4. # 
  5. . /etc/rc.d/init.d/functions 
  6. # 
  7. VIP=172.23.136.150 
  8. RIP1=172.23.136.149 
  9. RIP2=172.23.136.148 
  10. PORT=80 
  11.  
  12. # 
  13. case "$1" in 
  14. start)            
  15.  
  16.   /sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up 
  17.   /sbin/route add -host $VIP dev eth0:1 
  18.  
  19. # Since this is the Director we must be able to forward packets 
  20.   echo 1 > /proc/sys/net/ipv4/ip_forward 
  21.  
  22. # Clear all iptables rules. 
  23.   /sbin/iptables -F 
  24.  
  25. # Reset iptables counters. 
  26.   /sbin/iptables -Z 
  27.  
  28. # Clear all ipvsadm rules/services. 
  29.   /sbin/ipvsadm -C 
  30.  
  31. # Add an IP virtual service for VIP 172.23.136.150 port 80 
  32. # In this recipe, we will use the round-robin scheduling method.  
  33. # In production, however, you should use a weighted, dynamic scheduling method.  
  34.   /sbin/ipvsadm -A -t $VIP:80 -s wlc 
  35.  
  36. # Now direct packets for this VIP to 
  37. # the real server IP (RIP) inside the cluster 
  38.   /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1 
  39.   /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 2 
  40.  
  41.   /bin/touch /var/lock/subsys/ipvsadm &> /dev/null 
  42. ;;  
  43.  
  44. stop) 
  45. # Stop forwarding packets 
  46.   echo 0 > /proc/sys/net/ipv4/ip_forward 
  47.  
  48. # Reset ipvsadm 
  49.   /sbin/ipvsadm -C 
  50.  
  51. # Bring down the VIP interface 
  52.   /sbin/ifconfig eth0:1 down 
  53.   /sbin/route del $VIP 
  54.    
  55.   /bin/rm -f /var/lock/subsys/ipvsadm 
  56.    
  57.   echo "ipvs is stopped..." 
  58. ;; 
  59.  
  60. status) 
  61.   if [ ! -e /var/lock/subsys/ipvsadm ]; then 
  62.     echo "ipvsadm is stopped ..." 
  63.   else 
  64.     echo "ipvs is running ..." 
  65.     ipvsadm -L -n 
  66.   fi 
  67. ;; 
  68. *) 
  69.   echo "Usage: $0 {start|stop|status}" 
  70. ;; 
  71. esac 


(二)、RealServer端配置
在各个realserver端分别运行ipvsclient脚本,脚本内容如下:

 
     
  1. #!/bin/bash 
  2. # 
  3. # Script to start LVS DR real server. 
  4. # description: LVS DR real server 
  5. # 
  6. .  /etc/rc.d/init.d/functions 
  7.  
  8. VIP=172.23.136.150 
  9. host=`/bin/hostname` 
  10.  
  11. case "$1" in 
  12. start) 
  13.        # Start LVS-DR real server on this machine. 
  14.         /sbin/ifconfig lo down 
  15.         /sbin/ifconfig lo up 
  16.         echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore 
  17.         echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
  18.         echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
  19.         echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
  20.  
  21.         /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up 
  22.         /sbin/route add -host $VIP dev lo:0 
  23.  
  24. ;; 
  25. stop) 
  26.  
  27.         # Stop LVS-DR real server loopback device(s). 
  28.         /sbin/ifconfig lo:0 down 
  29.         echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore 
  30.         echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce 
  31.         echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore 
  32.         echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce 
  33.  
  34. ;; 
  35. status) 
  36.  
  37.         # Status of LVS-DR real server. 
  38.         islothere=`/sbin/ifconfig lo:0 | grep $VIP` 
  39.         isrothere=`netstat -rn | grep "lo:0" | grep $VIP` 
  40.         if [ ! "$islothere" -o ! "isrothere" ];then 
  41.             # Either the route or the lo:0 device 
  42.             # not found. 
  43.             echo "LVS-DR real server Stopped." 
  44.         else 
  45.             echo "LVS-DR real server Running." 
  46.         fi 
  47. ;; 
  48. *) 
  49.             # Invalid entry. 
  50.             echo "$0: Usage: $0 {start|status|stop}" 
  51.             exit 1 
  52. ;; 
  53. esac 

 

 
(三)、测试

访问172.23.136.150,可以发现负载均衡已正常工作

 

现在我在后端两台realserver上都配置了phpmyadmin,并且两数据库的账号密码均相同。现在访问172.23.136.150/phpmyadmin 你会发现一个很有意思的现象就是始终无法登陆上(在使用ipvsadm定义规则时没有定义权重)
因此Directory还需要基于“连接追踪”实现将同一个客户端的请求始终发往其第一次被分配到的realserver,ipvs会在自己的内部维护一个hash表,表中保存着不同的客户端第一次请求时所分发的后端realserver,以及保存该条目的时间,当该段时间消耗完之后,连接还未断开,那么这段时间会自动延迟你所定义的持久连接时间。当下一个请求达到时,就会去这个表中对比,将请求分发给条目中所对应的realserver用来保证整个请求的完整性。

lvs的持久连接类型分以下几种:

1.pcc:持久客户端连接,在指定规则时,使用0端口代表所有的端口,即所有到达VIP的请求全部按照调度算法负载至后端的realserver
2.ppc:持久端口连接,明确指定请求VIP的哪个端口的请求分发至后端的realserver
3.Netfilter  marked packets:防火墙标记的持久连接,主要用于多端口协议间的关联,例如在电子商务网站上,在80端口挑选了商品后,当付款的时候就会跳转至443端口。
4.FTP持久连接,用于主动连接和被动连接,很少用到。

 

(一)、pcc
任何类型的持久连接均只需要在Directory上配置,realserver则不需要进行额外配置,因为这些只涉及到Directory的请求分发方法。

ipvsadm -C
ipvsadm -A -t 172.23.136.150:0 -p 360
ipvsadm -a -t 172.23.136.150:0 -r 172.23.136.148
ipvsadm -a -t 172.23.136.150:0 -r 172.23.136.149

在之前的配置基础上执行以上配置即可。

(二)、ppc
ipvsadm -C
ipvsadm -A -t 172.23.136.150:80 -p 360
ipvsadm -a -t 172.23.136.150:80 -r 172.23.136.148
ipvsadm -a -t 172.23.136.150:80 -r 172.23.136.149

(三)、持久防火墙标记
持久防火墙标记需要结合iptables来使用
iptables -t mangle -A PREROUTING -i eth0 -p tcp -d 172.23.136.150 -m multiport --dport 80,443 -j MARK --set-mark 1

###把来自eth0所有目的地址为172.23.136.150的80和443端口的请求绑定在一起,标签为1
ipvsadm -C
ipvsadm -A -f 1 -p 360
ipvsadm -a -f 1 -r 172.23.136.148
ipvsadm -a -f 1 -r 172.23.136.149

(四)、FTP持久连接
首先要了解FTP的工作模式:21控制端口   20数据端口
被动连接 是随机从1024---65000内选出一个 作为回应端口号,所以我们要限制被动连接回应端口的范围。
编辑你所用的FTP软件,vsftpd或者pure-ftpd,设置其端口范围结合iptables打标签
iptables -t mangle -A PREROUTING -i eth0 -p tcp -d 192.168.2.100 --dport 21 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth0 -p tcp -d 192.168.2.100 --dport 10000:12000  -j MARK --set-mark 1
ipvsadm -C
ipvsadm -A -f 1 -p 360
ipvsadm -a -f 1 -r 172.23.136.148
ipvsadm -a -f 1 -r 172.23.136.149

小结:
访问172.23.136.150/phpmyadmin,现在已经可以正常登录进去,因为此次的连接被持久分发到后端的同一台realserver上。整个请求是完整的。

 

查看其连接分配状态,可以发现同一个客户端的请求都被定向至后端的同一个realserver。

ipvsadm -lcn
IPVS connection entries
pro expire state       source             virtual            destination
TCP 01:55  FIN_WAIT    172.23.136.93:56944 172.23.136.150:80  172.23.136.149:80
TCP 01:56  FIN_WAIT    172.23.136.93:56947 172.23.136.150:80  172.23.136.149:80
TCP 01:39  FIN_WAIT    172.23.136.93:56928 172.23.136.150:80  172.23.136.149:80
TCP 01:56  FIN_WAIT    172.23.136.93:56946 172.23.136.150:80  172.23.136.149:80
TCP 01:39  FIN_WAIT    172.23.136.93:56930 172.23.136.150:80  172.23.136.149:80
TCP 01:55  FIN_WAIT    172.23.136.93:56943 172.23.136.150:80  172.23.136.149:80
TCP 01:55  FIN_WAIT    172.23.136.93:56945 172.23.136.150:80  172.23.136.149:80
TCP 01:47  FIN_WAIT    172.23.136.93:56933 172.23.136.150:80  172.23.136.149:80
TCP 01:39  FIN_WAIT    172.23.136.93:56931 172.23.136.150:80  172.23.136.149:80
TCP 14:57  ESTABLISHED 172.23.136.93:56948 172.23.136.150:80  172.23.136.149:80
TCP 05:50  NONE        172.23.136.93:0    172.23.136.150:80  172.23.136.149:80
TCP 01:39  FIN_WAIT    172.23.136.93:56932 172.23.136.150:80  172.23.136.149:80








本文转自 向阳草米奇 51CTO博客,原文链接:http://blog.51cto.com/grass51/982583,如需转载请自行联系原作者
相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
6月前
|
负载均衡 应用服务中间件 Linux
企业实战(13)LVS负载均衡NAT(网络地址转换)模式实战详解(一)
企业实战(13)LVS负载均衡NAT(网络地址转换)模式实战详解(一)
|
6月前
|
存储 负载均衡 网络协议
企业实战(13)LVS负载均衡DR(直接路由)模式实战详解(二)
企业实战(13)LVS负载均衡DR(直接路由)模式实战详解(二)
107 0
|
6月前
|
存储 负载均衡 调度
Docker 多主机部署:构建容器集群的最佳实践,助力高可用性与负载均衡
Docker 多主机部署:构建容器集群的最佳实践,助力高可用性与负载均衡
280 0
|
5月前
|
负载均衡 应用服务中间件 Linux
Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群
Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群
179 0
|
16小时前
|
负载均衡 监控 Linux
CentOS6.5高可用集群LVS+Keepalived(DR模式)
CentOS6.5高可用集群LVS+Keepalived(DR模式)
|
1天前
|
负载均衡 监控 网络协议
使用haproxy实现负载均衡集群
【4月更文挑战第14天】HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,快速并且可靠的一种解决方案。
7 1
|
7月前
|
存储 负载均衡 应用服务中间件
LVS负载均衡群集——NAT模式实操
LVS负载均衡群集——NAT模式实操
194 0
|
3月前
|
Kubernetes 负载均衡 监控
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
|
3月前
|
缓存 负载均衡 应用服务中间件
【分布式技术专题】「分析Web服务器架构」Tomcat服务器的运行架构和LVS负载均衡的运行机制(修订版)
在本章内容中,我们将深入探讨 Tomcat 服务器的运行架构、LVS 负载均衡的运行机制以及 Cache 缓存机制,并提供相应的解决方案和指导。通过理解这些关键概念和机制,您将能够优化您的系统架构,提高性能和可扩展性。
205 4
【分布式技术专题】「分析Web服务器架构」Tomcat服务器的运行架构和LVS负载均衡的运行机制(修订版)
|
3月前
|
负载均衡 算法 Linux
LVS集群
LVS(Linux Virtual Server)集群是一种基于Linux操作系统的高可用性和负载均衡解决方案。它通过将网络流量分发到多个后端服务器上,实现了对网络服务的负载均衡,并提高了系统的可用性和性能。
65 1