LVS负载均衡: 常用的负载均衡开源软件有nginx、lvs、haproxy,商业的硬件负载均衡设备F5、Netscale。 LVS模式工作在网络层,且由内核实现负载转发,效率要比nginx高。 LVS负载均衡包含三种模式: 

  1. NAT模式(类似路由器,实现外网内网地址映射,负载均衡服务器修改请求包的源以及目的MAC地址和IP地址,发送给实际服务器;负载均衡服务器,修改响应包的源以及目的MAC地址和IP地址,发送给客户端。请求和响应报文都需要经过负载均衡服务器) 
  2. TUN模式(IP隧道,负载均衡服务器将外网传来的数据包封装在IP隧道中,传给实际服务器。实际服务器的响应直接发给客户端,而不需要经过负载均衡服务器。) 
  3. DR模式(负载均衡服务器和后端的实际服务器拥有相同的虚拟IP地址,负载均衡服务器收到响应包后,修改目的MAC地址发给实际服务器,实际服务器将响应包直接发给客户端,不需要经过负载均衡服务器) LVS 的负载均衡算法:

1》轮叫调度 rr 顺序轮询到集群中的真实服务器。

2》加权轮叫 wrr 根据服务器的性能来基于权重分配轮询的请求。

3》最少链接 lc 将网络请求调度到已建立的链接数最少的服务器上。

4》加权最少链接 wlc 性能差异较大的情况下。具有较高权重的服务器将承受比较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权重。

5》基于局部性的最少链接 lblc 针对目标IP地址的负载均衡,适用于Cache集群系统。 根据请求的目标IP地址找到该目标IP地址最近使用的服务器,若该服务器可以且没有超载,则将请求发送到该服务器;若该服务器不存在或者该服务器超载且有服务器处于一半的工作负载,则用最少链接的原则选出一个可用的服务器,将请求发送到该服务器上。

6》带复制的基于局部性的最少链接 lblcr

7》目标地址散列 dh 根据请求的目标IP地址,作为散列键从静态分配的散列表中找到相应的服务器,若该服务器是可用的且无超载则将请求发送到该服务器,否则返回空。 8》源地址散列 sh 根据请求的源IP地址,作为散列键从静态分配的散列表中找到相应的服务器,若该服务器是可用的且无超载则将请求发送到该服务器,否则返回空。 9》源IP端口散列 通过Hash函数将来自同一个源IP地址和源端口号的请求映射到后端的同一台服务器上。 适用于需要保证来自同一用户同一业务的请求被分发到同一台服务器。 10》随机 适用于集群中各机器性能相当而且无明显优劣差异的场景。

搭建LVS DR模式负载均衡 其中,负载均衡服务器的IP地址为 10.10.10.100/24 和 10.10.10.120/32(该IP地址是用户访问的IP地址), Real Server 1的IP地址为10.10.10.121/24, Real Server 2的IP地址为10.10.10.122/24,三者连接在同一个局域网中,且 RS1和 RS2的虚拟IP地址(可以在lo或者lo:0上设置该IP地址,即本地环回,这样该虚拟IP只对该机器本身可见,不会暴露在外部造成IP冲突)都设为负载均衡服务器的IP地址 dev-1.      这样外部访问10.10.10.100时,会访问到负载均衡服务器,而负载均衡服务器选择某个实际服务器,比如RS1,然后将包的目的MAC地址修改为RS1的MAC地址,在将包送到局域网上。此时对于请求数据包来说,目的MAC地址为RS1的MAC地址,因此RS1会收到,RS1发现包的目的MAC为自身,且目的IP地址为10.10.10.100,也是自身的一个IP,于是就认为数据包是发到自己的,就开始进行处理。

一、安装http服务

1、在RS1和RS2上分别安装httpd服务:yum install httpd -y
2. 修改/etc/httpd/conf/httpd.conf 文件,进行相应的配置。 
3. 启动httpd服务,并设置防火墙开放80端口

二、配置负载均衡器LB

1、yum install ipvsadm -y
2、设置实际ip和虚拟ip
			ifconfig eth0 10.10.10.120/24
			ifconfig eth0:0 10.10.10.100 netmask 255.255.255.255 #虚拟IP,暴露给外部
