负载均衡集群LVS

时间:2021-08-28 21:47:56
集群分类及不同分类的特点

计算机集群架构按照功能和结构一般分成以下几类:
1)负载均衡集群(Loadbalancingclusters)简称LBC
2)高可用性集群(High-availabilityclusters)简称HAC
3)高性能计算集群(High-perfomanceclusters)简称HPC
4)网格计算(Gridcomputing)

网络上面一般认为是有三个,负载均衡和高可用集群式我们互联网行业常用的集群架构。

(1)负载均衡集群
   负载均衡集群为企业提供了更为实用,性价比更高的系统架构解决方案。负载均衡集群把 很多客户集中访问的请求负载压力可能尽可能平均的分摊到计算机集群中处理 。客户请求负载通常包括应用程度处理负载和网络流量负载。这样的系统非常适合向使用同一组应用程序为大量用户提供服务。每个节点都可以承担一定的访问请求负载压力,并且可以实现访问请求在各节点之间动态分配,以实现负载均衡。
   负载均衡运行时,一般通过一个或多个前端负载均衡器将客户访问请求分发到后端一组服务器上,从而达到整个系统的高性能和高可用性。这样计算机集群有时也被称为服务器群。一般高可用性集群和负载均衡集群会使用类似的技术,或同时具有高可用性与负载均衡的特点。
负载均衡集群的作用
1)分担访问流量(负载均衡)
2)保持业务的连续性(高可用)

(2)高可用性集群
一般是指当集群中的任意一个节点失效的情况下,节点上的所有任务自动转移到其他正常的节点上,并且此过程不影响整个集群的运行,不影响业务的提供。
   类似是集群中运行着两个或两个以上的一样的节点,当某个主节点出现故障的时候,那么其他作为从 节点的节点就会接替主节点上面的任务。从节点可以接管主节点的资源(IP地址,架构身份等),此时用户不会发现提供服务的对象从主节点转移到从节点。
   高可用性集群的作用:当一个机器宕机另一台进行接管。 比较常用的高可用集群开源软件有:keepalive,heardbeat。

(3)高性能计算集群
 高性能计算集群采用将计算任务分配到集群的不同计算节点儿提高计算能力,因而主要应用在科学计算领域。比较流行的HPC采用Linux操作系统和其它一些免费软件来完成并行运算。这一集群配置通常被称为Beowulf集群。这类集群通常运行特定的程序以发挥HPCcluster的并行能力。这类程序一般应用特定的运行库, 比如专为科学计算设计的MPI库。
   HPC集群特别适合于在计算中各计算节点之间发生大量数据通讯的计算作业,比如一个节点的中间结果或影响到其它节点计算结果的情况。
常用集群软硬件
常用开源集群软件有:lvs,keepalived,haproxy,nginx,apache,heartbeat
常用商业集群硬件有:F5,Netscaler,Radware,A10等



一、 LVS简介
      
           LVS是Linux Virtual Server的简称 ,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的*软件项目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是 从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能 。        
使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。  
      
LVS自从1998年开始,发展到现在已经是一个比较成熟的技术项目了。可以利用LVS技术实现高可伸缩的、高可用的网络服务,例如WWW服务、Cache服务、DNS服务、FTP服务、MAIL服务、视频/音频点播服务等等,有许多比较著名网站和组织都在使用LVS架设的集群系统,例如:Linux的门户网站(www.linux.com)、向RealPlayer提供音频视频服务而闻名的Real公司(www.real.com)、全球最大的开源网站(sourceforge.net)等。        

二、 LVS体系结构
      
          使用LVS架设的服务器集群系统有三个部分组成: 最前端的负载均衡层 ,用Load Balancer表示, 中间的服务器群组层 ,用Server Array表示, 最底端的数据共享存储层 ,用Shared Storage表示,在用户看来,所有的内部应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。         

负载均衡集群LVS

客户请发送向负载均衡服务器发送请求。负载均衡器接受客户的请求,然后先是根据 LVS的调度算法(8种)来决定要将这个请求发送给哪个节点服务器 。然后依据自己的 工作模式(3种)来看应该如何把这些客户的请求如何发送给节点服务器 ,节点服务器又应该如何来把响应数据包发回给客户端。

下面对LVS的各个组成部分进行详细介绍:        
2.1     Load Balancer层:位于整个集群系统的最前端,有一台或者多台负载调度器(Director Server)组成,LVS模块就安装在Director Server上,而Director的主要作用类似于一个路由器,它含有完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给Server Array层的应用服务器(Real Server)上。同时,在Director Server上还要安装对Real Server服务的监控模块Ldirectord,此模块用于监测各个Real Server服务的健康状况。在Real Server不可用时把它从LVS路由表中剔除,恢复时重新加入。         


