基于Linux的负载均衡集群软件
 
· LVS
 
全称为Linux Virtual Server,是一款开源的四层(传输层)负载均衡软件
 
· Nginx
 支持四层和七层(应用层)负载均衡
 
· HAProxy
 和Nginx一样,也可同时支持四层和七层(应用层)负载均衡
 
基于Linux的高可用集群软件
 
· Keepalived
 Keepalived是Linux中一个轻量级高可用集群部署软件,最初是为LVS设计的,后加入了VRRP功能,
 可以实现集群的心跳检测、虚拟IP漂移等功能
 
· Heartbeat
 Heartbeat的功能与Keepalived功能类似,但是不控制虚拟IP的漂移,相对Keepalived更擅长对资
 源服务的控制,配置也比较复杂
 
· Pacemaker
 
Pacemaker是一款在Linux中应用非常广泛的开源集群资源管理器,它本身不具备集群心跳检测
 机制,需依赖Corosync或Heartbeat,可同时适用于任何规模的集群
 
集群中的常见概念-VIP和地址漂移
 
· VIP:虚拟IP。在高可用集群中,一般使用VIP向外提供服务,可避免集群中某台主机宕机后可能引起的业务访问IP发生变化
 
· 地址漂移:在高可用集群中,VIP从某一台主机迁移到另外一台主机称为地址漂移(对终端来说是透明的,是无法检测到的,速度很快)
 
 终端直接访问Server A或是Server B都不好,如果发生地址漂移,对终端用户都不好,所以直接访问VIP的IP地址,不论是从11到12,112都能访问。
 
 
集群中的常见概念-心跳和脑裂
 
· 心跳:在高可用集群中,主机之间会相互监控彼此对方的状态,以决定哪台主机提供服务,这一机制称为心跳
 
· 脑裂:如果节点之间的心跳通信中断或不正常,会导致彼此之间抢夺资源,这种现象称为脑裂(故障现象)
 
Server A 和Server B是一个整体, 它们会通过串口线缆连接起来,利用其做心跳检测,还有一个千兆接口作为备用路线
 
 
集群中的常见概念-代理
 
代理可分为正向代理和反向代理,一般用于负载均衡集群
 
正向代理和反向代理是相对于被代理者来说的,正向代理被代理的是客户端,反向代理被代理的是服务端
 


 
代理局域网访问互联网                                      发布内网服务器让公网用户访问(安全性更高)
 
 
LVS在企业IT架构中的位置
 
三层架构(这里最后一层存储层省略了)
 
最外面是客户端
 

 
对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,比较其各自的优势 
 
DR 模式
 
* 负载各节点服务器通过本地网络连接,不需要建立专用的IP隧道
 
      原理:首先负载均衡器接收到客户的请求数据包时,根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。然后负载均衡器就把客户端发送的请求数据包的目标MAC地址改成后端真实服务器的MAC地址(R-MAC)。真实服务器响应完请求后,查看默认路由,把响应后的数据包直接发送给客户端,不需要经过负载均衡器。
 
     优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,也能处理很巨大的请求量。
 
     缺点:需要负载均衡器与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。
 
NAT模式
 
      原理:首先负载均衡器接收到客户的请求数据包时,根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。然后负载均衡器就把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的IP地址(RIP)。真实服务器响应完请求后,查看默认路由,把响应后的数据包发送给负载均衡器,负载均衡器在接收到响应包后,把包的源地址改成虚拟地址(VIP)然后发送回给客户端。
 
     优点:集群中的服务器可以使用任何支持TCP/IP的操作系统,只要负载均衡器有一个合法的IP地址。
 
      缺点:扩展性有限,当服务器节点增长过多时,由于所有的请求和应答都需要经过负载均衡器,因此负载均衡器将成为整个系统的瓶颈。
 
两者的区别:
 
DR模式不使用调度器为公司网关,而是路由设备,调度器只是分配访问的请求任务而回应的web页面,不经过调度器,直接通过网络设备回应,不容易造成阻塞而且所有节点都使用VIP地址。
 
在nat模式群集中,LSV负载均衡调度器是所有节点的访问internet的网关服务器其外网口地址也最为整个群集的VIP地址,调度器是整个公司网关任何请求都要经过调度器,包括回应的。
 
LVS的工作模式-DR
 
在DR模式中,所有的RS需要配置两个地址:RIP和VIP
 
在DR模式中,LVS会通过arp获取到所有RS的IP地址和对应的MAC
 地址,因此LVS和RS需处于同一二层网络中
 
