LVS+Keepalived实现高可用负载均衡

LVS+Keepalived实现高可用负载均衡
一、原理
1、概要介绍
如果将 TCP/IP 划分为 5 层,则 Keepalived 就是一个类似于 3~5 层交换机制的软件,具有 3~5 层交换功能,其主要作用是检测 web 服务器的状态,如果某台 web 服务器故障,Keepalived 将检测到并将其从系统中剔除,当该 web 服务器工作正常后 Keepalived 自动将其加入到服务器群中,这些工作全部自动完成,而不需要人工干预,只需要人工修复故障的 web 服务器即可。

2、工作原理
Keepalived 基于 VRRP 协议来实现高可用的解决方案,利用其避免单点故障,通常这个解决方案中,至少有 2 台服务器运行 Keepalived ,即一台为 MASTER ,另一台为 BACKUP ,但对外表现为一个虚拟 IP ,MASTER 会发送特定消息给 BACKUP,当 BACKUP 收不到改消息时,则认为 MASTER 故障了,BACKUP 会接管虚拟 IP ,继续提供服务,从而保证了高可用性,具体如下图。
LVS+Keepalived实现高可用负载均衡_第1张图片
3 层机理是发送 ICMP 数据包即 PING 给某台服务器,如果不通,则认为其故障,并从服务器群中剔除。
4 层机理是检测 TCP 端口号状态来判断某台服务器是否故障,如果故障,则从服务器群中剔除。
5 层机理是根据用户的设定检查某个服务器应用程序是否正常运行,如果不正常,则从服务器群中剔除。

3、实际作用
主要作用 RealServer 的健康检查,以及负载均衡设备 MASTER 和 BACKUP 之间 failover 的实现。
二、架构
本系列文章以 CentOS Linux release 6.0(Final) 为例,介绍用 LVS + Keepalived 实现高可用负载均衡。具体业务需求是用虚拟 IP 转发 88、25、21 端口请求到后端的真实服务器来处理业务逻辑,系统拓扑如下图:

LVS+Keepalived实现高可用负载均衡_第2张图片
客户端通过 VIP (Virtual IP)(172.28.14.227/228/229)来访问负载均衡服务器,负载均衡服务器通过 MASTER/172.28.19.92 或 BACKUP/172.28.19.93 将请求分别转发给真实服务器(Web 服务器/172.28.19.100/101/102、邮件服务器/172.28.19.103/104/105、文件服务器/172.28.19.106/107/108). 负载均衡服务器的 MASTER 和 BACKUP 上都必须安装 LVS+Keepalived,下面开始安装和配置之旅。
三、LVS 安装
MASTER 和 BACKUP 都必须安装 LVS ,安装 ipvsadm 步骤如下:
(1)依赖包安装
执行如下命令查看依赖包是否安装:

rpm -qa|grep popt

一般若安装了会打印以下信息
popt-static-1.13-7.el6.x86_64
popt-devel-1.13-7.el6.x86_64
popt-1.13-7.el6.x86_64
若没有上述的包,则需要依次安装,具体如下:

yum install popt
yum install popt-devel
yum install popt-staticx

再检查 libnl 是否安装

yum install libnl
yum install libnl-devel

(2) ipvsadm 安装

yum -y install ipvsadm

至此, LVS 就安装完成了
四、 Keepalived 安装
MASTER 和 BACKUP 都必须安装 Keepalived,安装步骤如下:

yum -y install keepalived

设置自启动

systemctl enable keepalived