2.2      Server Array层:由一组实际运行应用服务的机器组成,Real Server可以是WEB服务器、MAIL服务器、FTP服务器、DNS服务器、视频服务器中的一个或者多个,每个Real Server之间通过高速的LAN或分布在各地的WAN相连接。在实际的应用中,Director Server也可以同时兼任Real Server的角色。         


2.3     Shared Storage层:是为所有Real Server提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性, 一般可以通过NFS网络文件系统共享数据 ,但是NFS在繁忙的业务系统中,性能并不是很好, 此时可以采用集群文件系统,例如Red hat的GFS文件系统,oracle提供的OCFS2文件系统等 。    
    
从整个LVS结构可以看出,Director Server是整个LVS的核心,目前,用于Director Server的操作系统只能是Linux和FreeBSD,linux2.6内核不用任何设置就可以支持LVS功能,而FreeBSD作为Director Server的应用还不是很多,性能也不是很好。     
    
对于Real Server,几乎可以是所有的系统平台,Linux、windows、Solaris、AIX、BSD系列都能很好的支持。


三、  LVS集群的特点
      
3.1  IP负载均衡与负载调度算法
1.IP负载均衡技术
       
     负载均衡技术有很多实现方案,有基于DNS域名轮流解析的方法、有基于客户端调度访问的方法、有基于应用层系统负载的调度方法,还有基于IP地址的调度方法, 在这些负载调度算法中,执行效率最高的是IP负载均衡技术。     
    

LVS的IP负载均衡技术是通过IPVS模块来实现的, IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务

这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。   
      
当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的Real Server节点,而Real Server节点如何返回数据给用户,是IPVS实现的重点技术, IPVS实现负载均衡机制有三种,分别是NAT、TUN和DR ,详述如下

通过NAT实现虚拟服务器(VS/NAT)
负载均衡集群LVS

也就是网络地址翻译技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求报文的目标地址(即虚拟IP地址)改写成选定的Real Server地址,同时报文的目标端口也改成选定的Real Server的相应端口,最后将报文请求发送到选定的Real Server。在服务器端得到数据后,Real Server返回数据给用户时,需要再次经过负载调度器将报文的源地址和源端口改成虚拟IP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。         
可以看出, 在NAT方式下,用户请求和响应报文都必须经过Director Server地址重写,当用户请求越来越多时,调度器的处理能力将称为瓶颈。          


通过IP隧道实现虚拟服务器(VS/TUN)
也就是IP隧道技术实现虚拟服务器。它的连接调度和管理与VS/NAT方式一样,只是它的报文转发方法不同, VS/TUN方式中,调度器采用IP隧道技术将用户请求转发到某个Real Server,而这个Real Server将直接响应用户的请求,不再经过前端调度器 ,此外,对Real Server的地域位置没有要求,可以和Director Server位于同一个网段,也可以是独立的一个网络。因此, 在TUN方式中,调度器将只处理用户的报文请求 ,集群系统的吞吐量大大提高。         


通过直接路由实现虚拟服务器(VS/DR)

负载均衡集群LVS
也就是用直接路由技术实现虚拟服务器。它的连接调度和管理与VS/NAT和VS/TUN中的一样,但它的报文转发方法又有不同, VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了VS/TUN中的IP隧道开销。 这种方式是三种负载调度机制中性能最高最好的, 但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上


2.负载调度算法
       
    上面我们谈到,负载调度器是根据各个服务器的负载情况,动态地选择一台Real Server响应用户请求,那么动态选择是如何实现呢,其实也就是我们这里要说的负载调度算法,根据不同的网络服务需求和服务器配置,IPVS实现了如下八种负载调度算法:

Lvs的调度算法决定了如何在集群节点之间分布工作负荷。当director调度器收到来自客户端访问VIP的上的集群服务的入站请求时,director调度器必须决定哪个集群节点应该处理请求。Director调度器用的调度方法基本分为两类:

固定调度算法:rr,wrr,dh,sh

动态调度算法:wlc,lc,lblc,lblcr

负载均衡集群LVS



LVS负载均衡算法--- 1.轮叫调度 (Round-RobinScheduling)

调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它 均等 地对待每一台服务器,而不管服务器上实际的连接数和系统负载