当User发送请求到LVS后,LVS保持源目IP地址和端口号不变,同
 时将源MAC地址换成自己的MAC地址,目的MAC地址换成调度到
 的RS MAC进行转发
 
RS在回响应报文时,源地址是VIP地址,源端口号为提供服务的
 端口号,源MAC地址为自己的MAC地址,目的地址为客户端地址,
 目的端口号为客户端发起连接请求时的随机端口,目的MAC地
 址为网关的MAC地址
 

 
DR简单实验
 
本实验共使用四台虚拟机,其中一台配置为LVS服务器,两台用于Nginx服务器的搭建,剩
 余一台为Client。其中Nginx服务器可以和上一实验复用,LVS仅需要一个网卡即可,删除
 10.0.0.10所在的网卡,并将192.168.1.10所在网卡的地址修改为10.0.0.10。两台Nginx服务
 器和LVS服务器处于同一子网中,客户端处于另外一个子网。Nginx服务器和LVS服务器配
 置dummy类型的接口接口角于承载VIP。
 

 
1、后端服务器(1.12、1.13)批量安装nginx
 
然后提供一个默认主页
 

 
在实际中,后端页面要是一模一样的,这里是为了看效果 
 
然后覆盖
 

 
设为开机自启动
 

 

 
1、绑定vip 
 
网络上需增加VIP的相关配置
 

 
2、修改arp内核配置 
 
vim /etc/sysctl.conf
 
在最后加上
 

 
修改后立即生效
 
sysctl -p 
 
ip a
 

 
到这里后端操作就完成了
 
2、处理代理(1.11)
 
1、首先绑定VIP
 

 
2、安装管理工具 
 

 
查看是否有配置 (这里是没有的)
 

 
 3、LVS配置
 
[相关参数说明]
 [root@Directory ~]# ipvsadm -help
 -A 添加虚拟服务器
 -t 设置群集地址(VIP,Virtual IP)
 -s 指定负载调度算法
 -a 添加真实服务器
 -d 删除真实服务器
 -r 指定真实服务器(Real Server)的地址
 -m 使用NAT模式 :- g、-i分别对应DR、TUN模式
 -w 为节点服务器设置权重,默认为1
 
ipvsadm -At 192.168.1.10:80 -s rr
 
ipvsadm -at 192.168.1.10:80 -r 192.168.1.12:80 -g 添加后端服务器
 
ipvsadm -at 192.168.1.10:80 -r 192.168.1.13:80 -g 添加后端服务器
 

 
再次查询
 

 
3、(1.14)测试
 

 
比例是1:1 
 
脚本-DR设置
 
首先把之前的操作都清除一下
 

 
删除网络
 

 
编写脚本
 
 #!/bin/sh  
 
 #  
 
 # Startup script handle the initialisation of LVS  
 
 # chkconfig: - 28 72  
 
 # description: Initialise the Linux Virtual Server for DR  
 
 #  
 
 ### BEGIN INIT INFO  
 
 # Provides: ipvsadm  
 
 # Required-Start: $local_fs $network $named  
 
 # Required-Stop: $local_fs $remote_fs $network  
 
 # Short-Description: Initialise the Linux Virtual Server  
 
 # Description: The Linux Virtual Server is a highly scalable and highly  
 
 # available server built on a cluster of real servers, with the load  
 
 # balancer running on Linux.  
 
 # description: start LVS of DR  
 
 LOCK = /var/lock/ipvsadm.lock  
 
 VIP = 192 .168.1.10  
 
 RIP1 = 192 .168.1.12  
 
 RIP2 = 192 .168.1.13 DipName = ens160 
 
 . /etc/rc.d/init.d/functions  
 
 start () {  
 
 PID = `ipvsadm -Ln | grep  ${VIP}  | wc -l`  
 
 if  [  $PID  -gt  0  ];  
 
 then  
 
 echo  "The LVS-DR Server is already running !"  
 
 else  
 
 #Set the Virtual IP Address  
 
 /sbin/ifconfig  ${DipName} :10  $VIP  broadcast  $VIP  netmask  
 
 255 .255.255.255 up  
 
 /sbin/route add  -host  $VIP  dev  ${DipName} :10  
 
 #Clear IPVS Table  
 
 /sbin/ipvsadm  -C  
 
 #Set Lvs  
 
 /sbin/ipvsadm  -At  $VIP :80  -s  rr  
 
 /sbin/ipvsadm  -at  $VIP :80  -r  $RIP1 :80  -g  
 
 /sbin/ipvsadm  -at  $VIP :80  -r  $RIP2 :80  -g  
 
 /bin/touch  $LOCK  
 
 #Run Lvs  
 
 echo  "starting LVS-DR Server is ok !"  
 
 fi  
 
 }  
 
 stop () {  
 
 #clear Lvs and vip  
 
 /sbin/ipvsadm  -C  
 
 /sbin/route del  -host  $VIP  dev  ${DipName} :10  
 
 /sbin/ifconfig  ${DipName} :10 down >/dev/null  
 
 rm  -rf  $LOCK  
 
 echo  "stopping LVS-DR server is ok !"  
 
 }  
 
 status() {  
 
 if  [  -e  $LOCK  ];  
 
 then  
 
 echo  "The LVS-DR Server is already running !"  
 
 else  
 
 echo  "The LVS-DR Server is not running !"  
 
 fi  
 
 }  
 
 case  " $1 "  in  
 
 start )  
 
 start  
 
 ;;  
 
 stop )  
 
 stop  
 
 ;;  
 
 restart )  
 
 stop  
 
 start  
 
 ;;  
 
 status) status  
 
 ;;  
 
 *)  
 
 echo  "Usage:  $1  {start|stop|restart|status}"  
 
 exit  1  
 
 esac  
 
 exit  0 
 
 
 设置开机自启 
 
 
 