配置 MASTER,配置之前先backup keepalived得配置文件
备份并打开配置文件修改部分内容,尤其注意红色部分,具体如下:


   vrrp_instance VI_1 {           
		 state MASTER                # 状态实际 MASTER            
		 interface eth0              # 监听网卡切换            
		 virtual_router_id 51            
		 priority 100                # 优先级(越大优先级越高)            
		 advert_int 1            
		 authentication {                
		 	auth_type PASS                
		 	auth_pass 1111           
		 }           
		  virtual_ipaddress {        # 虚拟 IP 地址列表,即 VIP                
		  	172.28.14.227                
		  	172.28.14.228               
		  	172.28.14.229            
		  }       
	}       
	
   virtual_server 172.28.14.227 8080 {            
	 	delay_loop 6            
	 	lb_algo wlc            
	 	lb_kind DR                    # DR模式            
	 	persistence_timeout 50            
	 	protocol TCP            
	 	real_server 172.28.19.100 8080 {                
	 		weight 1                  # 权重(权重越高处理的请求越多)                
	 		TCP_CHECK {                    
	 			connect_timeout 3                    
	 			nb_get_retry 3                    
	 			delay_before_retry 3                    
	 			connect_port 8080                
	 		}            
	 	}           
	 	 real_server 172.28.19.101 8080 {                
	 	 	weight 1                  # 权重(权重越高处理的请求越多)                
	 	 	TCP_CHECK {                    
	 	 		connect_timeout 3                    
	 	 		nb_get_retry 3                   
	 	 		delay_before_retry 3                    
	 	 		connect_port 8080                
	 	 	}            
	 	 }            
	 	 real_server 172.28.19.102 8080 {                
	 	 	weight 1                  # 权重(权重越高处理的请求越多)                
	 	 	TCP_CHECK {                    
	 	 		connect_timeout 3                    
	 	 		nb_get_retry 3                    
	 	 		delay_before_retry 3                    
	 	 		connect_port 8080                
	 	 	}            
	 	 }        
	 }        

   virtual_server 172.28.14.228 25 {            
   	delay_loop 6            
   	lb_algo wlc            
   	lb_kind DR                        # DR 模式            
   	persistence_timeout 50            
   	protocol TCP            
   	real_server 172.28.19.103 25 {                
   		weight 1                  # 权重(权重越高处理的请求越多)                
   		TCP_CHECK {                    
   			connect_timeout 3                    
   			nb_get_retry 3                    
   			delay_before_retry 3                    
   			connect_port 25                
   		}            
   	}            
   	real_server 172.28.19.104 25 {                
   		weight 1                  # 权重(权重越高处理的请求越多)                
   		TCP_CHECK {                    
   			connect_timeout 3                    
   			nb_get_retry 3                    
   			delay_before_retry 3                    
   			connect_port 25                
   		}            
   	}            
   	real_server 172.28.19.105 25 {                
   		weight 1                  # 权重(权重越高处理的请求越多)                
   		TCP_CHECK {                    
   			connect_timeout 3                    
   			nb_get_retry 3                    
   			delay_before_retry 3                    
   			connect_port 25                
   			}            
   		}        
   	}        
   	
   	virtual_server 172.28.14.229 21 {            
   		delay_loop 6            
   		lb_algo wlc            
   		lb_kind DR                        # DR 模式            
   		persistence_timeout 50            
   		protocol TCP            
   		real_server 172.28.19.106 21 {                
   			weight 1                  # 权重(权重越高处理的请求越多)                
   			TCP_CHECK {                    
   				connect_timeout 3                    
   				nb_get_retry 3                    
   				delay_before_retry 3                    
   				connect_port 21                
   			}            
   		}            
   		real_server 172.28.19.107 21 {                
   			weight 1                  # 权重(权重越高处理的请求越多)                
   			TCP_CHECK {                    
   				connect_timeout 3                    
   				nb_get_retry 3                    
   				delay_before_retry 3                    
   				connect_port 21                
   			}            
   		}            
   		real_server 172.28.19.108 21 {                
   			weight 1                  # 权重(权重越高处理的请求越多)                
   			TCP_CHECK {                    
   				connect_timeout 3                    
   				nb_get_retry 3                    
   				delay_before_retry 3                    
   				connect_port 21                
   			}            
   		}       
   	}
   	

配置 BACKUP
BACKUP 配置与 MASTER 基本一致,除了红色部分外,具体如下:

	
	vrrp_instance VI_1 {            
		state BACKP            # 状态实际 BACKUP            
		...            
		priority 99            # 优先级99(比 MASTER 优先级 100 低)            
		...        
	}


配置 Realserver
为Realserver的某块网卡创建启动脚本,脚本内容如下:

vim realserverd
# !/bin/bash        
VIP=172.28.14.227        
. /etc/rc.d/init.d/functions        
case "$1" in        
start)            
	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            
	ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up            
	/sbin/route add -host $VIP dev lo:0            
	sysctl -p > /dev/null 2>&1            
	echo "realserver start OK"            
	;;        
stop)            
	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            
	ifconfig lo:0 down            
	/sbin/route del $VIP > /dev/null 2>&1            
	echo "realserver stoped"            
	;;        
*)            
	echo "Usage:$0 {start|stop}"            
	exit 1        
esac        
exit 0

注意脚本中红色部分,每块网卡绑定一个虚拟IP地址,如果绑定多个虚拟IP,则需要为每块网卡创建一个脚本,并且指定 lo:X(比如:lo:0,lo:1 等),另外,和 ./etc/rc.d/funtions 之间有空格。

启动 keepalived 服务,并执行上述脚本,然后用 ip a 能确认是否有 VIP 地址。

输入 ipvsadm -Ln 查看 LVS 工作状态。

停止 MASTER 的 keepalived 服务,BACKUP 能接管 VIP 地址,再次启动 MASTER 的 keepalived 服务,MASTER 又能再一次接管 VIP 地址。
如果以上没有出现报错,那么高可用服务实现成功。

你可能感兴趣的:(LVS+Keepalived实现高可用负载均衡)