LVS负载均衡算法--- 2.加权轮叫调度 (WeightedRound-RobinScheduling)

调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求这样可以保证处理能力强的服务器处理更多的访问流量调度器可以自动问询真实服务器的负载情况,并动态地调整其权值

LVS负载均衡算法--- 3.最小连接调度 (Least-ConnectionScheduling)

调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上 如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载

LVS负载均衡算法--- 4.加权最小连接调度 (WeightedLeast-ConnectionScheduling)

在集群系统中的服务器性能差异较大的情况下, 调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载调度器可以自动问询真实服务器的负载情况,并动态地调整其权值

LVS负载均衡算法--- 5.基于局部性的最少链接 (Locality-BasedLeastConnectionsScheduling)


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

LVS负载均衡算法--- 6.带复制的基于局部性最少链接 (LocalityBasedLeastConnectionswithReplicationScheduling)

带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度

LVS负载均衡算法--- 7.目标地址散列调度 (DestinationHashingScheduling)

目标地址散列"调度算法根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空

LVS负载均衡算法--- 8.源地址散列调度 (SourceHashingScheduling)


源地址散列"调度算法根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空


3.2 高可用性
       
      LVS是一个基于内核级别的应用软件,因此具有很高的处理性能 ,用LVS构架的负载均衡集群系统具有优秀的处理能力,每个服务节点的故障不会影响整个系统的正常使用,同时又实现负载的合理均衡,使应用具有超高负荷的服务能力,可支持上百万个并发连接请求。如配置百兆网卡,采用VS/TUN或VS/DR调度技术,整个集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统的最大吞吐量可接近10Gbits/s。


3.3 高可靠性
      
     LVS负载均衡集群软件已经在企业、学校等行业得到了很好的普及应用,国内外很多大型的、关键性的web站点也都采用了LVS集群软件,所以它的可靠性在实践中得到了很好的证实。有很多以LVS做的负载均衡系统,运行很长时间,从未做过重新启动。这些都说明了LVS的高稳定性和高可靠性。

3.4 适用环境
       
     LVS对前端Director Server目前仅支持Linux和FreeBSD系统,但是支持大多数的TCP和UDP协议,支持TCP协议的应用有:HTTP,HTTPS ,FTP,SMTP,,POP3,IMAP4,PROXY,LDAP,SSMTP等等。支持UDP协议的应用有:DNS,NTP,ICP,视频、音频流播放协议等。   
      
LVS对Real Server的操作系统没有任何限制,Real Server可运行在任何支持TCP/IP的操作系统上,包括Linux,各种Unix(如FreeBSD、Sun Solaris、HP Unix等),Mac/OS和Windows等。

3.5 开源软件
       
     LVS集群软件是按GPL(GNU Public License)许可证发行的*软件,因此,使用者可以得到软件的源代码,并且可以根据自己的需要进行各种修改,但是修改必须是以GPL方式发行。


一.检查内核是否支持LVS

[root@wjb10000 /]# uname -a
Linux wjb10000 3.10.0-123.el7.x86_64 #1 SMP Mon May 5 11:16:57 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux
备注:2.4.23以后版本的内核已经支持LVS,只需要直接使用,不需要进行内核的下载和更新工作。

二.检查内核是否支持lvs的ipvs模块

[root@wjb10000 ~]# modprobe -l|grep ipvs
modprobe: invalid option -- 'l'
备注:参数l无效,查了很多资料。好像现在没有这个参数了,可以改用下面这个命令查看内核是否支持lvs的ipvs模块
[root@wjb10000 ~]#  find /lib/modules/$(uname -r)/ -iname "**.ko*" | cut -d/ -f5-
....................前面省略...................
kernel/net/netfilter/ipvs/ip_vs.ko
kernel/net/netfilter/ipvs/ip_vs_dh.ko
kernel/net/netfilter/ipvs/ip_vs_ftp.ko
kernel/net/netfilter/ipvs/ip_vs_lblc.ko
kernel/net/netfilter/ipvs/ip_vs_lblcr.ko
kernel/net/netfilter/ipvs/ip_vs_lc.ko
kernel/net/netfilter/ipvs/ip_vs_nq.ko
kernel/net/netfilter/ipvs/ip_vs_pe_sip.ko
kernel/net/netfilter/ipvs/ip_vs_rr.ko
kernel/net/netfilter/ipvs/ip_vs_sed.ko
kernel/net/netfilter/ipvs/ip_vs_sh.ko
kernel/net/netfilter/ipvs/ip_vs_wlc.ko
kernel/net/netfilter/ipvs/ip_vs_wrr.ko
....................后面省略...................
看到有输出以上内容,说明内核支持lvs了,无需再编译内核了。