确认是否绑定
 
 
 测试
 

 
后端脚本
 
如果做了之前的操作,记得删除一下
 
编写脚本
 
 #!/bin/sh  
 
 #  
 
 # Startup script handle the initialisation of LVS  
 
 # chkconfig: - 28 72  
 
 # description: Initialise the Linux Virtual Server for DR  
 
 #  
 
 ### BEGIN INIT INFO  
 
 # Provides: ipvsadm  
 
 # Required-Start: $local_fs $network $named  
 
 # Required-Stop: $local_fs $remote_fs $network  
 
 # Short-Description: Initialise the Linux Virtual Server  
 
 # Description: The Linux Virtual Server is a highly scalable and highly  
 
 # available server built on a cluster of real servers, with the load  
 
 # balancer running on Linux.  
 
 # description: start LVS of DR-RIP  
 
 LOCK = /var/lock/ipvsadm.lock  
 
 VIP = 192 .168.95.10  
 
 . /etc/rc.d/init.d/functions  
 
 start () {  
 
 PID = `ifconfig | grep lo:10 | wc -l`  
 
 if  [  $PID  -ne  0  ];  
 
 then  
 
 echo  "The LVS-DR-RIP Server is already running !"  
 
 else  
 
 /sbin/ifconfig lo:10  $VIP  netmask  255 .255.255.255 broadcast  $VIP  up  
 
 /sbin/route add  -host  $VIP  dev lo:10  
 
 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/eth0/arp_ignore  
 
 echo  "2"  >/proc/sys/net/ipv4/conf/eth0/arp_announce  
 
 echo  "1"  >/proc/sys/net/ipv4/conf/all/arp_ignore  
 
 echo  "2"  >/proc/sys/net/ipv4/conf/all/arp_announce  
 
 /bin/touch  $LOCK  
 
 echo  "starting LVS-DR-RIP server is ok !"  
 
 fi  
 
 } 
 
 
  stop () {  
  /sbin/route del  -host  $VIP  dev lo:10  
  /sbin/ifconfig lo:10 down >/dev/null  
  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/eth0/arp_ignore  
  echo  "0"  >/proc/sys/net/ipv4/conf/eth0/arp_announce  
  echo  "0"  >/proc/sys/net/ipv4/conf/all/arp_ignore  
  echo  "0"  >/proc/sys/net/ipv4/conf/all/arp_announce  
  rm  -rf  $LOCK  
  echo  "stopping LVS-DR-RIP server is ok !"  
  }  
  status() {  
  if  [  -e  $LOCK  ];  
  then  
  echo  "The LVS-DR-RIP Server is already running !"  
  else  
  echo  "The LVS-DR-RIP Server is not running !"  
  fi  
  }  
  case  " $1 "  in  
  start )  
  start  
  ;;  
  stop )  
  stop  
  ;;  
  restart )  
  stop  
  start  
  ;;  
  status)  
  status  
  ;;  
  *)  
  echo  "Usage:  $1  {start|stop|restart|status}"  
  exit  1  
  esac  
  exit  0 
  
  

 
 测试
 

 
arp防火墙设置
 
首先同样把之前的配置修改回去
 
下载arp
 

 
刚下载好的arp里没有任何配置 
 
 
 也可以使用 arptables 实现抑制 arp  
 
 
 
 