3、设置负载转发
方式一,通过ipvsadm
			systemctl start ipvsadm
			ipvsadm -C
			ipvsadm --set 30 5 60
			#vip on load balancer
			ipvsadm -A -t 10.10.10.100:80 -s wrr -p 20 #接受转发协议
			ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.121:80 -g -w 1 #增加转发目的地
			ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.122:80 -g -w 1 #增加转发目的地
			ipvsadm -L -n
方式二,通过keepalived
vim /etc/keepalived/keepalived.conf 修改配置文件如下
	
	global_defs { 
	   notification_email { 
	         xxxxxx
	   } 
	   notification_email_from xxxxxx 
	   smtp_server xxxxxx 
	   smtp_connection_timeout 30
	   router_id LVS_DEVEL  # 设置lvs的id,在一个网络内应该是唯一的
	} 
	vrrp_instance VI_1 { 
	    state MASTER   #指定Keepalived的角色,MASTER为主,BACKUP为备         
	    interface eth0  #指定Keepalived的角色,MASTER为主,BACKUP为备
	    virtual_router_id 51  #虚拟路由编号,主备要一致
	    priority 100  #定义优先级,数字越大,优先级越高,主DR必须大于备用DR   
	    advert_int 1  #检查间隔,默认为1s
	    authentication { 
	        auth_type PASS 
	        auth_pass 1111 
	    } 
	    virtual_ipaddress { 
	        10.10.10.100  #定义虚拟IP(VIP)为10.10.10.100,可多设,每行一个
	    } 
	} 
	\# 定义对外提供服务的LVS的VIP以及port
	virtual_server 10.10.10.100 80 { 
	    delay_loop 6 # 设置健康检查时间,单位是秒                   
	    lb_algo wrr # 设置负载调度的算法为wlc                  
	    lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式  
	    nat_mask 255.255.255.0               
	    persistence_timeout 0         
	    protocol TCP                 
	    real_server 10.10.10.121 80 {  # 指定real server1的IP地址
	        weight 3   # 配置节点权值,数字越大权重越高             
	        TCP_CHECK { 
	        connect_timeout 10        
	        nb_get_retry 3 
	        delay_before_retry 3 
	        connect_port 80 
	        } 
	    } 
	    real_server 10.10.10.122 80 {  # 指定real server2的IP地址
	        weight 3  # 配置节点权值,数字越大权重越高 
	        TCP_CHECK { 
	        connect_timeout 10 
	        nb_get_retry 3 
	        delay_before_retry 3 
	        connect_port 80 
	        } 
	     } 
	}
	 
	启动keepalived服务
	systemctl start keepalived		

三、配置Real Server

1、配置网卡:
	ifconfig lo:0 10.10.10.100 netmask 255.255.255.255 #即设置虚拟IP地址,该IP地址绑定在环回网卡上,不会对外暴露
2、设置内核参数:
	[root@dev-2 lvs]#vim /etc/sysctl.conf
	[root@dev-2 lvs]# sysctl -p
	net.ipv4.ip_forward = 1 #打开路由转发
	net.ipv4.conf.all.arp_ignore = 1 #只回答目的IP为本网口IP地址的arp包的请求
	net.ipv4.conf.all.arp_announce = 2 #对查询目标使用最适当的本机地址
	net.ipv4.conf.lo.arp_ignore = 1
	net.ipv4.conf.lo.arp_announce = 2

四、使用客户端测试

此时使用客户端访问 http://10.10.10.100, 请求会被转发到RS1或者RS2上。

五、安装脚本

LB端:
# vim /usr/local/sbin/lvs_dr.sh
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/sbin/ipvsadm
vip=10.10.10.100
rs1=10.10.10.121
rs2=10.10.10.122
ifconfig eth0:0 down
ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev eth0:0
$ipv -C
$ipv -A -t $vip:80 -s wrr 
$ipv -a -t $vip:80 -r $rs1:80 -g -w 3
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
RS端:
# vim /usr/local/sbin/lvs_dr_rs.sh
#! /bin/bash
vip=10.10.10.100
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
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