三.查看ipvsadm 程序是否被安装

[root@wjb10000 ~]#  ipvsadm

-bash: ipvsadm: command not found
输出以上信息表明未安装ipvsadm程序。下面通过yum的方式安装ipvsadm程序,不用考虑软件之间的依懒性。

[root@wjb10000 ~]#  yum -y install ipvsadm

[root@wjb10000 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

安装完ipvsadm之后输出的信息。说明ipvsadm安装成功。

四.配置 IPVS

1.开启IP转发功能

[root@wjb10000 /]# echo 1 >/proc/sys/net/ipv4/ip_forward   
默认是0,关闭ip转发;这里需要开启,所以设置值为1。

2.配置重定向

[root@wjb10000 /]#echo "0" >/proc/sys/net/ipv4/ip_forward
[root@wjb10000 /]#echo "1" >/proc/sys/net/ipv4/conf/all/send_redirects
[root@wjb10000 /]#echo "1" >/proc/sys/net/ipv4/conf/default/send_redirects
[root@wjb10000 /]#echo "1" >/proc/sys/net/ipv4/conf/eth0/send_redirects

3.清除ipvsadm表

[root@wjb10000 /]# ipvsadm -C

4.使用ipvsadm安装LVS服务实例:

ipvsadm -A -t vip:端口号 -s rr

5.增加二台内部web服务器

ipvsadm -a -t vip:端口号 -r web1服务器IP:端口号 -m -w 1

ipvsadm -a -t vip:端口号 -r web2服务器IP:端口号 -m -w 1


ipvsadm使用指南

1.名词解释

virtual-service-address(VIP):虚拟服务器的 ip  地址
real-service-address(RIP):是指真实服务器的 ip  地址
scheduler:调度方法

2.ipvsadm的用法和格式如下

ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p[timeout]] [-M netmask]
ipvsadm -D -t|u|f virtual-service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port
[-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon state [--mcast-interface interface]
ipvsadm --stop-daemon
ipvsadm -h

3.命令选项

-A --add-service             在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。

-E --edit-service             编辑内核虚拟服务器表中的一条虚拟服务器记录。

-D --delete-service          删除内核虚拟服务器表中的一条虚拟服务器记录。

-C --clear                       清除内核虚拟服务器表中的所有记录。

-R --restore                   恢复虚拟服务器规则

-S --save                      保存虚拟服务器规则,输出为-R选项可读的格式 

-a --add-server              在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器

-e --edit-server              编辑一条虚拟服务器记录中的某条真实服务器记录

-d --delete-server           删除一条虚拟服务器记录中的某条真实服务器记录

-L|-l --list                       显示内核虚拟服务器表,输出对应文件/proc/net/ip_vs

-Z --zero                       虚拟服务表计数器清零(清空当前的连接数量等)

--set tcp tcpfin udp         设置连接超时值

--start-daemon                启动同步守护进程。他后面可以是 master  或 backup,用来说明 LVS Router是master或是backup。在这个功能上也可以采用keepalived的 VRRP  功能。

--stop-daemon                停止同步守护进程 
 
-h --help                        显示帮助信息

其他的选项::                -t --tcp-service service-address  说明虚拟服务器提供的是tcp的服务[vip:port] or [real-server-ip:port]

-u --udp-service service-address   说明虚拟服务器提供的是udp的服务[vip:port] or [real-server-ip:port]

-f --fwmark-service fwmark          说明是经过iptables标记过的服务类型。

-s --scheduler scheduler               使用的调度算法,有这样几个选项 rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq。 默认的调度算法是:wlc.

-p --persistent [timeout]               持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理,timeout的默认值为300秒。

-r --real-server server-address       真实的服务器[Real-Server:port]

-g --gatewaying                            指定LVS的工作模式为直接路由模式(也是LVS默认的模式)

-i --ipip                                        指定LVS的工作模式为隧道模式

-m --masquerading                       指定LVS的工作模式为NAT模式

-w --weight weight                       真实服务器的权值

--mcast-interface interface            指定组播的同步接口 

-c --connection                              显示LVS目前的连接 。如:ipvsadm -L –,输出对应文件/proc/net/ip_conn

--timeout                                      显示tcp tcpfin udp的timeout值。如:ipvsadm -L --timeout
--daemon                                     显示同步守护进程状态
--stats                                          显示统计信息,输出对应文件/proc/net/ip_vs_stats
--rate                                           显示速率信息输出对应文件/proc/net/ip_vs_stats
--sort                                           对虚拟服务器和真实服务器排序输出
--numeric -n                                 输出IP地址和端口的数字形式


一、环境需求&安装LVS软件
环境准备:三台虚拟机
1)此环境是针对内部服务的LVS架构,如数据库,缓存,共享存储等业务。

负载均衡集群LVS
1)在安装LVS软件之前,先确定两条HTTPserver是能够正常访问的。
2)下载软件
wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
这里我们使用的2.4版本,并且注意内核是2.6版本的,如果你的版本是6.X版本的话,那么可以使用2.6版本
3)编译安装
需要创建一个软连接:ln -s /usr/src/kernels/2.6.18-238.el5-i686 /usr/src/linux
此处红色许根据自己的系统来进行定义,可以使用tab键来补齐。
tar -zxf ipvsadm-1.24.tar.gz
cd ipvsadm-1.24
make
make install
lsmod |grep ip_vs
ipvsadm --》因为此时系统还没有把ipvs模块加载进系统,需要我们 执行ipvsadm命令才会加载进去  或者modprobe ip_vs。
负载均衡集群LVS

二、手动配置LVS负载均衡器
正常工作中是不会手动配置的,也不会使用脚本配置的。最终我们是通过配置文件生效的,结合keepalived来进行部署的。
1)负载均衡器上配置VIP地址

ifconfig eth0:1 192.168.40.17 netmask 255.255.254.0

route add -host 192.168.40.17  dev eth0

2)ipvsadm添加LVS服务

负载均衡集群LVS

ipvsadm  -C                                                                                           #请用LVS原有的配置
ipvsadm -A -t 192.168.40.17:80 -s rr -p 20                                               #添加虚拟服务指定VIP
ipvsadm -a -t 192.168.40.17:80 -r 192.168.41.31:80 -g -w 10                    #针对虚拟服务添加RS节点
ipvsadm -a -t 192.168.40.17:80 -r 192.168.41.33:80 -g -w 10
ipvsadm -L -n                                                                                        #查看VIP和RS是否已经配置成功。

负载均衡集群LVS

LB上删除虚拟服务

ipvsadm -D -t 192.168.40.17:80  


三、RS节点服务器手动配置

1)添加lo端口的VIP&路由

ifconfig lo 192.168.40.17 netmask 255.255.255.255  (由于RS的VIP不是用来通讯,并且这里一定要设置24位掩码)

route add -host 192.168.40.17  dev lo

2)ARP抑制

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_announce
echo "2">/proc/sys/net/ipv4/conf/all/arp_announce

四、测试LVS是否生效
在LB上面输入命令ipvsadm -L -n就能够查看LB上面的会话分配。在前面加上watch可以动态的查看ipvsadm的会话分配。 watch ipvsadm -L -n. 

​NAT模式:

客户端同样需要配置VIP,进行ARP抑制,并且要服务器端开启内核转发功能,配置LB的DIP(内网IP地址)作为默认网关。

开启内核转发功能:
​vi /etc/sysctl  net.ipv4.ip_forword = 1

route add default gw  192.168.41.181 

Tunnel模式:


客户端需要先开启Tunnel协议支持。

/sbin/modprobe ipip
/sbin/route add –host 192.168.40.17 devtun1
echo”1”>/proc/sys/net/ipv4/conf/tun1/arp-ignore
echo”2”>/proc/sys/net/ipv4/conf/tun1/arp_announce
echo”0” >/proc/sys/net/ipv4/conf/tun1/rp_filter
echo”1” >/proc/sys/net/ipv4/conf/tun1/forwarding
echo”1” >/proc/sys/net/ipv4/conf/all/arp_ignore
echo”2” >/proc/sys/net/ipv4/conf/all/ arp_announce



一、keepalived原理介绍

1)keepalived简介

Keepalived的功能有点像是两个人互相看着一个工作,如果一个人离开岗位另外一个人就会接替,这个keepalived就是他们之间保持这样“替换机制”的工具。keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。 Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中 ,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

   Keepalived服务主要有两大用途:heartbeat(高可用)&failover(健康检测)

   Keepalived服务主要借助vrrp来完成这些工作的,以下我就来介绍下VRRP协议是怎样的工作的,那么基本上keepalived的工作原理就是如此。

2)VRRP协议(VRRP Virtual Router Redundancy Protocol,虚拟路由冗余协议)

VRRP协议过程简述:VRRP 将局域网的一组路由器(包括一个Master 即活动路由器和若干个Backup 即备份路由器)组织成一个虚拟路由器,称之为一个备份组。这个虚拟的路由器拥有自己的IP 地址10.100.10.1(这个IP 地址可以和备份组内的某个路由器的接口地址相同,相同的则称为ip拥有者),备份组内的路由器也有自己的IP 地址(如Master的IP 地址为10.100.10.2,Backup 的IP 地址为10.100.10.3)。局域网内的主机仅仅知道这个虚拟路由器的IP 地址10.100.10.1,而并不知道具体的Master 路由器的IP 地址10.100.10.2 以及Backup 路由器的IP 地址10.100.10.3。[1]它们将自己的缺省路由下一跳地址设置为该虚拟路由器的IP 地址10.100.10.1。于是,网络内的主机就通过这个虚拟的路由器来与其它网络进行通信。如果备份组内的Master 路由器坏掉,Backup 路由器将会通过选举策略选出一个新的Master 路由器,继续向网络内的主机提供路由服务。从而实现网络内的主机不间断地与外部网络进行通信。

VRRP原理:

一个VRRP路由器有唯一的标识: VRID,范围为0—255该路由器对外表现为唯一的虚拟MAC地址 ,地址的格式为00-00-5E-00-01-[VRID]主控路由器负责对ARP请求用该MAC地址做应答这样,无论如何切换,保证给终端设备的是唯一一致的IP和MAC地址,减少了切换对终端设备的影响[3]

VRRP控制报文只有一种:VRRP通告(advertisement)它使用IP多播数据包进行封装,组地址为224.0.0.18,发布范围只限于同一局域网内这保证了VRID在不同网络中可以重复使用为了减少网络带宽消耗只有主控路由器才可以周期性的发送VRRP通告报文备份路由器在连续三个通告间隔内收不到VRRP或收到优先级为0的通告后启动新的一轮VRRP选举[3]

在VRRP路由器组中,按优先级选举主控路由器,VRRP协议中优先级范围是0—255若VRRP路由器的IP地址和虚拟路由器的接口IP地址相同,则称该虚拟路由器作VRRP组中的IP地址所有者;IP地址所有者自动具有最高优先级:255优先级0一般用在IP地址所有者主动放弃主控者角色时使用可配置的优先级范围为1—254优先级的配置原则可以依据链路的速度和成本路由器性能和可靠性以及其它管理策略设定主控路由器的选举中,高优先级的虚拟路由器获胜,因此,如果在VRRP组中有IP地址所有者,则它总是作为主控路由的角色出现对于相同优先级的候选路由器,按照IP地址大小顺序选举VRRP还提供了优先级抢占策略,如果配置了该策略,高优先级的备份路由器便会剥夺当前低优先级的主控路由器而成为新的主控路由器[3]

为了保证VRRP协议的安全性,提供了两种安全认证措施:明文认证和IP头认证明文认证方式要求:在加入一个VRRP路由器组时,必须同时提供相同的VRID和明文密码适合于避免在局域网内的配置错误,但不能防止通过网络监听方式获得密码IP头认证的方式提供了更高的安全性,能够防止报文重放和修改等攻击。

二、部署keepalived作为web服务器的HA
1)部署两台apache web服务器

yum install httpd -y 

/etc/init.d/httpd start


2)分别安装keepalived软件

#下载安装
wget http://www.keepalived.org/software/keepalived-1.2.8.tar.gz
tar -zxf keepalived-1.2.8.tar.gz
cd keepalived-1.2.8
ll
./configure --prefix=/usr/local/keepalived
make
make install

#配置keepalived的自启动&拷贝keepalived的执行程序

cp /usr/local/keepalive/sbin/keepalived/ /usr/sbin/
cp cp /usr/local/keepalived/sbin/keepalived /usr/sbin//usr/local/keepalived/sbin/keepalived
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

3)编辑主web和备web的keepalived配置文件

主web服务器的配置文件

[root@localhost keepalived-1.2.8]# cat /etc/keepalived.conf  

! Configuration File for keepalived
global_defs {
  notification_email {  #设置报警邮件地址,可多行每行一个。
  752119102@qq.com
   }
  notification_email_from keepalived@localhost  #设置邮件的发送地址
  smtp_server 127.0.0.1                         #设置SMTP server地址
  smtp_connect_timeout 30                       #设置SMTP 超时时间
  router_id LVS_DEVEL                           #运行keepalived机器的一个标识
}
vrrp_instance VI_1 {                      #定义一个vrrp实例,不同实例的实例编号不一样。
   state MASTER        #定义在keepalived的角色MASTER表示为主服务器,BACKUP为备服务器。
   interface eth0      #指定HA检测的网络接口
   virtual_router_id 51     #虚拟路由标示,同一个实例里的路由标示相同,且唯一。MASTER和BACKUP的路由标识一样,且唯一。
    priority 100        #定义此服务器在此虚拟路由器中的优先级,优先级大权限高
   advert_int 1        #检测时间间隔
   authentication {    #设置验证类型和密码,主从的密码必须相同,要不两者不通讯。
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {     #设置虚拟IP地址,可以设置多个虚拟IP地址。
       192.168.41.249
   }
}

备web服务器的配置文件

[root@localhost ~]# cat /etc/keepalived.conf

! Configuration File for keepalived
global_defs {
  notification_email {
  752119102@qq.com
   }
  notification_email_from keepalive@localhost
  smtp_server 127.0.0.1
  smtp_connect_timeout 30
  router_id LVS_DEVEL
}
vrrp_instance VI_1 {
   state BACKUP
   interface eth0
   virtual_router_id 51
   priority 50
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
       192.168.41.249
   }
}


启动keepalived服务
/etc/init.d/keepalived start
/etc/init.d/keepalived stop


4)查看keepalived日志信息
主web服务器

负载均衡集群LVS
备web服务器日志
负载均衡集群LVS

当主web服务器的keepalived停掉后,及主keepalived重新启动时的日志:
负载均衡集群LVS

并且通过tcpdump vrrp能够看到两者之间的通讯

负载均衡集群LVS
三、脚本实现监控httpd服务
目前keepalived能够实现当我们的主web宕机或者网络出现故障时进行切换,但如果仅是httpd进程出现故障,所以我们就需要写一点实时监控httpd进程状态的脚本,即如果进程出现问题我们就进行切换。
脚本内容:
#!/bin/bash
#       
while true
do
       httpdpid=`ps -C httpd  --no-heading  |wc -l`
       if [ $httpdpid -eq 0 ];then
               /etc/init.d/httpd  start
               sleep 5
               httpdpid=`ps -C httpd  --no-heading  |wc -l`
               if [ $httpdpid -eq 0 ];then
                       /etc/init.d/keepalive stop
               fi
       fi
       sleep 5
done

即当我们的httpd进程被停止了,并且无法重启我们会将keepalived进行停止,让备web服务器进行接管,成为主WEB服务器提供服务。

到此我们已经能够轻松的部署keepalived让它作为web服务器的HA.

负载均衡集群LVS

服务器规划:

负载均衡集群LVS


二、配置keepalived实现负载均衡&高可用

1)安装keepalived软件
wget http://www.keepalived.org/software/keepalived-1.2.8.tar.gz
tar -zxf keepalived-1.2.8.tar.gz
cd keepalived-1.2.8
./configure --prefix=/usr/local/keepalived
make
make install

#配置keepalived的自启动&拷贝keepalived的执行程序

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

#开启内核的转发功能

vi /etc/sysctl  net.ipv4.ip_forword = 1

2)配置LVS-DR-MASK的keepalived.conf配置文件

! Configuration File for keepalived


global_defs {
  notification_email {
    752119102@qq.com            #设置报警邮箱,一般不再这做,而是用其他方式报警。
  }
  notification_email_from keepalived@localhost   #设定发送邮件地址
  smtp_server 127.0.0.1                          #设定发送邮件服务器
  smtp_connect_timeout 30                        #设定SMTP连接超时时间
  router_id LVS_DEVEL          #查阅说明文档得知route_id配置是为了标识当前节点,我将其设置为NodeA。当然两个节点的此项设置可相同,也可不相同。
}


vrrp_instance VI_1 {                        #定义虚拟路由实例,不同实例ID不同。
    state MASTER                           #定义服务器在keepalived中的角色主服务器
   interface eth0                          #定义进行检测的端口eth0
   virtual_router_id 51               #定义虚拟路由ID,同一个实例的主从一样。
    priority 100                      #定义在虚拟路由器组的权限,越大越高
   advert_int 1                       #定义检测时间间隔
   authentication {                   #定义认证方式密码,主从必须一样
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {                #指定虚拟IP地址
       192.168.41.249
   }
}
virtual_server 192.168.41.249 80 {  #定义虚拟服务,需指定IP地址和端口,空格隔开。
   delay_loop 6                           #定义RS运行情况监测时间间隔
   lb_algo rr                               #定义负载调度算法
   lb_kind DR                             #定义LVS的工作模式
   nat_mask 255.255.255.0            #定义虚拟服务的mask
   persistence_timeout 50            #定义会话保持时间,S为单位
   protocol TCP                      #指定转发协议
   real_server 192.168.41.31 80 {    #定义真实服务器IP地址和端口
       weight 1                      #定义RS的权重
       TCP_CHECK{                    #RS server健康检查部分
       connect_timeout 10            #定义超出10s连接超时
       nb_get_retry 3                #定义重试次数
       delay_before_retry 3          #定义重试时间间隔
       connect_port 80               #定义健康检查端口
   }
   real_server 192.168.41.33 80 {    
       weight 1
       TCP_CHECK{                  
       connect_timeout 10      
       nb_get_retry 3              
       delay_before_retry 3        
       connect_port 80              
   }
}

3)配置LVS-DR-BACKUP的keepalived.conf配置文件

! Configuration File for keepalived


global_defs {
  notification_email {
    752119102@qq.com            #设置报警邮箱,一般不再这做,而是用其他方式报警。
  }
  notification_email_from keepalived@localhost   #设定发送邮件地址
  smtp_server 127.0.0.1                          #设定发送邮件服务器
  smtp_connect_timeout 30                        #设定SMTP连接超时时间
  router_id LVS_DEVEL            #负载均衡器标示,在局域网内是唯一的
}
vrrp_instance VI_1 {                        #定义虚拟路由实例,不同实例ID不同。
    state BACKUP                           #定义服务器在keepalived中的角色
   interface eth0                          #定义进行检测的端口eth0
   virtual_router_id 51               #定义虚拟路由ID,同一个实例的主从一样。
    priority 50                       #定义在虚拟路由器组的权限,越大越高
   advert_int 1                       #定义检测时间间隔
   authentication {                   #定义认证方式密码,主从必须一样
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {                #指定虚拟IP地址
       192.168.41.249
   }
}
virtual_server 192.168.41.249 80 {  #定义虚拟服务,需指定IP地址和端口,空格隔开。
   delay_loop 6                      #定义RS运行情况监测时间间隔
   lb_algo rr                        #定义负载调度算法
   lb_kind DR                      #定义LVS的工作模式
   nat_mask 255.255.255.0            #定义虚拟服务的mask
   persistence_timeout 50            #定义会话保持时间,S为单位
   protocol TCP                      #指定转发协议
   real_server 192.168.41.31 80 {    #定义真实服务器IP地址和端口
       weight 1                      #定义RS的权重
       TCP_CHECK{                    #RS server健康检查部分
       connect_timeout 10            #定义超出10s连接超时
       nb_get_retry 3                #定义重试次数
       delay_before_retry 3          #定义重试时间间隔
       connect_port 80               #定义健康检查端口
   }
   real_server 192.168.41.33 80 {    
        weight 1
       TCP_CHECK{                  
       connect_timeout 10      
       nb_get_retry 3              
       delay_before_retry 3        
       connect_port 80              
   }


说明:这里主LVS-DR-MASTER和LVS-DR-BACKUP之间的配置的差别就只有红色部分:HA的角色(MASTER,BACKUP)和优先级不同,还有router_id。

4)客户端配置LVS参数
客户端需要做的工作就是绑定我们的VIP在lo口,并且进行ARP抑制,之前的文章已经提过此方法咯。现在我们就换成将配置写成脚本来执行。
脚本内容:

[root@RS2 ~]# cat lvs-client.sh
#!/bin/bask
#       
#
. /etc/rc.d/init.d/functions


VIP=(
192.168.41.249
)


function start(){
  for ((i=0;i<`echo ${#VIP[*]}`;i++))
      do
       echo ${i}  ${VIP[$i]}
       ifconfig lo:${i} ${VIP[$i]} netmask 255.255.255.255 up
       route add -host ${VIP[$i]} dev lo
       done
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_announce
echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
}


function  stop(){
  for ((i=0;i<${#VIP[*]};i++))
      do
       echo ${i}  ${VIP[$i]}
       ifconfig lo:${i} ${VIP[$i]} netmask 255.255.255.255 up
       route del -host ${VIP[$i]} dev lo:${i}
       done
}
case "$1" in
   start)
       start
       exit
       ;;
   stop)
       stop
       exit
       ;;
   *)
       echo "You must use $0:stop|start"
       ;;
esac